IOSベータ13にアップグレードした後、不愉快なことに気づきました。着信VoIPプッシュでアプリがクラッシュすることがあります。
クラッシュレポートには次のように表示されます。
iOS 13 Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP callback
Fatal Exception: NSInternalInconsistencyException
0 CoreFoundation 0x1af21b9f0 __exceptionPreprocess
1 libobjc.A.dylib 0x1af7284fc objc_exception_throw
2 CoreFoundation 0x1af11efec +
[_CFXNotificationTokenRegistration keyCallbacks]
3 Foundation 0x1aeda1330 -[NSAssertionHandler
handleFailureInMethod:object:file:lineNumber:description:]
4 PushKit 0x19caa6b54 -[PKPushRegistry
_terminateAppIfThereAreUnhandledVoIPPushes]
5 libdispatch.dylib 0x1afa441ec _dispatch_client_callout
6 libdispatch.dylib 0x1af9f6c6c
_dispatch_lane_barrier_sync_invoke_and_complete
7 PushKit 0x19caa5b74 __73-[PKPushRegistry
voipPayloadReceived:mustPostCall:withCompletionHandler:]_block_invoke
8 libdispatch.dylib 0x1afa43678
_dispatch_call_block_and_release
9 libdispatch.dylib 0x1afa441ec
_dispatch_client_callout
10 libdispatch.dylib 0x1af9f61f8
_dispatch_main_queue_callback_4CF$VARIANT$mp
11 CoreFoundation 0x1af1992a0
CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE
12 CoreFoundation 0x1af1942a8 __CFRunLoopRun
13 CoreFoundation 0x1af1937ac CFRunLoopRunSpecific
14 GraphicsServices 0x1ae395180 GSEventRunModal
15 UIKitCore 0x1b6e60244 UIApplicationMain
16 VOIPProject 0x1009822d8 main + 25
(AppDelegate.Swift:25)
17 libdyld.dylib 0x1af6e9e7c start
問題の修正方法がわかりません。 VoIPプッシュを受信するたびにCallKit着信画面を投稿する必要がありますか?着信があるときに画面を表示する前に、通知が有効かどうかを確認しているので、おかしく聞こえます。誰かが私が何をすべきかを説明できますか?
この スレッド からAppleフォーラム、Appleスタッフからの誰かがこれを説明しました:
IOS 13.0以降では、着信Voice over IPコールは、受信されたとき、およびCallReitIncomingPush()メソッドがCallKitフレームワークを使用して実行を完了する前に報告する必要があります。そうしないと、システムがアプリを終了します。
呼び出しの報告に繰り返し失敗すると、アプリがそれ以上の着信通知を受信できなくなる場合があります。
基本的に、非VoIPメッセージングにVoIPプッシュを使用することはできなくなり、それらには通常のプッシュ通知を使用する必要があります。
これは、WWDCセッション「アプリバックグラウンド実行の進歩」中に発表されました https://developer.Apple.com/videos/play/wwdc2019/707/
私はこの変更にアプリを適応させる方法についての回答を探してきました。私が収集できるのは次のとおりです。
Voip Pushes
アプリがこの種のプッシュを受信したら、CallKitを使用して新しい着信を報告する必要があります。したがって、この種類のプッシュは、CallKitを使用する呼び出し専用です。
通知のapns-expiration
を0に設定することをお勧めします。これにより、プッシュを受信せず、すでに期限切れになった通話に対して通話画面を提示するように強制されます。
プッシュ通知
定期的なプッシュ通知は別のオプションです。サーバーに通知テキストを書き込むために必要なすべての情報がある場合は、バックグラウンドでアプリを実行することさえない通知を送信できます。通知の内容をユーザーに提示する前に変更する必要がある場合は、通知サービスアプリ拡張機能を使用できます。アプリを起動して何かをバックグラウンドで実行する必要がある場合は、サイレントプッシュ通知を送信できます。
Notification Service App Extension
これを使用するには、通知のmutable-content
を1に設定する必要があります。これにより、拡張機能はユーザーに提示される前に通知を受信し、30秒の制限時間でコンテンツを変更できます。
短所は、アプリがバックグラウンドに留まり、拡張機能だけが実行を許可されることです。これは、ユーザーのデフォルト、キーチェーンを使用するか、データベース全体を共有することによって、アプリと拡張機能の間で情報とコードを共有する必要があることを意味する場合があります(アプリがそのために準備されていない場合、これは簡単なタスクではない可能性があります)。 。
サイレントプッシュ通知
サイレントプッシュ通知を送信するには、通知のcontent-available
を1に設定し、alert、badgeおよびsound。この通知は、バックグラウンドでアプリを起動し、アプリのデリゲートのdidReceiveRemoteNotification
を呼び出します。
このオプションの欠点は、非常に迷惑です。
apns-priority
は5である必要があります。これにより、通知がグループ化されてバーストで配信されたり、スロットルされたり配信されなかったりする場合があります。