6

ミステリアスなアプリのクラッシュをバグハンティングしてから 2 週間を無駄にしただけなので、何時間ものデバッグから解放されます。UNUserNotificationCenter多くの o (詳細については回答を参照) 通知要求を に追加すると、Springboard が突然クラッシュすることが判明しました。同じコードが iOS 9 以下で正常に機能したため、これを回避する方法はまだ見つかっていません。以前のように通知リクエストを一括追加することもできないようです。以下は、私が毎回受け取るクラッシュです (何百人ものアプリ ユーザーもそうです)。s の使用に戻る代わりに、何ができるか考えていUILocalNotificationますか?

Incident Identifier: 17BC9D5B-AF74-4592-8427-038375C27AE7
CrashReporter Key:   a819553d1e72ee25a5ced9ddc79dbf00a7d3851f
Hardware Model:      iPad5,3
Process:             SpringBoard [2371]
Path:                /System/Library/CoreServices/SpringBoard.app/SpringBoard
Identifier:          com.apple.springboard
Version:             50 (1.0)
Code Type:           ARM-64 (Native)
Role:                Foreground
Parent Process:      launchd [1]
Coalition:           com.apple.springboard [71]


Date/Time:           2016-11-16 14:57:04.9159 +0400
Launch Time:         2016-11-16 14:49:20.9981 +0400
OS Version:          iPhone OS 10.0 (14A5309d)
Report Version:      104

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Triggered by Thread:  13

Filtered syslog:
None found

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0:
0   libsystem_kernel.dylib          0x0000000180624194 mach_msg_trap + 8
1   libsystem_kernel.dylib          0x0000000180624004 mach_msg + 72
2   CoreFoundation                  0x0000000180a61e8c __CFRunLoopServiceMachPort + 192
3   CoreFoundation                  0x0000000180a5faa8 __CFRunLoopRun + 1132
4   CoreFoundation                  0x000000018098f8d8 CFRunLoopRunSpecific + 444
5   GraphicsServices                0x0000000182396198 GSEventRunModal + 180
6   UIKit                           0x00000001869327c8 -[UIApplication _run] + 664
7   UIKit                           0x000000018692d534 UIApplicationMain + 208
8   libdyld.dylib                   0x00000001805305b8 start + 4

Thread 1 name:  com.apple.uikit.eventfetch-thread
Thread 1:
0   libsystem_kernel.dylib          0x0000000180624194 mach_msg_trap + 8
1   libsystem_kernel.dylib          0x0000000180624004 mach_msg + 72
2   CoreFoundation                  0x0000000180a61e8c __CFRunLoopServiceMachPort + 192
3   CoreFoundation                  0x0000000180a5faa8 __CFRunLoopRun + 1132
4   CoreFoundation                  0x000000018098f8d8 CFRunLoopRunSpecific + 444
5   Foundation                      0x000000018142ce3c -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 304
6   Foundation                      0x000000018144d92c -[NSRunLoop(NSRunLoop) runUntilDate:] + 96
7   UIKit                           0x000000018727af2c -[UIEventFetcher threadMain] + 136
8   Foundation                      0x00000001815293ac __NSThread__start__ + 1024
9   libsystem_pthread.dylib         0x00000001807079ec _pthread_body + 240
10  libsystem_pthread.dylib         0x00000001807078fc _pthread_body + 0
11  libsystem_pthread.dylib         0x0000000180704ef8 thread_start + 4

Thread 2:
0   libsystem_kernel.dylib          0x0000000180624194 mach_msg_trap + 8
1   libsystem_kernel.dylib          0x0000000180624004 mach_msg + 72
2   CoreFoundation                  0x0000000180a61e8c __CFRunLoopServiceMachPort + 192
3   CoreFoundation                  0x0000000180a5faa8 __CFRunLoopRun + 1132
4   CoreFoundation                  0x000000018098f8d8 CFRunLoopRunSpecific + 444
5   Foundation                      0x000000018142ce3c -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 304
6   Foundation                      0x0000000181481584 -[NSRunLoop(NSRunLoop) run] + 88
7   UIKit                           0x0000000186f73298 -[UIStatusBarServerThread main] + 840
8   Foundation                      0x00000001815293ac __NSThread__start__ + 1024
9   libsystem_pthread.dylib         0x00000001807079ec _pthread_body + 240
10  libsystem_pthread.dylib         0x00000001807078fc _pthread_body + 0
11  libsystem_pthread.dylib         0x0000000180704ef8 thread_start + 4

