let instagramURL = NSURL(string: "instagram://app")
为什么无法打开该URL?
#1 楼
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会在后续发行版中予以解决。 />
评论
为了澄清起见,请勿在要在LSApplicationQueriesSchemes数组中列入白名单的特定应用程序的字符串中包含“://”,即“ comgooglemaps://”。如果您确实包含“://”,则canOpenUrl:将返回NO并提供“此应用程序不允许查询方案xxx” syslog /错误。但是,当您实际调用canOpenUrl:时,仍必须包含冒号,即canOpenUrl:@“ comgooglemaps:”。
– EmphaticArmPump
15年7月28日在18:05
实际上,苹果确实在最近的更新中对此进行了修复。 -openURL:即使-canOpenURL:受限制,也始终有效。
–蒂姆·约翰森(Tim Johnsen)
15年8月12日在21:37
这有什么意义呢?如果我可以只列出plist中的所有内容并仍然进行查询,那么安全性在哪里?
– Maciej Swic
15年8月17日在12:13
@MaciejSwic原因之一是您不能更改列表,除非重新提交给Apple。
–法律
15年8月17日在14:16
请注意,所有这些都仅与根据iOS SDK 9编译的应用程序有关。 “如果不使用iOS SDK 9.0重新编译,则您的应用程序将被限制为50个不同的方案(对canOpenURL的调用之后将返回NO)”,如developers.facebook.com/docs/ios/ios9上所指定
–mkll
2015年9月1日19:49在
#2 楼
如上所述,您想在信息列表中添加一个密钥,这是大多数社交网络的列表。(FBSDK 4.6):fbapi,fbauth2,fbshareextension。 “ Ha”代表手套
评论
Thx,我认为v需要在列表中添加“ fb”
–siva krishna
2015年10月6日12:15
@sivakrishna fb在这里未提及developers.facebook.com/docs/ios/ios9
–马修·鲁伊夫(Matthieu Rouif)
2015年10月6日13:36
但是,如果我想重定向到任何人脸书页面,例如“ facebook.com / ....”,则在添加fb之后仅添加其wrkng
–siva krishna
2015年9月9日10:11
差不多了在2015年10月,我在Facebook分享对话框中使用了怪异的网址,但遇到了一些失败。我将它们添加为答案,请随时将其添加到您的确是正确的。
–elbuild
15年10月12日在11:05
和Ha:// add / [用户名]在swift 3中添加朋友们的snapchat
– EssamSoft
17年7月6日在3:11
#3 楼
这是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>
评论
弄清楚。这会否排除允许用户输入自己的URL方案并执行该方案的应用程序?
–珍妮
2015年9月17日下午1:10
@Jonny不,因为您仍然可以尝试使用openURL:打开任何URL。它会告诉您打开是否成功。
– Leo Natan
2015年9月17日下午1:29
是的,但是canOpenURL不能使用,因此我们无法告诉用户它是否可以工作,他只能自己尝试。
–珍妮
2015年9月17日下午4:21
我想打开谷歌地图,我必须在URLscheme中放入什么?
–coding22
15 Sep 25'0:49
#4 楼
假设有两个应用程序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。 com / gatzsche / LSApplicationQueriesSchemes-Working-Example
评论
等待,不是在TestB应用程序的into.plist中将LSApplicationQueriesSchemes键的字符串值作为“ testA”作为字符串吗?
–尼克·耶基莫夫(Nik Yekimov)
16年4月28日在16:45
#5 楼
从Session 703 WWDC 2015开始:在为iOS 9构建应用程序时可以继续使用URL方案,并且要调用URL方案,现在需要在应用程序的Info.plist中声明它们。有一个新密钥
LSApplicationQueriesSchemes
,,您将需要在其中添加要使用的方案列表
canOpenURL on。
评论
是的,不是。即使使用info.plist,它仍然无法使用comgooglemaps
–拉杜
2015年11月12日23:02
您找到解决办法了吗?
– Salman Hasrat Khan
16年3月3日,12:50
一幅图片值一千字。感谢您的截图。这就是我所需要的。
–sean808080
17-2-3在17:21
#6 楼
即使使用@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>
评论
您知道我可以使用哪个应用程序查看文档,可以为我提供代码吗?
– Nishat Jahan
16年6月28日在7:07
#7 楼
在Swift 4.2和Xcode 10.1中在info.plist中需要添加CFBundleURLSchemes和LSApplicationQueriesSchemes。
->在项目中选择info.plist,
->右键单击
->选择“打开为源代码”
请参见以下屏幕截图
->将打开xml文件
->复制-粘贴以下代码,并用您ID的
CFBundleURLSchemes和LSApplicationQueriesSchemes替换gmail,fb,twitter并链接到。
<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>
请参见下面的屏幕,您的最终信息。plist文件为
#8 楼
请务必注意,9.0.x上的越狱电话存在一个错误,该错误破坏了URL方案。如果您正在运行越狱设备,请确保在Cydia中更新Patcyh#9 楼
好了,您可以直接调用openURL:
或openURL:options:completionHandler:
(iOS 10及更高版本)来打开应用程序,而无需进行条件检查canOpenURL:
。 > openURL:方法不受
LSApplicationQueriesSchemes
要求的约束。#10 楼
似乎没有人解决过如何使用嵌入式参数指定URL。任何包含参数的URL都无法在LSApplicationsQueriesSchemes中指定特定的URL。例如,假设我有一个通过发件人电子邮件地址的电子邮件应用程序:myemail://mailto?bob@gmail.com
使其在iOS9中正常工作的唯一方法是删除所有参数。
评论
??您应该在plist中添加的是myemail。参数在这里不起作用。
– Leo Natan
2015年10月3日,23:25
#11 楼
苹果在iOS 9上更改了canOpenURL方法。正在iOS 9和iOS 10上检查URL方案的应用程序必须在提交给Apple时声明这些方案。#12 楼
对于PayPal,请在下面添加URL方案:请参阅此链接
#13 楼
Swift 3.1,Swift 3.2,Swift 4if 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>
#14 楼
今天,当我尝试通过自己的应用程序呼叫Facebook时,发现没有可以添加到LSApplicationQueriesSchemes
(Xcode版本8.2.1(8C1002))的Info.plist
密钥。我用Sublime Text打开了Info.plist
并将其手动添加到文件中,然后它开始工作。只是告诉您,如果找不到密钥,只需自己添加即可。
评论
+ canOpenURL:返回什么?你遇到了什么错误?这不是关于xcode的问题。
失败“如果UIApplication.sharedApplication()。canOpenURL(instagramURL!)”检查
请在此处查看文章:awkwardhare.com/post/121196006730/…在iOS 9中,您必须指定您的应用程序正在寻找的URL方案(我自己还没有做过)
将此添加到您的info.plist文件