iOS9からURLスキームの使用に関する変更があり、
従来のopenURLを実行するだけではカスタムURLスキームの遷移が使用できなくなりました。
※Apple公式のURLスキーム(ブラウザを開くなど)は正常に動作します。
状況と対策についてまとめます。
#iOS8までは有効なカスタムURLスキームによる遷移
// Objective-C
NSURL *url = [NSURL URLWithString:@"originalscheme://"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
}
// Swift
let url = NSURL(string: "originalscheme://")!
if (UIApplication.sharedApplication().canOpenURL(url)) {
UIApplication.sharedApplication().openURL(url)
}
#iOS9ではエラーになる
上記のコードをiOS9で実行すると以下のようなエラーログが表示されます。
-canOpenURL: failed for URL: "originalscheme://" - error: "This app is not allowed to query for scheme originalscheme"
また、- canOpenURLは対応するアプリがインストールされていて、
遷移可能な場合でもNOを返します。
#原因
WWDC2015 のセッションの中で以下のように述べています。
Session 703, “Privacy and Your App”
https://developer.apple.com/videos/wwdc/2015/?id=703
ビデオの8:33から、
「ユーザーがインストールしているアプリの情報は丁重に扱われるべきである。」と述べています。
ThirdPartyアプリがcanOpenURLを使用して、ユーザーがインストールしているアプリを調べることへの対策をしているようです。
#対策
ビデオの10:00に記載されているように「URLスキームの内容をinfo.plistに記載する」とこれまで通りに正常に動作するようです。
info.plistに記載が無い場合にエラーになります。
info.plistにLSApplicationQueriesSchemesのkeyと実行したいカスタムURLスキームを記載します。
#まとめ
iOS9でカスタムURLスキームがinfo.plistに記載されていない場合にエラーになります。
ユーザーがインストールしているアプリの情報がAppleのプライバシーモデルの対象となったようです。
#参考
WWDC2015 Session 703, “Privacy and Your App”
https://developer.apple.com/videos/wwdc/2015/?id=703