[iOS 10] UIApplication の openURL: が Deprecated になりました

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

openURL が変わった

iOS 10 から UIApplication の openURL: メソッドが Deprecated になりました。
代わりに利用することが推奨されたのは openURL:options:completionHandler: というメソッドです。

openURL:options:completionHandler:

旧メソッドに比べて 2 つ引数が増えています。
このメソッド、何が変わったのか実はよくわかりません。
なぜなら 公式のリファレンスに説明が書かれていない からです。(2016/09 現在)

UIApplication のヘッダーには以下のように書かれています。

// Options are specified in the section below for openURL options. An empty options dictionary will result in the same
// behavior as the older openURL call, aside from the fact that this is asynchronous and calls the completion handler rather
// than returning a result.
// The completion handler is called on the main queue.
- (void)openURL:(NSURL*)url options:(NSDictionary<NSString *, id> *)options completionHandler:(void (^ __nullable)(BOOL success))completion NS_AVAILABLE_IOS(10_0) NS_EXTENSION_UNAVAILABLE_IOS("");

section below for openURL options に該当する部分はこちら。

#pragma mark -- openURL options --

// Option for openURL:options:CompletionHandler: only open URL if it is a valid universal link with an application configured to open it
// If there is no application configured, or the user disabled using it to open the link, completion handler called with NO
UIKIT_EXTERN NSString *const UIApplicationOpenURLOptionUniversalLinksOnly NS_AVAILABLE_IOS(10_0);

この定数もリファレンスでは 説明無し となっています。

どうやら iOS 9 から利用できる ユニバーサルリンク に関係しているようです。
ただ、この定数はあくまで キー値 なので、どのような をセットすればよいのかは不明です。
Apple からの続報を期待しましょう。

旧メソッドからのリファクタリング

An empty options dictionary will result in the same behavior as the older openURL call

ヘッダーに書かれているとおり、第二引数の options空の辞書 を設定すれば、古い openURL と同等の振る舞いとなるようです。

あくまで 空の辞書 です。
第二引数は nullable ではないので nil を設定すると警告が出ます。ご注意ください。

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://www.apple.com"]
                                   options:@{}
                         completionHandler:nil];

追記

Swift の場合、このメソッドは以下のように定義されています。

@available(iOS 10.0, *)
open func open(_ url: URL, options: [String : Any] = [:], completionHandler completion: (@escaping (Bool) -> Swift.Void)? = nil)

新メソッドは open, 旧メソッドは openURL というメソッド名になっているため、取り扱いに注意しましょう。

リンク

ミレニアム・ファルコン製作日記 #36

36 号 表紙

mfd_36_1

パーツ

mfd_36_2

mfd_36_3

mfd_36_4

成果

mfd_36_5

今回の作業は以下の 1 つでした。

  • 下部外殻フレームを組み立てる

前号から組み立てを始めた搭乗ランプの構造を支えるセクションに、2 個の外殻フレームを取り付けました。
この部分のフレームはこれまでとは違い、若干特殊な形になっているように感じました。
組み立ても楽しいです。
あと少しで下部外殻フレームが完成しそうですね。

LEGO®スター・ウォーズ/フォースの覚醒

いよいよ 10 月 13 日に発売されます。

プラットフォームは以下の通り。

  • PS4
  • PS3
  • PS Vita
  • Wii U
  • 3DS

多いな!

英語音声・日本語字幕が対応されているのは PS4, PS3, Wii U 版のみ。
よって私は PS4 版を購入しようと思います。

エピソード 7 の前日譚も収録されているそうなので、ファンにとってはたまらない作品になっていることでしょう。

LEGO®スター・ウォーズ/フォースの覚醒

それではまた次回。

May the Force be with you!

  • mono0926

    > ヘッダーに書かれているとおり、第二引数の options に 空の辞書 を設定すれば、古い openURL と同等の振る舞いとなるようです。

    Swiftから見ると
    `open func open(_ url: URL, options: [String : Any] = [:], completionHandler completion: (@escaping (Bool) -> Swift.Void)? = nil)`となっているので、

    `open(url)`みたいな感じに書けますよ。

    • Tanaka Keisuke

      コメントありがとうございます。
      追記させていただきました。

      • mono0926

        追記ありがとうございます。

        > よって従来の表記でもデフォルト値が使用されるため、リファクタリングは不要です。

        ただ、不要では無いです。
        そもそも別物のメソッドが全く書き方になってしまうのはあり得ないかと思います。

        – 従来のAPI: `application.openURL(url)`
        – 新しいAPIで第2引数以降省略: `application.open(url)`

        (どちらもSwift 3.0の場合です)

        • Tanaka Keisuke

          失礼しました。
          解釈を誤ったようです。
          修正させていただきました。

  • KimSungwhee

    // Objective-C
    NSDictionary *options = @{UIApplicationOpenURLOptionUniversalLinksOnly : @YES};
    [application openURL:URL options:options completionHandler:nil];

    // Swift
    let options = [UIApplicationOpenURLOptionUniversalLinksOnly : true]
    UIApplication.shared.open(url, options: options, completionHandler: nil)

    こんな感じです。
    http://useyourloaf.com/blog/openurl-deprecated-in-ios10/