以下网址在iOS 8.3和更低版本上打开,但在iOS 9和更高版本上不起作用
let instagramURL = NSURL(string: "instagram://app")
为什么URL无法打开?
以下网址在iOS 8.3和更低版本上打开,但在iOS 9和更高版本上不起作用
let instagramURL = NSURL(string: "instagram://app")
为什么URL无法打开?
Answers:
iOS 9对URL方案的处理进行了小的更改。您必须将您的应用程序调用的网址列入白名单,以使用中的LSApplicationQueriesSchemes
密钥Info.plist
。
请在此处查看帖子:http : //awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes
主要结论是:
如果您对不在白名单中的URL调用“ canOpenURL”方法,则即使安装了已注册用于处理此方案的应用程序,该方法也会返回“ NO”。将会出现“此应用程序不允许查询方案xxx”的系统日志条目。
如果您对不在白名单中的URL调用“ openURL”方法,则该方法将自动失败。将会出现“此应用程序不允许查询方案xxx”的系统日志条目。
作者还推测这是操作系统的错误,Apple会在后续版本中修复此错误。
-openURL:
即使-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>
*前三场比赛的Facebook(FBSDK 4.6):fbapi,fbauth2,fbshareextension。“ Ha”是指手套
Ha://add/[username]
迅速添加朋友们的表情3
这是iOS 9的一项新安全功能。有关更多信息,请观看WWDC 2015 Session 703。
使用SDK 9构建的任何应用都需要LSApplicationQueriesSchemes
在其plist文件中提供一个条目,以声明其尝试查询的方案。
<key>LSApplicationQueriesSchemes</key>
<array>
<string>urlscheme</string>
<string>urlscheme2</string>
<string>urlscheme3</string>
<string>urlscheme4</string>
</array>
openURL:
。它会告诉您打开是否成功。
假设有两个应用程序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
从2015年的703会议WWDC:
在为iOS 9构建应用程序时,您可以继续使用URL方案,并且要调用URL方案,现在需要在应用程序Info.plist中声明它们。有一个新密钥,
LSApplicationQueriesSchemes
在这里您将需要添加canOpenURL所在的方案列表。
即使使用@Matthieu答案,Facebook在共享对话框中的共享也会失败(对于其余社交URL而言100%正确)。我必须添加从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>
在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文件是
那么,您可以直接致电openURL:
或openURL:options:completionHandler:
(从iOS 10开始)打开应用程序,而无需进行条件检查canOpenURL:
。请阅读讨论部分在苹果文档的canOpenURL:方法其中说:
openURL:方法不受
LSApplicationQueriesSchemes
要求的限制。
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>
+canOpenURL:
回报?