NSBlogger

意識高いブログ

iOS9対応でやろうと思っていることまとめ

iOS9がそろそろでます

iOS9が今月半ばに登場するので、それに向けてiOS9対応をする必要があります。
例年の通りだと、来年にはiOS9SDKでビルドしていないものは審査すら出せなくなります。
iOS8対応済みのアプリに対してiOS9対応する際にやろうと思っていることを以下にまとめました。
他にもこれやっといたほうがいいよっていうのがあれば教えて下さい。

iOS9対応とは

まずXcode 7をダウンロードしましょう。
f:id:Kamekiti:20150901213308j:plain
Base SDK をiOS9にしてビルド。これで完了です。
最初はビルドが通らないことがしばしば。エラーを取り除きましょう。
以下がポイントです。

1.URLスキーム対応

問題

iOS9からcanOpenURL:メソッドが使えません。「This app is not allowed to query for scheme originalscheme」というエラーをはきます。

解決策

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>hogehoge1</string>
    <string>hogehoge2</string>
</array>

info.plistに「LSApplicationQueriesSchemes」を追加してあげます。ここに使いたいURLスキームを入れましょう。

2.シミュレータの判定

問題

「TARGET_IPHONE_SIMULATOR」がdeprecatedになっています。動いてるっぽいですが。ちなみにシミュレータのデバイス名が「iPhone Simulator」から「iPhone」に変わっているので、デバイス名で判定していた方は修正が必要となります。

解決策

「TARGET_OS_SIMULATOR」を使う。

#if TARGET_OS_SIMULATOR
    //simulator
#else
    //device
#endif

3.ステータスバーを表示させる

問題

iOS9からディープリンクまわりが強化されて、今までより便利な使い方ができるようになりました。
ステータスバーの左端に、ディープリンクで飛んできた元のアプリに戻る機能が追加されました。
というわけで、ステータスバーはやはり表示させた方がよいかと思われます。非表示にする理由がないのであれば出しておくことが望ましいかと。
f:id:Kamekiti:20150618190946g:plain
↑こんなかんじでステータスバー左端をタップすると、遷移元に戻れます。

解決策

qiita.com
こちらがよくまとまっていますので参考にしてください。

4.dylib を tbdに置き換え

問題

iOS9でビルドするとdylibという拡張子のライブラリがエラーになりました。

解決策

ライブラリ一覧をみてみたらtbdという拡張子に変わっていました。dylibを削除してtbdに置き換えるとビルドが通りました。
これでいいのでしょうか……?

5.iPadのSplitView対応

f:id:Kamekiti:20150901220637p:plain

問題

Split Viewを使うことでiPadの画面を2分割できます。問題点は画面サイズが変化すること。
けっこういろんなパターンがあって厄介です。場合によっては挙動がおかしくなったり、2分割して使い勝手の悪いアプリになったりします。
ちなみにSplitViewは現時点でiPad Air 2でしか機能しません。
f:id:Kamekiti:20150901221243p:plain
Slice OverとPicture in Pictureはその他のiPadでも機能します。

解決策

下記の手順で動作確認してみるとよいです。

  1. 全画面SizeClassに対応させる
  2. iOS9 SDKでビルド
  3. 画面分割をしてみる
  4. 画面を回転させてみる

Apple標準のアプリはすべて対応されているので参考にしましょう。
Adopting Multitasking Enhancements on iPad: Getting Oriented
こちら、Appleの公式の対応手順です。Split Viewを有効にする設定などが書かれています。
f:id:Kamekiti:20150901221515p:plain
Adopting Multitasking Enhancements on iPad: Slide Over and Split View Quick Start
あー複雑。SizeClassもう必須ですねー。

回避策

「うちのアプリにSplit Viewは合わない!」「Split Viewの対応に時間がかかる……」といったときはマルチタスキングを無効にしましょう。
Info.plistで「UIRequiresFullScreen」をYESにするとマルチタスキングを無効にできます。
Split Viewできませんし、Slice Overの一覧にも出てこなくなります。
ただ、AppleはSplit View対応を推奨しています。なんだかんだ分割できたら便利ですからね。
f:id:Kamekiti:20150901222028p:plain
「TARGETS」→「Deployment Info」→「Requires full screen」にチェックいれるとOKです。(Info.plistも同時に更新されます)

