下面的 URL 在 iOS8.3及更低版本上打开,但是它在 iOS9上不能工作
let instagramURL = NSURL(string: "instagram://app")
为什么网址打不开?
这是 iOS9的一个新的安全特性。更多信息请看 WWDC 2015年第703届会议。
任何使用 SDK9构建的应用程序都需要在其 plist 文件中提供一个 LSApplicationQueriesSchemes条目,声明它试图查询的方案。
LSApplicationQueriesSchemes
<key>LSApplicationQueriesSchemes</key> <array> <string>urlscheme</string> <string>urlscheme2</string> <string>urlscheme3</string> <string>urlscheme4</string> </array>
IOS9对 URL 方案的处理做了一个小小的改变。你必须白名单的网址,您的应用程序将调用到使用 LSApplicationQueriesSchemes键在您的 Info.plist。
Info.plist
请看这里的帖子: http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes
主要结论是:
如果您对不在您的白名单中的 URL 调用“ canOpenURL”方法,它将返回“ NO”,即使安装了一个已注册处理此方案的应用程序。一个“此应用程序不允许查询的方案 xxx”syslog 条目将出现。 如果对不在白名单中的 URL 调用“ openURL”方法,它将无声无息地失败。一个“此应用程序不允许查询的方案 xxx”syslog 条目将出现。
如果您对不在您的白名单中的 URL 调用“ canOpenURL”方法,它将返回“ NO”,即使安装了一个已注册处理此方案的应用程序。一个“此应用程序不允许查询的方案 xxx”syslog 条目将出现。
如果对不在白名单中的 URL 调用“ openURL”方法,它将无声无息地失败。一个“此应用程序不允许查询的方案 xxx”syslog 条目将出现。
作者还推测这是操作系统的一个 bug,苹果将在随后的版本中修复这个问题。
假设有两个应用程序 TestA 和 TestB。TestB 希望查询是否安装了 TestA。“ TestA”在其 info.plist 文件中定义了以下 URL 模式:
<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>testA</string> </array> </dict> </array>
第二个应用程序“ TestB”试图通过调用:
[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"TestA://"]];
但是在 iOS9中这通常会返回 NO,因为需要将“ TestA”添加到 TestB 的 info.plist 文件中的 LSApplicationQueriesScheme 条目中。这是通过将以下代码添加到 TestB 的 info.plist 文件来完成的:
<key>LSApplicationQueriesSchemes</key> <array> <string>TestA</string> </array>
可以在这里找到一个可行的实施方案: Https://github.com/gatzsche/lsapplicationqueriesschemes-working-example
似乎没有人解决过如何使用嵌入参数指定 URL 的问题。任何包含参数的 URL 都不可能在 LSApplicationsQueriesScheme 中指定特定的 URL。例如,假设我有一个电子邮件应用程序,传递发件人的电子邮件地址:
myemail://mailto?bob@gmail.com
让它在 iOS9中工作的唯一方法似乎是删除任何参数。
2015年世界自然基金会第703届会议:
在为 iOS9构建应用程序时,您可以继续使用 URL 方案 如果您想调用 URL 方案,现在需要在 你的应用程序 Info.plist 有一个新的密钥 LSApplicationQueriesSchemes, 在这里,您需要添加您想要的方案列表 上的 canOpenURL。
如上所述,你想在信息列表中添加一个键,这里是大多数社交网络的列表
<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,fbshare 扩展
即使有@Matthieu 的回答(对于其他的社交网站来说,这是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>
值得注意的是,在9.0. x 上有一个破解手机的 bug,它破坏了 URL 方案。如果你正在运行一个越狱设备,那么一定要更新 Cydia 的 Patcyh
你可以通过直接调用 openURL:或者 openURL:options:completionHandler:(iOS10以上版本)来打开一个应用程序,而不需要进行条件检查 canOpenURL:。 请阅读 用于 canOpenURL 的苹果文档: 方法中的 讨论部分,上面写着:
openURL:
openURL:options:completionHandler:
canOpenURL:
OpenURL: 方法不受 LSApplicationQueriesSchemes要求的约束。
当我今天试图从我自己的应用程序中拨打 Facebook 时,我发现没有一个 LSApplicationQueriesSchemes密钥可以添加到 Info.plist(Xcode Version 8.2.1(8C1002))。我用 崇高的文字打开 Info.plist并手动将其添加到文件中,然后它工作了。只是想让你知道,如果你找不到钥匙,只需要添加它自己。
苹果在 iOS9上改变了 canOpenURL 方法。正在检查 iOS9和 iOS10网址方案的应用程序在提交给苹果时必须声明这些方案。
对于 PayPal,添加以下 URL 方案:
参考此 链接
Swift 3.1 Swift 3.2 Swift 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>
在 Swift 4.2和 Xcode 10.1中
在 info.plist 中需要添加 CFBundleURLScheme 和 LSApplicationQueriesScheme。
在项目中选择 info.plist,
- > 右击,
- > 选择 打开 A 源代码
请看下面的屏幕截图
将打开 xml 文件
- > 在代码和 换上你的身份证下面复制-粘贴
用于 gmail,fb,twitter 和 link 的 CFBundleURLScheme 和 LSApplicationQueriesScheme。
<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文件是