Thread 3:
0   libsystem_kernel.dylib          0x0000000180624194 mach_msg_trap + 8
1   libsystem_kernel.dylib          0x0000000180624004 mach_msg + 72
2   CoreFoundation                  0x0000000180a61e8c __CFRunLoopServiceMachPort + 192
3   CoreFoundation                  0x0000000180a5faa8 __CFRunLoopRun + 1132
4   CoreFoundation                  0x000000018098f8d8 CFRunLoopRunSpecific + 444
5   Foundation                      0x000000018142ce3c -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 304
6   CoreBrightness                  0x0000000190ec5d10 -[BrightnessSystemClientInternal main] + 1392
7   Foundation                      0x00000001815293ac __NSThread__start__ + 1024
8   libsystem_pthread.dylib         0x00000001807079ec _pthread_body + 240
9   libsystem_pthread.dylib         0x00000001807078fc _pthread_body + 0
10  libsystem_pthread.dylib         0x0000000180704ef8 thread_start + 4

Thread 4:
0   libsystem_kernel.dylib          0x0000000180624194 mach_msg_trap + 8
1   libsystem_kernel.dylib          0x0000000180624004 mach_msg + 72
2   CoreFoundation                  0x0000000180a61e8c __CFRunLoopServiceMachPort + 192
3   CoreFoundation                  0x0000000180a5faa8 __CFRunLoopRun + 1132
4   CoreFoundation                  0x000000018098f8d8 CFRunLoopRunSpecific + 444
5   SpringBoard                     0x00000001001a0b00 0x1000f0000 + 723712
6   libsystem_pthread.dylib         0x00000001807079ec _pthread_body + 240
7   libsystem_pthread.dylib         0x00000001807078fc _pthread_body + 0
8   libsystem_pthread.dylib         0x0000000180704ef8 thread_start + 4

Thread 5 name:  com.apple.springboard.icongeneration
Thread 5:
0   libsystem_kernel.dylib          0x0000000180624194 mach_msg_trap + 8
1   libsystem_kernel.dylib          0x0000000180624004 mach_msg + 72
2   CoreFoundation                  0x0000000180a61e8c __CFRunLoopServiceMachPort + 192
3   CoreFoundation                  0x0000000180a5faa8 __CFRunLoopRun + 1132
4   CoreFoundation                  0x000000018098f8d8 CFRunLoopRunSpecific + 444
5   SpringBoard                     0x00000001001a0c00 0x1000f0000 + 723968
6   libsystem_pthread.dylib         0x00000001807079ec _pthread_body + 240
7   libsystem_pthread.dylib         0x00000001807078fc _pthread_body + 0
8   libsystem_pthread.dylib         0x0000000180704ef8 thread_start + 4

Thread 6 name:  com.apple.CoreMotion.MotionThread
Thread 6:
0   libsystem_kernel.dylib          0x0000000180624194 mach_msg_trap + 8
1   libsystem_kernel.dylib          0x0000000180624004 mach_msg + 72
2   CoreFoundation                  0x0000000180a61e8c __CFRunLoopServiceMachPort + 192
3   CoreFoundation                  0x0000000180a5faa8 __CFRunLoopRun + 1132
4   CoreFoundation                  0x000000018098f8d8 CFRunLoopRunSpecific + 444
5   CoreFoundation                  0x00000001809dd094 CFRunLoopRun + 112
6   CoreMotion                      0x0000000187762994 0x187702000 + 395668
7   libsystem_pthread.dylib         0x00000001807079ec _pthread_body + 240
8   libsystem_pthread.dylib         0x00000001807078fc _pthread_body + 0
9   libsystem_pthread.dylib         0x0000000180704ef8 thread_start + 4

Thread 7 name:  SBWiFiManager callback thread
Thread 7:
0   libsystem_kernel.dylib          0x0000000180624194 mach_msg_trap + 8
1   libsystem_kernel.dylib          0x0000000180624004 mach_msg + 72
2   CoreFoundation                  0x0000000180a61e8c __CFRunLoopServiceMachPort + 192
3   CoreFoundation                  0x0000000180a5faa8 __CFRunLoopRun + 1132
4   CoreFoundation                  0x000000018098f8d8 CFRunLoopRunSpecific + 444
5   Foundation                      0x000000018142ce3c -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 304
6   Foundation                      0x0000000181481584 -[NSRunLoop(NSRunLoop) run] + 88
7   SpringBoard                     0x0000000100215e44 0x1000f0000 + 1203780
8   Foundation                      0x00000001815293ac __NSThread__start__ + 1024
9   libsystem_pthread.dylib         0x00000001807079ec _pthread_body + 240
10  libsystem_pthread.dylib         0x00000001807078fc _pthread_body + 0
11  libsystem_pthread.dylib         0x0000000180704ef8 thread_start + 4

