IOS9没有使用 URL SCHEME 打开 Instagram 应用程序

下面的 URL 在 iOS8.3及更低版本上打开,但是它在 iOS9上不能工作

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

为什么网址打不开?

112810 次浏览

这是 iOS9的一个新的安全特性。更多信息请看 WWDC 2015年第703届会议

任何使用 SDK9构建的应用程序都需要在其 plist 文件中提供一个 LSApplicationQueriesSchemes条目,声明它试图查询的方案。

<key>LSApplicationQueriesSchemes</key>
<array>
<string>urlscheme</string>
<string>urlscheme2</string>
<string>urlscheme3</string>
<string>urlscheme4</string>
</array>

IOS9对 URL 方案的处理做了一个小小的改变。你必须白名单的网址,您的应用程序将调用到使用 LSApplicationQueriesSchemes键在您的 Info.plist

请看这里的帖子: http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes

主要结论是:

如果您对不在您的白名单中的 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。

For instance, incase of FB

如上所述,你想在信息列表中添加一个键,这里是大多数社交网络的列表

<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: 方法不受 LSApplicationQueriesSchemes要求的约束。

当我今天试图从我自己的应用程序中拨打 Facebook 时,我发现没有一个 LSApplicationQueriesSchemes密钥可以添加到 Info.plist(Xcode Version 8.2.1(8C1002))。我用 崇高的文字打开 Info.plist并手动将其添加到文件中,然后它工作了。只是想让你知道,如果你找不到钥匙,只需要添加它自己。

苹果在 iOS9上改变了 canOpenURL 方法。正在检查 iOS9和 iOS10网址方案的应用程序在提交给苹果时必须声明这些方案。

对于 PayPal,添加以下 URL 方案:

enter image description here

参考此 链接

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 源代码

请看下面的屏幕截图

enter image description here

将打开 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文件是

enter image description here