読者です 読者をやめる 読者になる 読者になる

Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

UIAlertViewとUIAlertControllerの判別方法を誤るとクラッシュします

Swift

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アプリの何倍も注意が必要です。勉強になりました....