Thread 8:
0   libsystem_kernel.dylib          0x0000000180624194 mach_msg_trap + 8
1   libsystem_kernel.dylib          0x0000000180624004 mach_msg + 72
2   CoreFoundation                  0x0000000180a61e8c __CFRunLoopServiceMachPort + 192
3   CoreFoundation                  0x0000000180a5faa8 __CFRunLoopRun + 1132
4   CoreFoundation                  0x000000018098f8d8 CFRunLoopRunSpecific + 444
5   Foundation                      0x000000018142ce3c -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 304
6   HomeKit                         0x00000001913e8974 -[_HMLocationHandler createLocationManager] + 508
7   Foundation                      0x00000001815293ac __NSThread__start__ + 1024
8   libsystem_pthread.dylib         0x00000001807079ec _pthread_body + 240
9   libsystem_pthread.dylib         0x00000001807078fc _pthread_body + 0
10  libsystem_pthread.dylib         0x0000000180704ef8 thread_start + 4

Thread 9:
0   libsystem_kernel.dylib          0x0000000180624194 mach_msg_trap + 8
1   libsystem_kernel.dylib          0x0000000180624004 mach_msg + 72
2   CoreFoundation                  0x0000000180a61e8c __CFRunLoopServiceMachPort + 192
3   CoreFoundation                  0x0000000180a5faa8 __CFRunLoopRun + 1132
4   CoreFoundation                  0x000000018098f8d8 CFRunLoopRunSpecific + 444
5   Foundation                      0x000000018142ce3c -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 304
6   CoreBrightness                  0x0000000190ec5d10 -[BrightnessSystemClientInternal main] + 1392
7   Foundation                      0x00000001815293ac __NSThread__start__ + 1024
8   libsystem_pthread.dylib         0x00000001807079ec _pthread_body + 240
9   libsystem_pthread.dylib         0x00000001807078fc _pthread_body + 0
10  libsystem_pthread.dylib         0x0000000180704ef8 thread_start + 4

Thread 10 name:  CommonUtilities-WiFi-Thread
Thread 10:
0   libsystem_kernel.dylib          0x0000000180624194 mach_msg_trap + 8
1   libsystem_kernel.dylib          0x0000000180624004 mach_msg + 72
2   CoreFoundation                  0x0000000180a61e8c __CFRunLoopServiceMachPort + 192
3   CoreFoundation                  0x0000000180a5faa8 __CFRunLoopRun + 1132
4   CoreFoundation                  0x000000018098f8d8 CFRunLoopRunSpecific + 444
5   CoreFoundation                  0x00000001809dd094 CFRunLoopRun + 112
6   CommonUtilities                 0x0000000182d10c20 0x182d0a000 + 27680
7   Foundation                      0x00000001815293ac __NSThread__start__ + 1024
8   libsystem_pthread.dylib         0x00000001807079ec _pthread_body + 240
9   libsystem_pthread.dylib         0x00000001807078fc _pthread_body + 0
10  libsystem_pthread.dylib         0x0000000180704ef8 thread_start + 4

Thread 11:
0   libsystem_kernel.dylib          0x0000000180642a88 __workq_kernreturn + 8
1   libsystem_pthread.dylib         0x000000018070549c _pthread_wqthread + 1440
2   libsystem_pthread.dylib         0x0000000180704ef0 start_wqthread + 4

Thread 12:
0   libsystem_kernel.dylib          0x0000000180642a88 __workq_kernreturn + 8
1   libsystem_pthread.dylib         0x000000018070549c _pthread_wqthread + 1440
2   libsystem_pthread.dylib         0x0000000180704ef0 start_wqthread + 4

