【iOS 9 対応】Working with New Features in iOS 9


iOS 9 対応 として, 何をしたか (主に iOS 9 の新しい要素である App Transport Security や Multitasking, カスタムURLスキームでの外部アプリ起動ができなくなったこと について)を記録します.

  1. 準備: 実機購入
  2. 準備: iOS 9 入れたりセットアップ → Debug 機として使うために Apple Developer で端末登録, Provisioning Profile 作成
  3. Xamarin を iOS 9 対応版にする. (Xcode beta 7 と紐付けなど)
  4. App Transport Security 対策
  5. Multitasking(iPad向けマルチタスキング)対応
  6. デフォルトではカスタムURLスキームでの外部アプリ起動ができなくなった対策
  7. IPv6 only Network への対応

実機購入 → iOS 9 入れたりセットアップ

まず最初は, iOS 9 対応の前の, 準備について書きます.

実機については,

  • iPhone 6 など iPhone
  • iPad Air 2

を購入しました.

とくに iPad Air 2 OR iPad mini 4 は 外せないと思います.
なぜなら, 後から書きますが, iOS 9 から, iPad向けマルチタスキング機能が追加され,
さらに iPad Air 2 だけ Split View という特別な機能が使えるからです.

追記: 9/9 の Appleの発表で発表された, 新しい端末 iPad mini 4 でも Split View 対応しているようです!

↓ iOS 9 から追加された iPad 用 マルチタスキングは, slide over, picture in picture, split view の 3種類あるのですが,
それぞれの対応表

Device Slide Over Picture in Picture Split View
iPad mini 2 OK OK ーー
iPad mini 3 OK OK ーー
iPad Air OK OK ーー
iPad Air 2 OK OK OK
追記: iPad mini 4 OK OK OK

なので, その動作確認のために, iPad Air 2 購入は不可欠だと思いました.

(2015/9/15 追記: 先週9/9のAppleにより発表された 新しい端末 iPad mini 4 でも split view 対応しているようです!)

Split View イメージ:
Split View
画像は iOS 9’s Split View for iPad is everything you hoped it would be | Cult of Mac より.

セットアップ → Debug 機として使うために Apple Developer で端末登録, Provisioning Profile 作成

購入した端末の到着後,

  1. Apple Developer から iOS 9 beta 5 をダウンロードします.
  2. 端末に iOS 9 インストール. やり方はこの記事参照 → iOS 9ベータ版をインストールする方法 | 携帯総合研究所
  3. その新しい端末で, アプリの Debug 実行ができるように, 『Certificates, Identifiers & Profiles | Apple Developer』の Devices > Register Device で登録.
  4. それら新しい端末を含む Provisioning Profiles 作成, ダウンロード, Xcode で インストール

Xamarin を iOS 9 対応版にする

3日前に書きました. こちら参照:
Xamarin iOS 9 対応 (シミュレータで立ち上がるまで) | ちょまど帳

App Transport Security 対策

なんかめっちゃ長くなったので, 別記事に分けました.
こちら参照のこと:
【iOS 9 対応】App Transport Security 対策

上の記事で詳しく書きましたが,
ざっくり言うと,

Apple は,
「ユーザに提供する通信は, セキュアなものしか許さないよ! セキュアじゃないものは全部シャットアウトするよ!」という内容の,
App Transport Security という名前の新しい基準を設けました.

iOS 9 以降からはすべてのアプリがこの基準の対象となります. (だからATSの要件を満たしていない(例えばHTTP通信で接続する) Webページは読み込まれず, WebView の中が真っ白になる)

この提示されている要件を満たすべきですが,
取り敢えず現在は,
以下の info.plist の追記で回避できます.

info.plist に 以下を追記:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    (既存の項目たち)
    <!-- ここから -->
    <key>NSAppTransportSecurity</key>
    <dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
        <dict>
        <key>example.com</key><!-- ここにHTTP通信を許可するドメイン -->
            <dict>
            <!-- サブドメインも含める -->
            <key>NSIncludesSubdomains</key>
            <true/>
            <!-- HTTP通信するの許してね-->
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            </dict>
        </dict>
    </dict>
    <!-- ここまで -->
</dict>
</plist>

Multitasking(iPad向けマルチタスキング)対応

Xamarin の iOS 9 対応版でビルドすれば勝手に対応されます.
(ただし iPad で 全向き許可している場合のみ)

Screen Shot 2015-09-04 at 12.25.23
↑ 全チェック必須

デフォルトではカスタムURLスキームでの外部アプリ起動ができなくなった対策

iOS9 から UIApplication.SharedApplication.CanOpenUrl() メソッドが使えません.
あと, info.plist で ホワイトリスト登録していない 外部アプリのカスタムURLスキームを開くこともできません.

これは, ユーザがインストールしているアプリの情報は丁重に扱うべきである, という, Appleの方針らしいです.

たとえば,

// Google Maps アプリを開く
UIApplication.SharedApplication.OpenUrl(new NSUrl("comgooglemaps://"));

などやったら,

This app is not allowed to query for scheme original scheme

というエラーを吐いて, Google Maps アプリを 開いてくれません.

また, 今まで『該当のアプリがインストールされているかどうか』という判定に重宝していた CanOpenUrl() メソッドが使えなくなりました.
具体的には, 常に false を返すようになってしまいました.

たとえば, 次のようなコードでは, 常に else 句に入ることになります.

// Google Maps アプリが ユーザの端末に入っているかどうか判定
if (UIApplication.SharedApplication.CanOpenUrl(new NSUrl("comgooglemaps://"))
{
    // Google Maps アプリが ユーザの端末に入っているので, Google Maps アプリで開く
}
else
{
    // Google Maps アプリが ユーザの端末に入っていないので, 
    // AppStore のインストールページへ飛ばす
}

どうすればいいかというと,
何度か言及しましたが, info.plist に ホワイトリスト登録をします.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    (既存の項目たち)
    <!-- ここから -->
    <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>comgooglemaps</string> <!-- 開くことを許したいURLスキーム -->
    </array>
    <!-- ここまで -->
</dict>
</plist>

ちなみに, Apple 純正のアプリ( Safari や AppStore など)は, わざわざこんなことしなくても普通に開いてくれます.

IPv6 only Network への対応

参照:
iOS9 で必要な IPv6 only Network への対応 | Qiita

終わりに

全部一人でやったのですが, 実作業の他に調べるのも含めて だいたい3日で全部終わりました.


投稿者:

ちょまど

千代田まどかです。文系出身プログラマ兼マンガ家です!腐女子です。2016年春、テクニカルエバンジェリストとして Microsoft に入社しました。 MSお仕事ブログはこちら

「【iOS 9 対応】Working with New Features in iOS 9」への2件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。