Было выпущено незначительное обновление нашего приложения, эта версия также изменила идентификатор приложения с уникального идентификатора на идентификатор нашей команды службой поддержки Apple.
Согласно Apple, переход на использование Team ID должен только сбросить доступ к связке ключей, мы не используем связку ключей, поэтому это не должно влиять на наше приложение.
Но с тех пор как обновление было выпущено, некоторые наши рабочие пользователи столкнулись с повреждением данных своих приложений. Это происходит только тогда, когда они реагируют на локальное уведомление с помощью кнопки действия в Центре уведомлений или на экране блокировки. Это может произойти на всех поддерживаемых версиях iOS.
У пользователей, сталкивающихся с этим, есть еще один симптом: они получают два локальных уведомления вместо одного, но приложение видит только одно уведомление. Кроме того, эти уведомления по-прежнему не исчезнут после отключения уведомлений и отмены с помощью [[UIApplication sharedApplication] cancelAllLocalNotifications]
.
Эти повторяющиеся уведомления были запланированы до того, как приложение было обновлено из App Store, но после обновления приложение потеряло контроль над ними для некоторых пользователей. Эта проблема подробно описана в этом вопрос.
Самая большая подсказка может заключаться в отчетах о сбоях, полученных от 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)
Трассировка стека точно такая же, как в этом вопросе, что происходит, когда пользователи отвечают на push-уведомление. Сбой во время загрузки приложения может объяснить повреждение данных приложения.
Как видно из трассировки стека, этот сбой не вызван нашим кодом, мы ничего не меняли в коде, он работал хорошо до изменения идентификатора приложения, и это происходит примерно с 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)
, вопрос в том, что там вызывает сбой.)
[window addSubview:viewController.view];
вместо[window setRootViewController:viewController];
? Это не решает проблему с двумя уведомлениями, но, возможно, это обе ошибки/обновления Xcode 7. - person medvedNick   schedule 03.11.2015removeObserver:
вdealloc
этих объектов Observer. И stackoverflow.com /вопросы/26371462/ - person tuledev   schedule 03.11.2015