以下URL在iOS 8.3及更低版本上打开,但它不起作用且iOS 9
let instagramURL = NSURL(string: "instagram://app")
为什么不打开网址?
答案 0 :(得分:205)
iOS 9对URL方案的处理做了一些小改动。您必须使用LSApplicationQueriesSchemes
中的Info.plist
密钥将您的应用发出的网址列入白名单。
请在此处查看帖子:http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes
主要结论是:
如果您对不在白名单中的网址调用“canOpenURL”方法,即使安装了已注册处理此方案的应用,也会返回“否”。将出现“此应用程序不允许查询方案xxx”syslog条目。
如果您对不在白名单中的网址调用“openURL”方法,则会以静默方式失败。将出现“此应用程序不允许查询方案xxx”syslog条目。
作者还推测这是操作系统的一个错误,Apple将在后续版本中修复此问题。
答案 1 :(得分:148)
如上所述,您想在信息plist中添加一个键,这里是大多数社交网络的列表
t = {
['a'] = 'xxx',
['b'] = 'xxx',
['c'] = 'xxx',
['d'] = 'xxx',
['e'] = 'xxx',
}
for key, val in orderedPairs(t) do
print(key.." : "..val)
end
* 第3场比赛Facebook(FBSDK 4.6):fbapi,fbauth2,fbshareextension。 "哈"是为了Snapchat
答案 2 :(得分:86)
这是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>
答案 3 :(得分:25)
假设有两个应用程序TestA和TestB。 TestB想要查询是否安装了TestA。 &#34;种皮&#34;在info.plist文件中定义以下URL方案:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>testA</string>
</array>
</dict>
</array>
第二个应用程序&#34; TestB&#34;试图找出是否&#34; TestA&#34;通过调用安装:
[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"TestA://"]];
但这通常会在iOS9中返回NO,因为&#34; TestA&#34;需要添加到TestB的info.plist文件中的LSApplicationQueriesSchemes条目。这是通过将以下代码添加到TestB的info.plist文件来完成的:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>TestA</string>
</array>
可在此处找到有效的实施方案: https://github.com/gatzsche/LSApplicationQueriesSchemes-Working-Example
答案 4 :(得分:21)
来自,会议703 WWDC 2015:
您可以在为iOS 9构建应用时继续使用网址方案 并且您想调用URL方案,现在需要声明它们 你的应用Info.plist。有一个新密钥
LSApplicationQueriesSchemes
, 在这里,您需要添加您想要的方案列表 canOpenURL on。
答案 5 :(得分:2)
即使使用@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>
答案 6 :(得分:1)
重要的是要注意,9.0.x上的越狱手机有一个错误,它破坏了网址方案。如果您正在运行越狱设备,请确保在Cydia中更新Patcyh
答案 7 :(得分:1)
您可以直接致电openURL:
或openURL:options:completionHandler:
(iOS 10以后)打开应用,而无需进行条件检查canOpenURL:
。
请阅读Apple doc for canOpenURL: method中的讨论部分,其中包含:
openURL:方法不受
LSApplicationQueriesSchemes
要求的限制。
答案 8 :(得分:1)
在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 文件为
答案 9 :(得分:0)
似乎没有人解决过如何指定带有嵌入参数的网址。任何包含参数的URL都无法在LSApplicationsQueriesSchemes中指定特定的URL。例如,假设我有一个通过发件人电子邮件地址的电子邮件应用程序:
myemail://mailto?bob@gmail.com
它似乎让它在iOS9中工作的唯一方法是删除任何参数。
答案 10 :(得分:0)
Apple在iOS 9上更改了canOpenURL方法。在iOS 9和iOS 10上检查URL Schemes的应用程序必须在提交给Apple时声明这些方案。
答案 11 :(得分:0)
答案 12 :(得分:0)
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>
答案 13 :(得分:-1)
当我今天尝试从我自己的应用程序调用Facebook时,我发现没有LSApplicationQueriesSchemes
密钥可以添加到Info.plist
(Xcode版本8.2.1(8C1002))。我用 Sublime Text 打开Info.plist
并手动将其添加到文件中,然后就可以了。只是为了让您知道,如果您找不到钥匙,只需自己添加即可。