6.BitCodeに対応させる?

問題

iOS9でビルドしようとすると、下記のエラーがでました。
ld: -U and -bitcode_bundle (Xcode setting ENABLE_BITCODE=YES) cannot be used together
なんやねんこれと思ったら、iOS9から登場したBitCodeという機能。
簡単にいうと、iTunesConnectに提出するときにBitCodeていう中間ビルドみたいなのを提出すると、今後Appleがそれぞれの端末に最適化させたアプリを配布してくれるという機能です。サーバ側でアプリをビルドして配布という仕組みですね。

回避策

実際の対応手順よくわかってないので、ひとまずBitCodeをオフにして対応させます。
f:id:Kamekiti:20150901224503j:plain
Build Settingsで「BitCode」で検索すると出てきました。NOにしましょう。
今後はちゃんと対応させたほうがよいかと思われます。
ちなみにBitCodeに対応させるには、導入しているライブラリも含めすべてBitCodeが有効になっている必要があります。

7.ATSに対応させる

問題

iOS9から「App Transport Security」というポリシーが適用されます。簡単にいうと全通信がHTTPSになります。よっしゃiOS9でビルド成功したわー!と思ってアプリ起動したら突然クラッシュ。これが原因でした。iOS9 beta の初期の頃は、iOS8ビルドのアプリもiOS9端末で動作させるとATSが有効になっていましたが、beta5ではiOS9ビルドのアプリのみ対象となったようです。さすがに既存のリリース版まで影響あるとまずいですからね……。

解決策

サーバ側でHTTPSを対応させましょう。ちゃんとHTTPSに対応していれば通信できるので問題なし。TLSv1.2以上だとよいそうです。

回避策

すぐにサーバ側で対応できない場合は、回避策があります。アプリ側でHTTP通信を許可させるという方法。
f:id:Kamekiti:20150901220431j:plain

<key>NSAppTransportSecurity</key>
    <dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
        <dict>
        <key>(ここにHTTP通信を許可するドメイン)</key>
            <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
            <false/>
            </dict>
        </dict>
    </dict>

Appleは非推奨としていますが、上記の設定をすると指定したドメインに対してHTTP通信させることができます。
全通信をHTTP許可にする設定もありますが、リジェクト対象という噂もあるので注意しましょう。

8.IPv6対応

問題

iOS9からIPv6優先で接続が行われます。NSURLConnectionやCFNetworkなどのAPIを使っていれば問題ありませんが、一部IPv4でしか動かないAPIがあるので、もし使っている場合は修正が必要です。

解決策

qiita.com
こちらをご参考ください。

参考

News and Updates - Apple Developer
対応期限は2016年初頭とのこと。これまでに対応しないと審査に出せなくなります。

9.Search APIs

新機能に対応

iOS9からSpotlightが強化されました。比較的実装はしやすく、効果はでかいと思うので上記と合わせて対応するとよいのではないでしょうか。

10.Push通知の挙動(2015/09/18 追記)

仕様変更

iOS9からPush通知に使われるAPNSデバイストークンがアプリをインストールするたびに変更される仕様に。
いままで、端末ごとに一意→アプリケーションごとに一意という流れを踏んできましたが、ついにインストールするたびに変わるようになりました。

解決策

初回起動時に必ず登録させるようにすればOKですね。シンプルになるかと。
いままで時間をずらしたり、なんやかんや挙動チェックに手間暇かけてましたが、それも解消されますね。

参考

qiita.com

11.非推奨になるAPIの確認(2015/09/30 追記)

iOS9からいくつかのAPIが非推奨になりました。今後使えなくなる可能性が高いので早めに対処しておきましょう。

参考

qiita.com

おわりに

他にも対応したほうがよいことがあれば教えて下さい。
iOS7対応ではデザインまわり、iOS8対応では権限まわりが大きく変化しましたが、iOS9対応ではネットワークまわりがネックになりそうですね。
いずれ対応しないといけないので、早め早めにやっておいたほうがよいですよ。