iOS 30days Album

Universal Links の iOS 側の対応をやってみた

iOS 30days Album

こんにちは、30days Album の iOS アプリを担当しているしゅんしゅん(@kuroyam)です。

このエントリは Pepabo Advent Calendar 2015 の7日目のエントリです。今回は iOS9 から導入された 「Universal Links」に対応する上で iOS アプリ側で必要になる作業について書きます。サーバ側の作業については前回のエントリを参照してください。

iOS アプリ側で必要な作業

  • Capabilities の設定
  • アプリ起動時のハンドリング

Capabilities の設定

Xcode 上で Capabilities を設定します。「Associated Domains」を ON にし、Domains を設定します。

image

Domainsには対応したいウェブサイトのドメインにapplinks:を付けたものが入ります。https://30d.jpの場合、applinks:30d.jpです。この設定をもとに、アプリインストール時に apple-app-site-association を取得するようです。

アプリ起動時のハンドリング

Universal Links でアプリが起動された場合、 AppDelegate のapplication:continueUserActivity:restorationHandler:メソッドが呼ばれるため、これを実装します。なお、このメソッドは Universal Links だけでなく、SearchAPI や Handoff によって起動された時も呼ばれるため activityType をチェックしておく必要があります。

以下がサンプルコードです。

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
    if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
        if UniversalLinkHandler.handleUniversalLink(userActivity.webpageURL) == false {
            UIApplication.sharedApplication().openURL(userActivity.webpageURL!)
            return false
        }
    }
    return true
}

UniversalLinkHandler クラスが渡ってきた URL をチェックし、その後適切な画面を開くように実装しています。30days Album ではすでにURLスキームによるアプリ起動処理を実装していたため、画面を開く処理を新たに実装する必要はなく、非常に少ない記述量で Universal Links に対応することができました。

また、URL を正しく処理できなかった場合はopenURL:で Safari に戻すようにしています。この処理は Apple の公式ドキュメントでも推奨されています。

困ったところ

対応する URL の制御が難しい

Universal Links に対応するページは apple-app-site-association で指定できるのですが、正規表現が使えず「*」と「?」の特殊記法のみを使って指定する必要があります。今回対応しようとした 30days Album のアルバムページはhttp://30d.jp/kuroyam/1のようになっているため、/*/*と指定するしかありませんでした。ですが、これだとアルバムページ以外でもパスが2階層以上あれば Universal Links でアプリが起動してしまいます。

対策として、アプリ側で URL を正規表現を使ってチェックし、アルバムもしくは写真ページの URL だった時のみハンドリングし、それ以外は前述の処理で Safari に戻すようにしました。極力期待するページのみで動くようにしたかったのですが、今の Universal Links の仕組みでは難しいようでした。 サービスの特性上、共有される URL のほとんどがアルバムページか写真個別ページのため、そちらの体験がよくなるのであればやろうということで対応を進めていますが、サービスの特性次第ではユーザー体験を損ねてしまう恐れもあるので注意が必要だと感じました。

まとめ

iOS9 でしか使えなかったり、対応ページの指定が難しかったりと気になる点はいくつかありますが、アプリを中心としたユーザー体験を提供していく上で Universal Links 対応はとても効果的なのではと期待しています。

昨日のサーバ編でも書かれている通り、 Universal Links 対応版はまだリリースされていません。近いうちにリリースされる予定ですのでその際はぜひご利用ください!

以上、Pepabo Advent Calendar 2015 の7日目のエントリでした。