【问题标题】:iOS 9 not opening Instagram app with URL SCHEMEiOS 9 无法使用 URL SCHEME 打开 Instagram 应用
【发布时间】:2015-11-03 09:02:18
【问题描述】:

以下 URL 在 iOS 8.3 及更低版本上打开,但在 iOS 9 上不起作用

let instagramURL = NSURL(string: "instagram://app")

为什么网址打不开?

【问题讨论】:

  • +canOpenURL: 返回什么?
  • 您遇到什么错误?这不是关于xcode 的问题。
  • “if UIApplication.sharedApplication().canOpenURL(instagramURL!)”检查失败
  • 请在此处查看文章:awkwardhare.com/post/121196006730/… 在 iOS 9 中,您必须指定您的应用正在寻找的 url 方案(我自己没有这样做)
  • 将此添加到您的 info.plist 文件中 LSApplicationQueriesSchemesURLScma1URLScma2URLScma3

标签: ios swift xcode cocoa-touch ios9


【解决方案1】:

如上所述,您想在 info plist 中添加一个键,这里是大多数社交网络的列表

<key>LSApplicationQueriesSchemes</key>
    <array>
     <string>fb</string>
     <string>fbapi</string>
     <string>fbauth2</string>
     <string>fbshareextension</string>
     <string>fb-messenger-api</string>
     <string>twitter</string>
     <string>viber</string>
     <string>whatsapp</string>
     <string>wechat</string>
     <string>line</string>
     <string>instagram</string>
     <string> instagram-stories</string>
     <string>kakaotalk</string>
     <string>mqq</string>
     <string>vk</string>
     <string>comgooglemaps</string>
     <string>googlephotos</string>
     <string>ha</string>
     <string>yammer</string>
    </array>

* 前 3 个匹配 Facebook(FBSDK 4.6):fbapi、fbauth2、fbshareextension。 “哈”是用来聊天的

【讨论】:

  • 谢谢,我觉得 v 需要在列表中添加“fb”
  • @sivakrishna fb 这里没有提到developers.facebook.com/docs/ios/ios9
  • 但如果我想重定向到任何 Facebook 页面,例如“facebook.com/....",After 添加 fb 仅它的 wrkng
  • 差不多好了。在 2015 年 10 月,我遇到了一些来自 Facebook 共享对话框的奇怪 URL 的失败。我将它们添加为答案,请随时将其添加到您的答案中,这确实是正确的。
  • Ha://add/[username]在swift 3中添加好友snapchat
【解决方案2】:

在 Swift 4.2 和 Xcode 10.1 中

在info.plist中需要添加CFBundleURLSchemes和LSApplicationQueriesSchemes。

--> 在你的项目中选择info.plist,

--> 右键,

--> 选择打开方式 源代码

看下面的截图

--> xml文件将被打开

--> 复制 - 粘贴下面的代码并替换为您的 ID

用于 gmail、fb、twitter 和链接的 CFBundleURLSchemes 和 LSApplicationQueriesSchemes。

<key>CFBundleURLTypes</key>
    <array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>li5****5</string>
            <string>com.googleusercontent.apps.8***************5f</string>
            <string>fb8***********3</string>
            <string>twitterkit-s***************w</string>
        </array>
    </dict>
</array>
<key>FacebookAppID</key>
<string>8*********3</string>
<key>FacebookDisplayName</key>
<string>K************ app</string>
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>fbapi</string>
    <string>fb-messenger-share-api</string>
    <string>fbauth2</string>
    <string>fbshareextension</string>

    <string>twitter</string>
    <string>twitterauth</string>

    <string>linkedin</string>
    <string>linkedin-sdk2</string>
    <string>linkedin-sdk</string>

</array>

请参阅下面的屏幕,您的最终 info.plist 文件是

