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

  • 269
    いいね
  • 4
    コメント
この記事は最終更新日から1年以上が経過しています。

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