Thread 13 name:  Dispatch queue: com.apple.frontboard.sqlite.database
Thread 13 Crashed:
0   libsystem_kernel.dylib          0x0000000180642014 __pthread_kill + 8
1   libsystem_pthread.dylib         0x00000001807094f0 pthread_kill + 112
2   libsystem_c.dylib               0x00000001805b64b8 abort + 140
3   libsystem_malloc.dylib          0x0000000180686a38 _nano_vet_and_size_of_live + 0
4   libsystem_malloc.dylib          0x0000000180687db8 nano_free + 220
5   libsqlite3.dylib                0x000000018103a5f8 0x180f95000 + 677368
6   libsqlite3.dylib                0x0000000180fbac9c 0x180f95000 + 154780
7   libsqlite3.dylib                0x0000000180fe6074 0x180f95000 + 331892
8   libsqlite3.dylib                0x0000000180fd70b0 sqlite3_step + 588
9   FrontBoard                      0x0000000190312ee4 __79-[_FBSqlitePreparedSimpleStatement executeWithBindings:resultRowHandler:error:]_block_invoke + 424
10  libdispatch.dylib               0x00000001804fd784 _dispatch_client_callout + 16
11  libdispatch.dylib               0x000000018050aca4 _dispatch_barrier_sync_f_invoke + 84
12  FrontBoard                      0x000000019031e0d0 -[FBSqliteDatabaseConnection performSyncWithDatabase:] + 80
13  FrontBoard                      0x0000000190312cbc -[_FBSqlitePreparedSimpleStatement executeWithBindings:resultRowHandler:error:] + 148
14  FrontBoard                      0x000000019035a4d8 -[FBSqliteApplicationDataStoreRepository _dbQueue_executeStatement:bindings:resultRowHandler:error:] + 80
15  FrontBoard                      0x000000019035a538 -[FBSqliteApplicationDataStoreRepository _dbQueue_executeStatement:bindings:resultRowHandler:] + 72
16  FrontBoard                      0x0000000190359374 -[FBSqliteApplicationDataStoreRepository _dbQueue_objectForKey:forApplication:] + 504
17  FrontBoard                      0x0000000190357a34 __81-[FBSqliteApplicationDataStoreRepository objectForKey:forApplication:withResult:]_block_invoke.44 + 40
18  libdispatch.dylib               0x00000001804fd784 _dispatch_client_callout + 16
19  libdispatch.dylib               0x000000018050aca4 _dispatch_barrier_sync_f_invoke + 84
20  FrontBoard                      0x0000000190357990 -[FBSqliteApplicationDataStoreRepository objectForKey:forApplication:withResult:] + 92
21  FrontBoard                      0x000000019038a5cc -[FBApplicationDataStoreInProcessRepositoryClient objectForKey:forApplication:withResult:checkPrefetch:] + 528
22  FrontBoardServices              0x00000001825c3e3c __40-[FBSApplicationDataStore objectForKey:]_block_invoke + 112
23  libdispatch.dylib               0x00000001804fd784 _dispatch_client_callout + 16
24  libdispatch.dylib               0x0000000180508f80 _dispatch_block_invoke_direct + 376
25  BaseBoard                       0x00000001825415a8 -[NSObject(BaseBoard) bs_performSynchronously:timeout:] + 144
26  FrontBoardServices              0x00000001825c3d7c -[FBSApplicationDataStore objectForKey:] + 224
27  FrontBoardServices              0x00000001825c4044 -[FBSApplicationDataStore safeObjectForKey:ofType:] + 32
28  FrontBoardServices              0x00000001825c41d4 -[FBSApplicationDataStore archivedObjectForKey:] + 64
29  FrontBoardServices              0x00000001825c4314 -[FBSApplicationDataStore safeArchivedObjectForKey:ofType:] + 32
30  UserNotificationsServer         0x000000019c52169c -[UNSPendingNotificationRepository _pendingNotificationDictionariesForBundleIdentifier:] + 140
31  UserNotificationsServer         0x000000019c5219d0 -[UNSPendingNotificationRepository setPendingNotificationRecords:forBundleIdentifier:] + 72
32  UserNotificationsServer         0x000000019c5249b4 -[UNSLocalNotificationClient _setPendingNotificationRecords:] + 500
33  UserNotificationsServer         0x000000019c5235c4 -[UNSLocalNotificationClient addPendingNotificationRecords:] + 1124
34  UserNotificationsServer         0x000000019c51d648 -[UNSNotificationSchedulingService _queue_addPendingNotificationRecords:forBundleIdentifier:] + 84
35  UserNotificationsServer         0x000000019c51c6b0 __108-[UNSNotificationSchedulingService addPendingNotificationRecords:forBundleIdentifier:withCompletionHandler:]_block_invoke + 36
36  libdispatch.dylib               0x00000001804fd7c4 _dispatch_call_block_and_release + 24
37  libdispatch.dylib               0x00000001804fd784 _dispatch_client_callout + 16
38  libdispatch.dylib               0x000000018050b880 _dispatch_queue_serial_drain + 928
39  libdispatch.dylib               0x0000000180500f6c _dispatch_queue_invoke + 652
40  libdispatch.dylib               0x000000018050bd7c _dispatch_queue_override_invoke + 360
41  libdispatch.dylib               0x000000018050d718 _dispatch_root_queue_drain + 572
42  libdispatch.dylib               0x000000018050d478 _dispatch_worker_thread3 + 124
43  libsystem_pthread.dylib         0x00000001807053f8 _pthread_wqthread + 1276
44  libsystem_pthread.dylib         0x0000000180704ef0 start_wqthread + 4

