Edited at

iOS9でカスタムURLスキームの遷移に失敗するときの注意点

More than 3 years have passed since last update.

iOS9からURLスキームの使用に関する変更があり、

従来のopenURLを実行するだけではカスタムURLスキームの遷移が使用できなくなりました。

※Apple公式のURLスキーム(ブラウザを開くなど)は正常に動作します。

状況と対策についてまとめます。

スクリーンショット 2015-06-11 15.23.58.png


iOS8までは有効なカスタムURLスキームによる遷移


Objective-C


// Objective-C
NSURL *url = [NSURL URLWithString:@"originalscheme://"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
}



Swift

// 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スキームを記載します。

スクリーンショット 2015-06-19 1.22.55.png


まとめ

iOS9でカスタムURLスキームがinfo.plistに記載されていない場合にエラーになります。

ユーザーがインストールしているアプリの情報がAppleのプライバシーモデルの対象となったようです。


参考

WWDC2015 Session 703, “Privacy and Your App”

https://developer.apple.com/videos/wwdc/2015/?id=703

http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes