anz blog

Xcode 9.3 で iOS 8.x をサポートする場合の注意点

2018-05-16 #Xcode

Xcode 9.3 で Deployment target を iOS 8.0 にして開発しているわけだけど、 謎のクラッシュが発生して...なんぞ?となったのでそこら辺の話

URL Scheme でアプリ起動するとクラッシュする!!

です...

環境

  • Xcode v9.3
  • iOS v8.x

問題

何かと便利なので、Custom URL Scheme を導入している方は多いと思いますが...
iOS 8.x をサポートしている場合下記のような記述になりますよね?

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    // 何か処理
    return true
}

これで...
Custom URL Scheme でappというのを指定した場合に
Safariなんかでapp://と入力してやると普通ならアプリが起動してまぁ何か必要な処理ができるはずなのですが...

Xcode 9.3 だとクラッシュします

該当コードをまるっとコメントアウトするなどしたら大丈夫です。
処理の中にブレークポイント貼ってもそこを通ることはありません...クラッシュします😇

対策

ググってたら Firebase のリポジトリでそんな issue が立てられていて...
そこであーだこーだ議論しているなかのうち@LaurentLKさんがコメントしている通りのやつでした。

LaurentLKさんはバグレポートのリンクをはっていますが、Xcode のリリースノートにもちゃっかりかかれていまして...

...Swift Compiler の問題らしい。
annotaion が nil で実行されるからクラッシュするっぽい

ということで対応としては、LaurentLKさんもXcodeのリリースノートにも書かれているとおり

// annotation: Any -> annotation: Any?
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any?) -> Bool {
    // 何か処理
    return true
}

annotation を optional にするだけです...。
Xcode が waning を出してきますが...このままで!その warning は無視で!
(だれのせーでやってるとおもってるんだ!)


iOS 8.x を切っている場合は、そもそもこれが deprecated になっていて
func application(_:,openURL:,options:)の方に書き換えているはずなのでこの問題は起きないはずです。

まぁ...結論としては...iOS 8.x 切って捨てるべきだよね〜〜〜っていうことです。
こちらからは以上です

追記(2018.05.22)

Xcode v9.3.1 が出たので確認してみましたがやっぱりまだクラッシュしますね...
まだまだ「なんでOptionalにてるの!?」という warning と付き合っていかなくちゃ😇

追記(2018.06.01)

Xcode v9.4 で修正されているのを確認しました!
もうこれであの warning から解放されるぞ!💪

参考

Xcode release note
Swift Compilerとかっていう感じで検索してみてください

application:openURL:sourceApplication:annotation: - UIApplicationDelegate | Apple Developer Documentation

application:openURL:options: - UIApplicationDelegate | Apple Developer Documentation

Crash in FIRAAppDelegateProxy application:openURL · Issue #1052 · firebase/firebase-ios-sdk
きっかけをありがとう!issue見つけた瞬間は「おまえか〜💢」って思ってしまってごめん🙏