iOS 13 がリリースされ、既存のアプリで問題が発生しているようなので、気づいたことをメモしたいと思います。
##iOS 13 での問題
- iPhone の電話履歴からVoIPアプリで発信できない
- iPad OS 13 で、UIDocumentInteractionController で開く共有の画面が正しく表示されない
##iPhone の電話履歴からVoIPアプリで発信できない
iPhone の電話帳や履歴から発信した場合、VoIP アプリの application(_:continue:restorationHandler:) が呼び出されます。
音声通話であれば INStartAudioCallIntent、ビデオ通話であれば INStartVideoCallIntent が userActivity.interaction.intent に渡されます。
いえ、iOS 12 までは渡されていました・・・
iOS 13 では INStartCallIntent が渡されてくるようになりました。
音声かビデオかを判断するのは Intent の種類ではなく、INStartCallIntent.callCapability で判断するようになります。
この渡される Intent が変更された件、困ったことに xcoode 11(iOS13 SDK) でビルドしたものではなく、xcode 10.x でビルドしたアプリも同じです・・・
VoIP アプリでは application(_:continue:restorationHandler:) に渡されてくる Intent から contacts を取得します。
Swift の場合、Intent をキャストした際、型が合わないと nil となりますが、Objective-C の場合、キャストしてもエラーにならず、存在しないメンバにアクセスした際に初めてエラーとなります。
したがって、contacts は INStartAudioCallIntent も INStartCallIntent にも含まれているため、Objective-C で書かれたプログラムでは書き方次第では iOS 13 でも動いているようです。
###2020/02/12 追記
あれ?
iOS 13.2.x では、userActivity.activityType が "INStartAudioCallIntent" になっていますね。。。
iOS 13.1.x では、INStartCallIntent だったのですが、Apple が修正したのでしょうか・・・?
##iPad OS 13 で、UIDocumentInteractionController で開く共有の画面が正しく表示されない
ファイルや写真などを他のアプリに共有する際に使用する UIDocumentInteractionController ですが、よくある書き方として以下のようなコードが散見されます。
uiDocumentInteractionController.presentOpenInMenu(from: view.frame, in: view, animated: true)
UITabBarController に追加した ViewController の中でこのコードを実行すると、iPad OS 13 では、共有先選択画面が Tab のところに小さくなって表示されます。
View の下端に表示しようとするが、Tab の高さしかないため縦が小さくなっているのではないかと思われます。
よって、iPad OS 13 対応するためには、from と in に上の方にあるコントロールを指定する工夫が必要なようです。(バグとして iOS 側で修正が入るかもしれませんが・・・)
しかし、from と in を上方のコントロールに指定して、xcode 10.x でビルドしたところ、iPhone (iOS 13) では共有先選択画面が全画面表示してしまいました。。。
まぁ、見えないよりぜんぜん良いのですけどね。。。
ちなみに同じコードを xcode 11 でビルドすると、いつものように下半分くらいに共有先選択画面が表示されます。。。
Apple さん・・・・・