iOS8でアプリ起動時にクラッシュする問題が発生
iPhoneXやXcode9.2、iOS11.2など最新ばかり対応していて疎かになっちゃう、各サービスでサポートギリギリのiOS8で動作確認した時のことです。
dyld: Symbol not found: _NSArray0
Referenced from: /private/var/mobile/Containers/Bundle/Application/8B40C8BE-5816-495B-98BF-2E43A2B4009B/soundATM.app/soundATM
Expected in: /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation
in /private/var/mobile/Containers/Bundle/Application/8B40C8BE-5816-495B-98BF-2E43A2B4009B/soundATM.app/soundATM
(lldb)
上記のログは、Crash on iOS on load "dyld: Symbol not found: __NSArray0_"の一部から参照したものですが、どうもReact界隈でもここ1年以内に確認されているようですね。
調べてみた
iOS 9.2 SDK以降でビルドする際に、iOS8もサポートしたいならCoreFoundation.frameworkを設定しないとクラッシュすることになっているようです。
- iOS 8をサポートしているときにiOS 9 SDKを使用する
-
CoreFoundation Changes for Objective-C
- iOS9から追加された関数(もしかしたらこの辺がiOS8がサポートされる機能に何か関係するのかも)
- - CFURLCreate ストリングによって追加パーセントエスケープ(::::_を:)
- - エンコーディングを使用してパーセントエスケープを置き換えることによってCFURLCreate 文字列を生成する(::: :)
※Apple Developer Forumsで検索してもちゃんとした回答が見つかりませんでした。
まとめ
憶測に過ぎませんが、
コンパイラの変更
64ビットデバイスにロードされた32ビットバイナリは、32ビットページサイズが4096バイトから16384バイトに変更されたため、実行できません。
iOS 8をサポートしているときにiOS 9 SDKを使用する
@ []
を使用している場合、iOS 8デバイスでクラッシュする可能性があります。これを修正するには、代わりに[[NSArray alloc] init]
を使用してください。
と、iOS 9の拡張機能のアップデートで解説されているため、チップやデバイス性能にも関わっているのかもしれない。
A8チップまでアーキテクチャが32ビット製だったようですが、A9チップから64ビット製のアーキテクチャとして大幅にアップグレードされています。
もしかするとiOS8が入っているiPhoneSEやiPhone6sなどのA9以上のチップが搭載されたデバイスでは、このクラッシュする問題は起きないカモです。(あ、そもそもそんな端末ないか笑
また、もしiOS9の頃から開発していたものでこれを確認された場合は、@ []
が何なのかをちゃんと調べて、その内容が開発しているもので各バージョンの差分を追って、理論付する調査が必要かなとも思いました。
僕は、@ []
が何なのかiOS Developerじゃないのでわかりません(もともとAndroid Developerだったもので笑