iOS 9不能使用URL SCHEME打开Instagram应用程序

以下URL在iOS 8.3及更低版本上打开,但不起作用,并且不起作用

let instagramURL = NSURL(string: "instagram://app") 

为什么URL不能打开?

iOS 9对URLscheme的处理做了一点改动。 您必须将您的应用程序调用的url列入白名单,以使用Info.plistLSApplicationQueriesSchemes项。

请在这里看到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列表。

例如,FB的incase

即使通过@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>