iOS 9 无法使用 URL SCHEME 打开 Instagram 应用

Posted

技术标签:

【中文标题】iOS 9 无法使用 URL SCHEME 打开 Instagram 应用【英文标题】:iOS 9 not opening Instagram app with URL SCHEME 【发布时间】:2015-09-08 09:05:36 【问题描述】:

以下 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 【参考方案1】:

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 中所述【参考方案2】:

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

<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【参考方案3】:

这是 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 中添加什么?【参考方案4】:

假设有两个应用 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”吗?【参考方案5】:

来自 2015 年 WWDC 703 会议:

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

【讨论】:

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

即使有@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>

【讨论】:

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

在 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 文件是

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

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

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

【讨论】:

【参考方案10】:

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

myemail://mailto?bob@gmail.com

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

【讨论】:

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

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

【讨论】:

【参考方案12】:

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

参考这个link

【讨论】:

【参考方案13】:

斯威夫特 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>

【讨论】:

【参考方案14】:

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

【讨论】:

以上是关于iOS 9 无法使用 URL SCHEME 打开 Instagram 应用的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 iOS 应用程序中的 Url Scheme 从 Web URL 打开 Microsoft PowerPoint iPad 应用程序中的 PowerPoint 演示文稿

第一次使用Url scheme时App中iOS自定义Url Scheme打不开

IOS之URL Scheme的使用

通过 URL Scheme 或其他方式打开 iOS 11 Files 应用程序

如何找出iOS App的URL Scheme

React Native之配置URL Scheme(iOS Android)