UIAlertViewとUIAlertControllerの判別方法を誤るとクラッシュします
iOS7対応のアプリをSwiftで開発する時の話です。
元ネタはこちら。
swift - UIAlertView is crashing app on iOS 7 - Stack Overflow
上記記事にあるように、下記のソースコードでiOS7,8の判定をしてはいけません。
if let gotModernAlert: AnyClass = NSClassFromString("UIAlertController") { //iOS 8 } else { //iOS 7 }
iOS7端末で上記ソースコードありの状態でipaファイルを作ってAdHocして動かすと、クラスがないはずなのにあることになって、UIAlertControllerがnilなのでクラッシュしてしまいます。Swift自体のバグっぽい.. Xcode 6.1.1 (6A2008a)で確認し、Archiveしたビルドでクラッシュします。デバイスつなげてRun Buildではクラッシュしなかったかな...このような微妙な違いが大きな違いになってしまうのがスマホアプリの怖い所...
正しくはこちらの記事にあるようにobc_getClassを使います。これでクラッシュを回避出来ました。
SwiftでUIAlertController(iOS8以降)とUIAlertView(iOS7以前)を使い分ける - Qiita
if objc_getClass("UIAlertController") != nil { } else { }
スマホアプリ怖いです。Webアプリの何倍も注意が必要です。勉強になりました....