【讨论】:

    【解决方案3】:

    斯威夫特 3.1、斯威夫特 3.2、斯威夫特 4

    if let urlFromStr = URL(string: "instagram://app") {
        if UIApplication.shared.canOpenURL(urlFromStr) {
            if #available(iOS 10.0, *) {
                UIApplication.shared.open(urlFromStr, options: [:], completionHandler: nil)
            } else {
                UIApplication.shared.openURL(urlFromStr)
            }
        }
    }
    

    在 Info.plist 中添加这些:

    <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>instagram</string>
    </array>
    

    【讨论】:

      【解决方案4】:

      对于 PayPal,请添加以下 URL 方案:

      参考这个link

      【讨论】:

        【解决方案5】:

        Apple 更改了 iOS 9 上的 canOpenURL 方法。在 iOS 9 和 iOS 10 上检查 URL 方案的应用程序必须在提交给 Apple 时声明这些方案。

        【讨论】:

          【解决方案6】:

          当我今天尝试从自己的应用程序调用 Facebook 时,我发现没有可以添加到 Info.plistLSApplicationQueriesSchemes 密钥(Xcode 版本 8.2.1 (8C1002))。我用 Sublime Text 打开了Info.plist 并手动将其添加到文件中,然后它就可以工作了。只是为了让您知道,如果您找不到密钥,只需自己添加即可。

          【讨论】:

            【解决方案7】:

            您可以通过直接调用openURL:openURL:options:completionHandler:(iOS 10 及更高版本)打开应用程序,而无需进行条件检查canOpenURL:。 请阅读Apple doc for canOpenURL: method 中的讨论部分

            openURL: 方法不受LSApplicationQueriesSchemes 要求的约束。

            【讨论】:

              【解决方案8】:

              假设有两个应用 TestA 和 TestB。 TestB 想查询是否安装了 TestA。 “TestA”在其 info.plist 文件中定义了以下 URL 方案:

              <key>CFBundleURLTypes</key>
              <array>
                  <dict>
                      <key>CFBundleURLSchemes</key>
                      <array>
                          <string>testA</string>
                      </array>
                  </dict>
              </array>
              

              第二个应用“TestB”尝试通过调用来确定“TestA”是否安装:

              [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"TestA://"]];
              

              但这通常会在 iOS9 中返回 NO,因为需要将“TestA”添加到 TestB 的 info.plist 文件中的 LSApplicationQueriesSchemes 条目中。这是通过将以下代码添加到 TestB 的 info.plist 文件来完成的:

              <key>LSApplicationQueriesSchemes</key>
              <array>
                  <string>TestA</string>
              </array>
              

              可以在此处找到有效的实现: https://github.com/gatzsche/LSApplicationQueriesSchemes-Working-Example

              【讨论】:

              • 等等,TestB应用的into.plist中LSApplicationQueriesSchemes键的字符串值不应该是“testA”吗?
              【解决方案9】:

              似乎没有人解决如何使用嵌入参数指定 URL。任何包含参数的 URL 都无法在 LSApplicationsQueriesSchemes 中指定特定的 URL。例如,假设我有一个电子邮件应用程序可以传递发件人的电子邮件地址:

              myemail://mailto?bob@gmail.com
              

              似乎让它在 iOS9 中工作的唯一方法是删除任何参数。

              【讨论】:

              • 嗯?您应该在 plist 中添加的内容是 myemail。参数在这里不起作用。
              • @LeoNatan the subject as in subject="yes you can"
              【解决方案10】:

              请务必注意,9.0.x 上的越狱手机存在一个错误,它破坏了 url 方案。如果您运行的是越狱设备,请确保在 Cydia 中更新 Patcyh

              【讨论】:

                【解决方案11】:

                即使有@Matthieu 的回答(对于其余社交 URL,100% 正确),从分享对话框分享 Facebook 也会失败。我必须添加一组从 Facebook SDK 反转过来的 URL。

                <array>
                        <string>fbapi</string>
                        <string>fbauth2</string>
                        <string>fbshareextension</string>
                        <string>fb-messenger-api</string>
                        <string>twitter</string>
                        <string>whatsapp</string>
                        <string>wechat</string>
                        <string>line</string>
                        <string>instagram</string>
                        <string>kakaotalk</string>
                        <string>mqq</string>
                        <string>vk</string>
                        <string>comgooglemaps</string>
                        <string>fbapi20130214</string>                                                    
                        <string>fbapi20130410</string>                                                     
                        <string>fbapi20130702</string>                                                    
                        <string>fbapi20131010</string>                                                    
                        <string>fbapi20131219</string>                                                    
                        <string>fbapi20140410</string>                                                     
                        <string>fbapi20140116</string>                                                     
                        <string>fbapi20150313</string>                                                     
                        <string>fbapi20150629</string>
                    </array>
                

                【讨论】:

                • 您知道我可以使用哪个应用程序来查看文档吗?您可以提供代码吗?
                【解决方案12】:

                来自 2015 年 WWDC 703 会议:

                在为 iOS 9 构建应用时,您可以继续使用 URL 方案 并且您想调用 URL 方案,您现在需要在 您的应用程序 Info.plist。有一个新密钥,LSApplicationQueriesSchemes, 在这里你需要添加你想要的方案列表 可以打开URL。

                【讨论】:

                • 是的,不是这样。即使使用 info.plist,它仍然无法使用 comgooglemaps
                • 你找到解决办法了吗?
                • 一张图片值1000字。感谢您的屏幕截图。这就是我所需要的。
                【解决方案13】:

                iOS 9 对 URL 方案的处理做了一个小改动。您必须将您的应用使用 Info.plist 中的 LSApplicationQueriesSchemes 键调用的 URL 列入白名单。

                请在此处查看帖子:http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes

                主要结论是:

                如果您对不在白名单中的 URL 调用“canOpenURL”方法,它将返回“NO”,即使安装了已注册处理此方案的应用程序也是如此。将出现“此应用不允许查询方案 xxx”的 syslog 条目。

                如果您对不在白名单中的 URL 调用“openURL”方法,它将静默失败。将出现“此应用不允许查询方案 xxx”的 syslog 条目。

                作者还推测这是操作系统的错误,Apple 将在后续版本中修复此问题。

                【讨论】:

                • 澄清一点,不要在要在 LSApplicationQueriesSchemes 数组中列入白名单的特定应用的字符串中包含“://”,即“comgooglemaps://”。如果您确实包含“://”canOpenUrl: 将返回 NO 并提供“此应用不允许查询方案 xxx”系统日志/错误。但是,当您实际调用 canOpenUrl: 时,您仍然必须包含冒号,即 canOpenUrl:@"comgooglemaps:"。
                • 事实上,Apple 确实在最近的更新中修复了这个问题。 -openURL: 始终有效,即使 -canOpenURL: 受到限制。
                • 这有什么意义?如果我可以只列出 plist 中的所有内容并仍然查询它,那么安全性在哪里?
                • @MaciejSwic 原因之一是您必须重新提交给 Apple 才能更改列表。
                • 请注意,所有这些仅与针对 iOS SDK 9 编译的应用程序有关。 “如果您不使用 iOS SDK 9.0 重新编译,您的应用程序将被限制为 50 个不同的方案(调用 canOpenURL 之后返回 NO)”,如 developers.facebook.com/docs/ios/ios9 中所述
                【解决方案14】:

                这是 iOS 9 的一项新安全功能。请关注WWDC 2015 Session 703 了解更多信息。

                使用 SDK 9 构建的任何应用都需要在其 plist 文件中提供 LSApplicationQueriesSchemes 条目,声明它尝试查询的方案。

                <key>LSApplicationQueriesSchemes</key>
                <array>
                 <string>urlscheme</string>
                 <string>urlscheme2</string>
                 <string>urlscheme3</string>
                 <string>urlscheme4</string>
                </array> 
                

                【讨论】:

                • 把事情说清楚。这会排除那些让用户输入自己的 URL 方案 + 执行的应用程序吗?
                • @Jonny 不,因为您仍然可以尝试使用openURL: 打开任何 URL。它会告诉你打开是否成功。
                • 是的,但是 canOpenURL 不能用,所以我们不能告诉用户它是否有效,他只能自己尝试。
                • 我想打开 google maps 我必须在 urlscheme 中添加什么?
                猜你喜欢
                • 1970-01-01
                • 2015-10-26
                • 1970-01-01
                • 2015-12-18
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多