原文地址: https://github.com/ChenYilong/iOS9AdaptationTipsios
WWDC 2015 Session 703: "Privacy and Your App ( 時間在30:18左右)關於 URL scheme
的介紹,指出:git
也就是說:在iOS9中,若是使用 canOpenURL:
方法,該方法所涉及到的 URL scheme
必須在"Info.plist"中將它們列爲白名單,不然不能使用。key叫作LSApplicationQueriesSchemes ,鍵值內容是github
<key>LSApplicationQueriesSchemes</key> <array> <string>urlscheme</string> <string>urlscheme2</string> <string>urlscheme3</string> <string>urlscheme4</string> </array>
白名單上限是50個:chrome
WWDC 2015 Session 703: "Privacy and Your App )有說明:swift
「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 Appapi
iOS9中 openURL:
方法沒有什麼實質性的變化,僅僅多了一個確認動做:微信
蘋果爲何要這麼作?session
在 iOS9 以前,你可使用 canOpenURL:
監測用戶手機裏到底裝沒裝微信,裝沒裝微博。可是也有一些別有用心的 App ,這些 App 有一張經常使用 App 的 URL scheme
,而後他們會屢次調用canOpenURL:
遍歷該表,來監測用戶手機都裝了什麼 App ,好比這個用戶裝了叫「大姨媽」的App,你就能夠知道這個用戶是女性,你就能夠只推給這個用戶女性用品的廣告。這是侵犯用戶隱私的行爲。app
這也許就是緣由。iphone
本項目中給出了一個演示用的 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、支付寶四者的白名單,則配置以下:
<key>LSApplicationQueriesSchemes</key> <array> <!-- 微信 URL Scheme 白名單--> <string>wechat</string> <string>weixin</string> <!-- 新浪微博 URL Scheme 白名單--> <string>sinaweibohd</string> <string>sinaweibo</string> <string>sinaweibosso</string> <string>weibosdk</string> <string>weibosdk2.5</string> <!-- QQ、Qzone URL Scheme 白名單--> <string>mqqapi</string> <string>mqq</string> <string>mqqOpensdkSSoLogin</string> <string>mqqconnect</string> <string>mqqopensdkdataline</string> <string>mqqopensdkgrouptribeshare</string> <string>mqqopensdkfriend</string> <string>mqqopensdkapi</string> <string>mqqopensdkapiV2</string> <string>mqqopensdkapiV3</string> <string>mqzoneopensdk</string> <string>wtloginmqq</string> <string>wtloginmqq2</string> <string>mqqwpa</string> <string>mqzone</string> <string>mqzonev2</string> <string>mqzoneshare</string> <string>wtloginqzone</string> <string>mqzonewx</string> <string>mqzoneopensdkapiV2</string> <string>mqzoneopensdkapi19</string> <string>mqzoneopensdkapi</string> <string>mqzoneopensdk</string> <!-- 支付寶 URL Scheme 白名單--> <string>alipay</string> <string>alipayshare</string> </array>
plist 文件看起來會是這樣的:
其餘平臺可在下面的列表中查詢: 各平臺OpenURL白名單說明
平臺名稱 | URL Schem | 補充說明 |
---|---|---|
微信 | wechat, weixin |
|
支付寶 | alipay, alipayshare |
|
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, |
|
見下文 | ||
無需配置 | ||
pocket-oauth-v1 | ||
pinit | ||
Line | line | |
KakaoTalk | kakaolink | |
KaokaoStory | storylink | |
無需配置 | ||
Tumblr | 無需配置 | |
非平臺類 | 無需配置 | ( 如短信,複製,郵件等) |
另外, Facebook 的URL Scheme白名單須要注意:
若是 SDK 版本低於 4.5 應補充
<key>LSApplicationQueriesSchemes</key> <array> <string>fbapi</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> <string>fbauth</string> <string>fbauth2</string> <string>fb-messenger-api20140430</string> </array>
若是使用 FBSDKMessengerShareKit,還要加上
<string>fb-messenger-platform-20150128</string> <string>fb-messenger-platform-20150218</string> <string>fb-messenger-platform-20150305</string>
若是使用SDK版本高於4.6,則只須要加上
<key>LSApplicationQueriesSchemes</key> <array> <string>fbapi</string> <string>fb-messenger-api</string> <string>fbauth2</string> <string>fbshareextension</string> </array>
參考連接 。