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 文件中 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.plist
的 LSApplicationQueriesSchemes
密钥(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打不开