WWDC 2015 Session 703: "Privacy and Your App ( 時間在30:18左右)關於 URL scheme
的介紹,指出:
也就是說:在iOS9中,如果使用 canOpenURL:
方法,該方法所涉及到的 URL scheme
必須在"Info.plist"中將它們列為白名單,否則不能使用。key叫做LSApplicationQueriesSchemes ,鍵值內容是
LSApplicationQueriesSchemes urlscheme urlscheme2 urlscheme3 urlscheme4
白名單上限是50個:
WWDC 2015 Session 703: "Privacy and Your App )有說明:
“So for apps that are linked before iOS 9 and are running on iOS 9, they will be given 50 distinct URL schemes.” -- WWDC 2015 session 703 Privacy and Your App
iOS9中 openURL:
方法沒有什麼實質性的變化,僅僅多了一個確認動作:
蘋果為什麼要這麼做?
在 iOS9 之前,你可以使用 canOpenURL:
監測用戶手機裡到底裝沒裝微信,裝沒裝微博。但是也有一些別有用心的 App ,這些 App 有一張常用 App 的 URL scheme
,然後他們會多次調用canOpenURL:
遍歷該表,來監測用戶手機都裝了什麼 App ,比如這個用戶裝了叫“大姨媽”的App,你就可以知道這個用戶是女性,你就可以只推給這個用戶女性用品的廣告。這是侵犯用戶隱私的行為。
這也許就是原因。
本項目中給出了一個演示用的 Demo ,倉庫的文件夾叫“Demo3_iOS9URLScheme適配_引入白名單概念”,Demo引用自LSApplicationQueriesSchemes-Working-Example
Demo結構如下:
主要演示的情景是這樣的:
假設有兩個App: weixin(微信) and 我的App. 我的App 想監測 weixin(微信) 是否被安裝了. "weixin(微信)" 在 info.plist 中定義了 URL scheme :
<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>weixin</string> </array> </dict> </array>
我的App 想監測 weixin(微信) 是否被安裝了 :
[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"weixin(微信)://"]];
即使你安裝了微信,在iOS9中,這有可能會返回NO:
因為你需要將 "weixin(微信)" 添加到 “我的App” 的 info.plist 文件中:
<key>LSApplicationQueriesSchemes</key> <array> <string>weixin</string> </array>
(以上只是為了演示,實際開發中,你不僅需要添加“weixin”還需要“wechat”這兩個。具體下文給出表格)
另外,推薦一篇博文,其中最關鍵的是以下部分:
If you call the “canOpenURL” method on a URL that is not in your whitelist, it will return “NO”, even if there is an app installed that has registered to handle this scheme. A “This app is not allowed to query for scheme xxx” syslog entry will appear.
如果想一次性集成最常用的微信、新浪微博、QQ、支付寶四者的白名單,則配置如下:
LSApplicationQueriesSchemes weixin sinaweibohd sinaweibo sinaweibosso weibosdk weibosdk2.5 mqqapi mqq mqqOpensdkSSoLogin mqqconnect mqqopensdkdataline mqqopensdkgrouptribeshare mqqopensdkfriend mqqopensdkapi mqqopensdkapiV2 mqqopensdkapiV3 mqzoneopensdk wtloginmqq wtloginmqq2 mqqwpa mqzone mqzonev2 mqzoneshare wtloginqzone mqzonewx mqzoneopensdkapiV2 mqzoneopensdkapi19 mqzoneopensdkapi mqzoneopensdk alipay alipayshare
plist 文件看起來會是這樣的:
其他平台可在下面的列表中查詢: 各平台OpenURL白名單說明
weixin 支付寶 alipay,
alipayshare QQ mqqOpensdkSSoLogin,
mqqopensdkapiV2,
mqqopensdkapiV3,
wtloginmqq2,
mqq,
mqqapi QZONE mqzoneopensdk,
mqzoneopensdkapi,
mqzoneopensdkapi19,
mqzoneopensdkapiV2,
mqqOpensdkSSoLogin,
mqqopensdkapiV2,
mqqopensdkapiV3,
wtloginmqq2,
mqqapi,
mqqwpa,
mqzone,
mqq [注:若同時使用QQ和QZONE,則直接添加本格即可] 新浪微博 sinaweibo,
sinaweibohd,
sinaweibosso,
sinaweibohdsso,
weibosdk,
weibosdk2.5 [後兩個若導入新浪SDK則需要] 豆瓣 無需配置 開心網 無需配置 易信 yixin,
yixinopenapi Google+ googlechrome,
googlechrome-x-callback,
hasgplus4,
com.google.gppconsent,
com.google.gppconsent.2.2.0,
com.google.gppconsent.2.3.0,
com.google.gppconsent.2.4.0,
com.google.gppconsent.2.4.1 人人網 renrenapi,
renrenios,
renreniphone,
renren, Facebook 見下文 Twitter 無需配置 Pocket pocket-oauth-v1 Pinterest pinit Instagram instagram WhatsApp whatsapp Line line KakaoTalk kakaolink KaokaoStory storylink LinkedIn 無需配置 Tumblr 無需配置 非平台類 無需配置 ( 如短信,復制,郵件等)
另外, Facebook 的URL Scheme白名單需要注意:
如果 SDK 版本低於 4.5 應補充
LSApplicationQueriesSchemes fbapi fbapi20130214 fbapi20130410 fbapi20130702 fbapi20131010 fbapi20131219 fbapi20140410 fbapi20140116 fbapi20150313 fbapi20150629 fbauth fbauth2 fb-messenger-api20140430
如果使用 FBSDKMessengerShareKit,還要加上
fb-messenger-platform-20150128 fb-messenger-platform-20150218 fb-messenger-platform-20150305
如果使用SDK版本高於4.6,則只需要加上
LSApplicationQueriesSchemes fbapi fb-messenger-api fbauth2 fbshareextension