281
273

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-06-11

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

281
273
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
281
273

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?