勝訴 iOS 7へ対応

これまで、iPadローンチ、Retinaディスプレイ対応とiOS デバイスの進化に合わせてリリースしてきた、iPad用アプリ「勝訴」。
iOS 7向けにアップデートを行い、本日よりApp Storeにてダウンロードができるようになりました。また、今回のアップデートにより、64bitプロセッサに対応した、初の「勝訴」となりました。

shouso_ios7

iOS 7と64bitプロセッサ向けの最適化を行ったため、動作にはiOS 7が必要です。iOS 7以前のデバイスをご利用の方は、過去のバージョンを引き続きダウンロード可能です。

以下技術的なお話。

Xcode 3の時代のプロジェクトを引き継いでいたため、最新のアーキテクチャ向けにアップデートできるか心配だったが、以下の修正で対応できた。

・ステータス・バーを非表示にする方法が変更になったため、コードの変更。UIViewControllerの – prefersStatusBarHidden メソッドをオーバーライドして、YESを返すよう変更。

- (BOOL)prefersStatusBarHidden
{    
    return YES
}

・iOS 7用のアイコンを作成。アイコンはAsset Catalogで管理するよう変更。
・32/64bitプロセッサ向けのバイナリを作成。プロジェクト設定の”Architectures”を”Standard Architectures(including 64-bit)”に変更。スクリーンショット 2013-09-26 16.07.05
ただし、64bitプロセッサ向けのバイナリは現時点では必須ではない。将来には必須になる可能性もある。

・プロジェクト設定の”iOS Deployment Target”を”iOS 7″に変更。

本来はiOS 6, iOS 7どちらでも動作するものを目指していたが、64-Bit Transition Guide for Cocoa Touch にもあるように、32/64bit両方に対応したバイナリはDeployment TargetをiOS 7に設定しなければならない。一度ここを見落とし、審査でリジェクトされてしまった。この問題は将来のXcodeのリリースで解消される見込みのようだ。

iOS 6時代のUUID事情

今日リリースされたiOS 6, マップやPassbookが目立った新機能だが、UDID/UUID周りについても重要な変更が行われている。
これらについてまとめておく。

UDIDへのアクセスは基本的にNG.
UDIDへのアクセスはiOS 5から非推奨とされている。
公式リファレンスでは、CFUUIDRefを生成し、アプリ内で保存するなどの方法をこれまでには紹介されていたが、iOS 6ではフレームワーク側でUDIDにかわるID(どれもUUID)を用意している。

+ [NSUUID UUID]
従来のCFUUIDRefのObjective-C版と考えていいだろう。クラス・メソッドの+UUID を呼び出せば、UUIDが新規に生成される。
NSString、バイト列に変換するインスタンス・メソッドも用意されている。
ただし、CFUUIDRefとToll-Free bridgeではない。

UIDevice.identifierForVendor
デバイス固有であるが、ベンダごと(Team IDごと)で異なるUUIDを返す。

ASIdentifierManager.advertisingIdentifier
デバイス固有で、すべてのアプリで共通のUUIDを返す。強力なスーパー・クッキーとして機能する。
広告ネットワークのSDKを開発することを想定されている。
advertisingIdentifierを広告目的で利用する場合、ASIdentifierManager.advertisingTrackingEnabledを参照し、ユーザがトラッキングを許可しているか、確認する必要が有る。ユーザが許可していない場合、このUUIDをトラッキング用途で利用してはならない。
この機能はUIKitには含まれず、利用するにはAdSupport.Frameworksをリンクしなければならない。
なお、advertisingIdentifierをトラッキング目的で提供することは、標準では許可されている。提供を拒否したい場合は、iOSの設定アプリから情報>アドバタイズ>Ad Trackingを制限 でオプト・アウトする必要が有る。

追記

iOS Developer Centerのソースは以下の通り

NSUUID Class Reference

UIDevice Class Reference

Ad Support Framework Reference

追記その2

UIDevice.identifierForVendorとASIdentifierManager.advertisingIdentifierはデバイスの初期化等で再生成され、値が変化する可能性がある。値が変化するタイミングについては、現在調査を進めている。