web-dev-qa-db-ja.com

iOS 13 Killingアプリは、PushKit VoIPコールバックを受信した後にシステムに着信を投稿しなかったため

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着信画面を投稿する必要がありますか?着信があるときに画面を表示する前に、通知が有効かどうかを確認しているので、おかしく聞こえます。誰かが私が何をすべきかを説明できますか?

16
Marina

この スレッド から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に設定し、alertbadgeおよびsound。この通知は、バックグラウンドでアプリを起動し、アプリのデリゲートのdidReceiveRemoteNotificationを呼び出します。

このオプションの欠点は、非常に迷惑です。

  • 実行には30秒しかかかりません。
  • これらの通知のapns-priorityは5である必要があります。これにより、通知がグループ化されてバーストで配信されたり、スロットルされたり配信されなかったりする場合があります。
  • ユーザーがアプリを強制的に閉じると、ユーザーが再びアプリを開くまで、すべてのサイレント通知が完全に無視されます。
29
pepsy