我们的应用程序发布了一些小更新,此版本还通过Apple支持将其App ID从唯一ID更改为我们的团队ID.
According to Apple,更改为使用Team ID应该只重置keychain访问权限,我们不使用keychain因此它不应该对我们的应用程序产生任何影响.
但是自从更新发布以来,我们的一些生产用户的应用数据已经损坏.只有当他们使用通知中心或锁定屏幕中的操作按钮响应本地通知时才会发生这种情况.它可能发生在所有支持的iOS版本上.
遇到此问题的用户有另一种症状,他们会收到两个本地通知,而不只是一个,但应用只会看到一个通知.此外,使用[[UIApplication sharedApplication] cancelAllLocalNotifications]禁用通知和取消后,这些通知仍然不会消失.
这些重复通知是在应用程序从App Store更新之前安排的,但在更新应用程序失去对某些用户的控制权之后.该问题在in this question中有详细描述.
最大的线索可能在于从Apple收到的崩溃报告 –
Incident Identifier: ED0E9C.............74B38C CrashReporter Key: ae05b............dbc46 Hardware Model: iPhone4,1 Process: MY_APP [444] Path: /private/var/mobile/Containers/Bundle/Application/65324..................8616/MY_APP.app/MY_APP Identifier: com.mycompany.myapp Version: X.X Code Type: ARM (Native) Parent Process: launchd [1] Date/Time: 2015-10-27 21:45:24.24 -0500 Launch Time: 2015-10-27 21:45:20.20 -0500 OS Version: iOS 9.1 (13B143) Report Version: 104 Exception Type: EXC_CRASH (SIGABRT) Exception Codes: 0x0000000000000000,0x0000000000000000 Exception Note: EXC_CORPSE_NOTIFY Triggered by Thread: 0 Last Exception Backtrace: 0 CoreFoundation 0x244b3676 __exceptionPreprocess + 122 (NSException.m:162) 1 libobjc.A.dylib 0x3582ee12 objc_exception_throw + 34 (objc-exception.mm:531) 2 CoreFoundation 0x244b354c +[NSException raise:format:arguments:] + 100 (NSException.m:131) 3 Foundation 0x25240bc4 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 88 (NSException.m:152) 4 UIKit 0x28840754 -[UIApplication _runWithMainScene:transitionContext:completion:] + 2928 (UIApplication.m:3299) 5 UIKit 0x28853a48 __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke3218 + 32 (UIApplication.m:11920) 6 UIKit 0x2883d71e -[UIApplication workspaceDidEndTransaction:] + 130 (UIApplication.m:2648) 7 FrontBoardServices 0x2c52dca2 -[FBSSerialQueue _performNext] + 226 (FBSSerialQueue.m:157) 8 FrontBoardServices 0x2c52df94 -[FBSSerialQueue _performNextFromRunLoopSource] + 44 (FBSSerialQueue.m:204) 9 CoreFoundation 0x24476bfa __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 10 (CFRunLoop.c:1761) 10 CoreFoundation 0x244767e8 __CFRunLoopDoSources0 + 448 (CFRunLoop.c:1807) 11 CoreFoundation 0x24474b56 __CFRunLoopRun + 790 (CFRunLoop.c:2536) 12 CoreFoundation 0x243c8114 CFRunLoopRunSpecific + 516 (CFRunLoop.c:2814) 13 CoreFoundation 0x243c7f00 CFRunLoopRunInMode + 104 (CFRunLoop.c:2844) 14 UIKit 0x28610208 -[UIApplication _run] + 520 (UIApplication.m:2489) 15 UIKit 0x2860af10 UIApplicationMain + 140 (UIApplication.m:3665) 16 MY_APP 0xc4972 main + 22 (main.m:14) 17 libdyld.dylib 0x35f9d86e tlv_get_addr + 42 (threadLocalHelpers.s:310)
它具有与this question完全相同的堆栈跟踪,当用户响应推送通知时会发生这种情况.应用加载期间崩溃可能会解释已损坏的应用数据.
正如堆栈跟踪中所见,这次崩溃不是由我们的代码引起的,我们没有更改代码中的任何内容,它在应用程序ID更改之前一直运行良好,并且它发生在~2%的用户中.
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void (^)())completionHandler { @try { if (notification) { NSDate *alarmTime = notification.userInfo ? [notification.userInfo objectForKey:@"time"] : nil; [logic saveAlarmTime:alarmTime takenAt:[NSDate date]]; } } @catch (NSException *exception) { NSLog(@"Exception: %@",[exception description]); } @finally { completionHandler(); } }
是什么导致这次崩溃?
(我知道它被抛入 – [UIApplication _runWithMainScene:transitionContext:completion:] 2928(UIApplication.m:3299),问题是那里导致崩溃的原因.)