更新: 特定の数の通知に基づいているようには見えません。アプリがバックグラウンドにある間に約 30 ~ 40 の通知が登録されていた場合 (プッシュ通知、アプリの更新、アプリがバックグラウンドに移行するなど)、たまたま頻繁にトリガーされました。これらのアラートを非同期に追加するのに通常よりも時間がかかっていたためです。その間、アプリは保持していたバックグラウンド タスク識別子を手放します。これについては、回避策とともに以下で詳しく説明しました。

このバグは Apple によって認識されており、以前に報告されたバグの重複としてマークされています。アプリがバックグラウンドで起動し、すぐにタイムアウトする (バックグラウンド コンテンツの更新中) 特定のエッジ ケースで引き続き問題が発生するため、これが修正されることを願っています。

4

2 に答える 2

4

回避策を見つけました (バグはすでに Apple バグ ID 29286162 で記録されています)

基本的にUNUserNotificationCenter、ユーザーがホーム ボタンを押して SpringBoard に戻る間に が通知の追加でビジーで、それが完了していない場合、SpringBoard がクラッシュするようです。明らかに、何らかの形でスレッドが死んでいます (おそらく、バックグラウンド タスク識別子を手放さなければならないためUNUserNotificationCenter、渡された要求を独自のシステム提供のバックグラウンド スレッドで喜んで消費することを望んでいるため)、進行中の非同期操作をこれにより、Springboard が最終的にクラッシュします。バックグラウンド タスク ( ) でスレッドを生成し、UIBackgroundTaskIdentifierすべての通知の追加が完了するまで保持します。これにより、クラッシュはゼロになります。これは、以前に同じことを訴えていたすべてのユーザーによっても確認されています。

  // arrTasksToSchedule -> holds UNNotificationRequests to add

  __block NSInteger volatile processedAlerts = 0;
  NSInteger totalToProcess = [arrTasksToSchedule count];
  UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
  for (UNNotificationRequest* notifRequest in arrTasksToSchedule) {
    [center addNotificationRequest:notifRequest withCompletionHandler:^(NSError * _Nullable error) {
      processedAlerts++;
    }];
  }

  // Let the runloop carry on processing events till we're done
  while (processedAlerts != totalToProcess) {
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
  }

  // Okay we're done, and can now let go of our held UIBackgroundTaskIdentifier  

ドキュメントには、バックグラウンド タスク、バックグラウンド タスクでの使用の危険性、UNUserNotificationCenterまたは複数のスレッドに関係することなどについては何も書かれていません。ほとんどのアプリが、アプリがバックグラウンドに送信されたとき (またはバックグラウンド コンテンツ更新プッシュ通知)。

Springboard がクラッシュしていたため、アプリ自体のクラッシュ レポートは生成されていませんでした。ユーザーは文句を言い続け、これは手がかりのない非常に困難な状況の 1 つでした。これが誰かの頭痛の種を救うことを願っています。

更新:上記のコードは現在正常に動作していますが、ユーザーがアプリ閉じて電源ボタンを押して画面をオフにした場合、while ループの条件が満たされない可能性があるため、少し変更を加えました。この場合、実行ループは明らかに処理するものがなく、ブロックされます。代わりに、次のようにします。

// Wait in a run loop
while (processedAlerts != totalToProcess) {
  [NSThread sleepForTimeInterval:0.15];

  // Don't use the following, as it will stop firing in case
  // the runloop has no events (such as touch events) firing
  // [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
于 2016-11-16T22:19:06.210 に答える