iOSアプリを64bit版に対応するための技術的備忘録

2014年にiOS8がリリースされ、以降のアプリが64bit対応を要求されるようになったのはアプリ開発者の間で大きな波紋を呼びました。 既に2017年9月のiOS11からは32bitアプリの利用できなくなっています。 本記事は2014年のiOS8リリース時点での原稿ですが、ご参考にされる方もいらっしゃるかと思いますので、一部改訂する形で再公開しています。

iOSアプリは64bitサポートが必須に

iOS8のリリースに伴い、developer newsにて以下の様な告知が有りました。

64-bit and iOS 8 Requirements for New Apps October 20, 2014 Starting February 1, 2015, new iOS apps uploaded to the App Store must include 64-bit support and be built with the iOS 8 SDK, included in Xcode 6 or later. To enable 64-bit in your project, we recommend using the default Xcode build setting of “Standard architectures” to build a single binary with both 32-bit and 64-bit code. https://developer.apple.com/news/?id=10202014a ※リンク先の元ページは既に消えている為、waybackmachineのアーカイブへと遷移します

要約すると2015年2月1日以降に新しくアップロードするアプリは64bitサポートを同梱しなさい、ビルドはiOS8 SDKで行いなさいということです。

iOSアプリの64bitサポートはiPhone5sが出た当初から行われているので改めて驚くことではないのですが、必須となることでの注意事項などを少しまとめておければと思います。

XcodeでiOS 64bitサポートアプリを作成する

Xcodeで64bitサポートアプリを作成する方法は難しくありません。 プロジェクト設定の「Build Setting」にある「Architecture」の項目にarm64を含めるだけでよいです。 おそらく「Standard architecture(armv7, armv7s, arm64)」というものがありますので、こちらを設定して下さい。

ここでいうarchitecture(アーキテクチャ)はCPUを指しています

armv7:iPhone4s, armv7s:iPhone5, arm64:iPhone5s、iPhone6にそれぞれに対応している形になります。

iOS 64bit版アプリ作成時の注意点

64bit対応アプリを作成する際に気をつけなければいけない点がいくつか有りますので、念のためそれらも記載しておきます。

データ長の違い

iOSの32bitと64bitではデータ長が異なります。 正しい数字は公式のドキュメントを参照していただければと思いますが32bit、64bitアプリ間でのやりとりには注意が必要です。 同じデータ型を扱っていても、実際に扱えるデータ長が異なるのでオーバーフローを起こしたりする原因となります。

アプリの肥大化

32bit、64bit両対応版のアプリを作成した場合、アプリ自体のサイズが大きくなることが懸念されます。 ストレージが巨大化したとはいえ有限であるストレージを圧迫しますしネットワークを介してダウンロードする際に、サイズが大きいことが懸念材料となりえます。

これはBuild Settingsで指定したアーキテクチャごとにそれぞれ実行ファイルを作成し、同梱版としてアプリを作成するという仕組みによるものです。 64bitCPUのみに対応したアプリとして、他の対応を切り捨てるのであればサイズの肥大化は防げますが、現在でもiPhone5を使っている方はそれなりにおり、単純に切り捨てることが難しいです。

他にも注意点はあるのですが、全てを記載していたら長くなってしまうので公式ドキュメントを参照して、必要な対応を取っていくと良いかと思います。

Cocoa Touch – 64ビット移行ガイド

64bitのサポートを必須とした背景には何があるのかが少し気になります。 32bitCPUのiPhone5(5c)以前の端末に関しては今後扱いづらくなるのでは?と思います。

Appleにかぎらず、こういった重要な変更をしれっと言ってくるので、今後もアンテナを巡らせて、なるべく先手を取って行くようにしたいですね。