iOS9対応でやったこと

[NSLocale preferredLanguages]
[NSLocale preferredLanguages]で返ってくる言語設定が
iOS8まで ja
iOS9から ja-US
のようになったので対応。
isEqualToString:@"ja"
から
hasPrefix:@"ja"
へ変更すればOKと思いましたが
ジャマイカ...
が脳裏をよぎり
isEqualToString:@"ja"とhasPrefix:@"ja-"のORにしておきました。


NSManagedObjectContext
[[NSManagedObjectContext alloc] init]が9.0でdeprecatedになったので
[[NSManagedObjectContext alloc] initWithConcurrencyType:]
に変更しようと思ったがConcurrencyTypeの設定が難しすぎて一旦保留。


Requires full screen
iPadアプリで「全方向対応でない場合はRequires full screenをONにするように」というワーニングが出たのでONにする(そのアプリは縦のみ対応)。
このパラメータはSlide OverやSplit Viewで画面の一部の表示をされたくない時にもONにするものらしい。

(追記 : 以下のバグはXcode7.1.1では修正されていました)
ちなみにiOS9.0 Xcode7.0の段階でSlide OverやSplit Viewを有効にするとなぞのバグ(?)があって、
フルスクリーン状態で(Slide OverやSplit View状態ではない)デバイスを回転させて、UIDeviceOrientationDidChangeNotificationを受けた時に
self.view.bounds.size.width
self.view.bounds.size.height
が変更前の状態で取得されてしまって使えなくなるという現象があった。その値を元に全体の要素を配置しているので、縦にすると横の配置になり、横にすると縦の配置になるという現象。
[[UIApplication sharedApplication] statusBarOrientation]も同じように変更前の状態で取得されてしまった。
Xcode7でコンパイルした場合でRequires full screenでデフォルトのOFFの時にこの現象になるのではないかと推測する。
とりあえず問題の起きるアプリはSlide OverやSplit Viewは無効(Requires full screenをON)にした。要調査。


UIView animateWithDuration: delay:options: animations: completion:
UIView animateWithDuration: delay: options: animations: completion:メソッドでアニメーションを実行したとき、アニメーション終了時に呼び出されるメソッド(completion:パラメータで指定する)の引数(アニメーションが正常に終了したかどうかが引数で与えられます)の挙動が変更になった模様。
アニメーションを途中で止めたときに
iOS8まではNO
iOS9からはYES
が渡される。
アニメーションを止めるメソッドはlayerのremoveAllAnimationsメソッドを使用しています。別の方法でアニメーションが強制終了されたときはきちんとNOが返るかもしれないが見つけていない。
これも要調査。


なぞの警告(黄色)対応
Xcodeを7にしたらあるアプリで
directory not found for option '-F/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/Developer/Library/Frameworks'
という警告が出ました。確かにそのディレクトリはなかった。Xcode7にしたら出た警告なので、Xcode6.4ではその場所には何があるか調べたら
Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/Developer/Library/Frameworksという場所にあるSenTestingKit.frameworkというものでした(途中iPhoneOS8.4.sdkからiPhoneOS.sdkにリンク(エイリアス)が貼ってある)。
どうやらXcode7でディレクトリの構成が変わって、存在しないパスを指定していることになってしまったようです。
この存在しないディレクトリを指定しているのはTestターゲットのBuilde SettingsのFramework Search Pathsと思われる。試しに消してみると警告も消えます。

自分で設定した記憶はない(そもそもそんなところ触らない)ので、どの段階で書き込まれたのだろうと思い、過去のプロジェクトの履歴をテキストエディタで調べてみる(Xcodeで開くと勝手に何かを書き換えそうなので)とXcode6あたりでプロジェクトを1から書き直したときに****.pbxprojというファイル(Xcodeプロジェクトを右クリックして中身を見ると出てくる)の中に
FRAMEWORK_SEARCH_PATHS = (
"$(SDKROOT)/Developer/Library/Frameworks",
"$(inherited)",
"$(DEVELOPER_FRAMEWORKS_DIR)",
);
が書き込まれていた。新規でプロジェクトを作る時にテストが有効になって書き込まれたと思います。Xcode5以前でもテストを有効にしていると書き込まれるかもしれません。

ちなみにXcode5ではその場所には
SenTesting.framework
XCTest.framework
があります。
Xcode7ではXCTest.frameworkは
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks
にあります。何も警告などが出ないのでXCTest.frameworkへのリンクはOKなのでしょう。新規でプロジェクトを作るとTestターゲットのBuilde SettingsのFramework Search Pathsは空でした。

また、Xcode 5.1 Release Notesにて
OCUnit and the SenTestingKit framework are deprecated and will be removed from a future release of Xcode.Source code using OCUnit generates warnings while being compiled in Xcode 5.1.
Migrate to XCTest by using the “Edit > Refactor > Convert to XCTest…” menu command. .
を発見。
Convert to XCTest…を試してみるが何も変わらず。

結局TestターゲットのBuilde SettingsのFramework Search PathsからiPhoneos/Developer/Library/Frameworksを削除しておきました。
正式な対応かどうかは定かでないが、存在しないディレクトリを指定するのは無意味 ...

これ以上調べられる人の何かのヒントになれば。

この記事はちょくちょく書き足しているので「だ」「です」が混在してます。

コメント