Беше пусната малка актуализация на нашето приложение, тази версия също беше променила своя ID на приложението от уникален ID на нашия Team ID от поддръжката на Apple.
According to 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)
Има проследяване на стека, точно същото като в този въпрос, което се случва, когато потребителите отговорят на насочено известие. Срив по време на зареждане на приложението може да обясни повредените данни на приложението.
Както се вижда в stacktrace, този срив не е причинен от нашия код, ние не сме променили нищо в кода, той работи добре преди промяната на App 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)
, въпросът е какво има там, което причинява това да се срива.)
[window addSubview:viewController.view];
вместо[window setRootViewController:viewController];
? Това не решава проблема с две известия, но може би и двете са грешки/актуализации на Xcode 7 - person medvedNick   schedule 03.11.2015removeObserver:
вdealloc
от тези обекти Observer. И stackoverflow.com /questions/26371462/ - person tuledev   schedule 03.11.2015