ObjecTips

Swift & Objective-C で iOS とか macOS とか

iOS 8.3 to iOS 9.0 API Differences CoreTelephony

まだWWDCのネットワーク系のビデオを見ていないので紹介されているか分からないけど、たぶんされていないであろう CoreTelephony の変更点について。

関連記事は以下
iOS 8.3 to iOS 9.0 API Differences Core Image - ObjecTips
iOS 8.3 to iOS 9.0 API Differences オーディオ周り - ObjecTips
iOS 8.3 to iOS 9.0 API Differences ネットワークとWeb周り - ObjecTips
iOS 8.3 to iOS 9.0 API Differences CoreLocation - ObjecTips
iOS 8.3 to iOS 9.0 API Differences CoreTelephony - ObjecTips

CoreTelephony

CTCellularData

追加されたクラスは CTCellularData のみで メソッドは以下の2つ

@property (copy, nullable) CellularDataRestrictionDidUpdateNotifier cellularDataRestrictionDidUpdateNotifier __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_9_0);
@property (nonatomic, readonly) CTCellularDataRestrictedState restrictedState __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_9_0);

現時点でドキュメント無いが、ヘッダに

cellular data allowed policy for the app

との記述があった。
アプリがセルラーデータ(モバイルデータ通信)の利用を許可されているかどうかについて調べられる事ができるクラスらしい。
コードを書いて試してみた。

CTCellularData を作成した直後に restrictedState を取得しようとした場合 kCTCellularDataRestrictedStateUnknown が返される。
正しいステータスを取得するには cellularDataRestrictionDidUpdateNotifier を用いてステータスの変更を受け取る。 変更通知後なら CTCellularDataインスタンスからステータスを取得しても正しく値を取得できる。
変更通知のステータスは CTCellularDataRestrictedStatekCTCellularDataNotRestricted が取得できる。

まず初期状態として、アプリがモバイルデータでの通信をした事が無い場合には kCTCellularDataNotRestricted が返されアプリはモバイルデータでの通信を許可されている状態になる。

次にアプリでのモバイルデータ通信の利用許可を切り替えてみる。
設定 > モバイルデータ通信 を開き「モバイルデータ通信を使用」の項目を探す。

画面は iOS 8 のもの

f:id:Koze:20150618222208p:plain

1度もモバイルデータ通信を行った事のないアプリはリストに出て来ないので、Wi-Fiをオフにしてアプリ内でWebビューを表示するなり NSURLSesison を使うなりしてモバイルデータ通信を発生させる。
アプリがモバイルデータ通信を利用すると「モバイルデータ通信を使用」の一覧にアプリが表示されるのでスイッチをオフに切り替えてアプリに戻る。
アプリに戻ると上のコードで登録した通知に kCTCellularDataRestricted が返ってくる。

iPod touchiPad Wi-Fi モデルでこのAPIを使うとステータスはどうなるかが気になる。Unknown なのかデフォルトの NotRestricted なのか、、
まだ iPhone しか iOS 9 にしていないので試せていない。