米アップル社は今年中にiOS/OSX/Xcodeの次のバージョン(それぞれiOS9, OSX El Capitan, Xcode 7)のリリースを予定しているが、当方がbeta版を使った経験上、開発サイドで気をつけなければならない点が見つかった。ここではその要注意箇所について説明したい。
(iOSのみ)最初に表示するビューコントローラーの設定の仕方は適切か
これは古いアプリ(それもiOS3/4時代からリリースしているような)で、なおかつInterface Builderを使わずに開発されたアプリのソースコードに多いが、最初に表示するビューコントローラーをAppDelegateのwindowプロパティーにaddSubviewする形で表示した場合、少なくともbeta4の段階ではiOS9/Xcode7では正常に動作しない(アプリクラッシュする)。
これについては、代替としてwindowのrootViewControllerプロパティーにビューコントローラーをセットする方式に変更すれば基本的に正常に動く。
クラッシュする例
UIViewController *vc = [[UIViewController alloc] init];
[self.window addSubview: vc.view];
修正例
UIViewController *vc = [[UIViewController alloc] init];
self.window.rootViewController = vc;
App Transport Security
iOS9/El CapitanからはApp Transport Security(以降、「ATS」)が追加され、Xcode 7以降でビルドしたアプリについては(少なくともiOS9では)ATSが有効になり、デフォルトでは強制的にTLS1.2のHTTPS通信にされてしまう仕様に変更された。
この場合、多くのアプリでは正常に通信ができなくなるため、以下の対処が必要になる。
- アプリ・サーバー共にTLS1.2対応のHTTPS通信に移行する
- 特定のドメインに対して例外処置を設ける
- ATSを無効にする
うち、1は最もネットワーク通信では安全性が高く、アップルとしては望ましいとされる方法だが、アプリのソースコードの改修や、場合によってはサーバーの改修も必要になる場合もあるため、改修のコストがかかるという問題を持っている。
2と3はInfo.plistを編集するだけで対処可能であるため、一時しのぎとしては有効である(いつこの方法が使えなくなるかわからないという問題もあるが)。
2は特定のドメインを信頼して、そのドメインに対してだけHTTP通信やTLS1.1などの古いバージョンのSSL通信を許可するため、使用するドメインを調べなければならない点や他のドメインにHTTP通信をする必要がある場合は使えないが、3よりは比較的安全といえる。
3はATSを完全に無効にし、iOS8/Yosemite/Xcode6.xまでとほぼ同様にすべてのHTTP通信を許可するようになる。設定も手っ取り早いが、セキュリティー上のリスクも最も大きい。
設定方法については以下のページを参考されたい
- WORKING WITH APPLE’S APP TRANSPORT SECURITY – NEGLECTED POTENTIAL (英語)
- iOS9でHTTP接続できない場合の対処法 – Noiris Blog
- iOS 9.0 – Apple Developer
(英語)
最後に
今回のiOS及びOS Xの新バージョンでは、iOS6からiOS7への移行のような見た目がガラリと変わることにともなうような修正こそ必要なさそうだが、レガシーな記述をしている部分が問題を起こしたり、ネットワーク部の変更などで気をつけなければならない点がある以上、早い段階でiOS9/El Capitan対応は視野に入れた方が良さそうだ。
ただ、これらの問題はiOS9でもXcode 6.xでビルドしたバイナリーでは互換モードで動いているのか上記の問題が発生しないので、iOS9のリリースで阿鼻叫喚に陥るという事態はある程度は抑えられそうだが・・・
(2015/08/22補足)
App Transport SecurityのTLS要件が思った以上に厳しかった件に本記事の補足内容を含む記事を執筆しました。ATSで受け入れられるTLS要件に関する内容を記述しているため、必要に応じてごらんください。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。