iOS 9不能使用URL SCHEME打开Instagram应用程序
以下URL在iOS 8.3及更低版本上打开,但不起作用,并且不起作用
let instagramURL = NSURL(string: "instagram://app")
为什么URL不能打开?
iOS 9对URLscheme的处理做了一点改动。 您必须将您的应用程序调用的url列入白名单,以使用Info.plist
的LSApplicationQueriesSchemes
项。
请在这里看到post: http : //awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes
主要结论是:
如果您对不在白名单中的url调用“canOpenURL”方法,即使已安装了已注册的应用程序来处理此scheme,也会返回“NO”。 A“这个程序是不允许查询计划xxx”系统日志条目将出现。
如果您对不在白名单中的URL调用“openURL”方法,则会失败。 A“这个程序是不允许查询计划xxx”系统日志条目将出现。
作者还推测,这是一个操作系统的错误,苹果公司将在后续版本中修复这个问题。
如上所述,你想添加一个关键信息plist,这里是大多数社交networking的列表
<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>kakaotalk</string> <string>mqq</string> <string>vk</string> <string>comgooglemaps</string> <string>googlephotos</string> <string>ha</string> </array>
*前3场比赛Facebook(FBSDK 4.6):fbapi,fbauth2,fbshareextension。 “哈”是用于snapchat
这是iOS 9的一项新的安全function。有关更多信息,请参阅WWDC 2015 Session 703 。
任何使用SDK 9构build的应用程序都需要在其plist文件中提供一个LSApplicationQueriesSchemes
条目,声明它尝试查询哪些scheme。
<key>LSApplicationQueriesSchemes</key> <array> <string>urlscheme</string> <string>urlscheme2</string> <string>urlscheme3</string> <string>urlscheme4</string> </array>
假设两个应用程序TestA和TestB。 TestB想要查询是否安装了TestA。 “TestA”在其info.plist文件中定义了以下URLscheme:
<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>
一个工作实现可以在这里find: https : //github.com/gatzsche/LSApplicationQueriesSchemes-Working-Example
From,Session 703 WWDC 2015:
您可以在为iOS 9构build应用程序时继续使用URLscheme,并且想要调用URLscheme,则现在需要在您的应用程序Info.plist中声明它们。 有一个新的关键,
LSApplicationQueriesSchemes
,在这里你需要添加你想要canOpenURL的scheme列表。
即使通过@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>
需要注意的是,9.0.x版本的越狱手机存在一个bug,这个bug破坏了urlscheme。 如果您运行的是越狱设备,请确保您更新Cydia中的Patcyh
那么你可以通过调用openURL:
或openURL:options:completionHandler:
(iOS 10以上版本)直接打开应用程序,而无需进行条件检查canOpenURL:
请阅读苹果文档的讨论部分 为canOpenURL:方法说:
openURL:方法不受
LSApplicationQueriesSchemes
要求的限制。
似乎没有人已经解决了如何指定具有embedded参数的URL。 任何包含参数的URL都不能在LSApplicationsQueriesSchemes中指定特定的URL。 例如,假设我有一个通过发件人电子邮件地址的电子邮件应用程序:
myemail://mailto?bob@gmail.com
它似乎得到它在iOS9中工作的唯一方法是删除任何参数。
当我今天尝试从我自己的应用程序调用Facebook时,发现没有可添加到Info.plist
(Xcode版本8.2.1(8C1002))的LSApplicationQueriesSchemes项。 我用Sublime Text打开Info.plist
并手动添加到文件中,然后运行。 只是为了让你知道,如果你找不到密钥,只需自己添加它。
Apple在iOS 9上更改了canOpenURL方法。在iOS 9和iOS 10上检查URL Schemes的应用程序必须在提交给Apple时声明这些Schemes。
对于贝宝添加下面的URLscheme:
参考这个链接
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>