Wydaje się, że proces In App Purchase (IAP) zawiesza aplikację podczas uruchamiania dla jednego z moich użytkowników
Pracuję z użytkownikiem mojej aplikacji, który ma awarie po uruchomieniu aplikacji. Uważamy, że musi coś zrobić z procesem zakupu w aplikacji, ale nie byłem w stanie zdiagnozować przyczyny, więc pomyślałem, że przyniosę to tutaj (dla każdego innego użytkownika, z którym rozmawiałem, sprawy wydają się działać) w porządku).
Wracając do problemu z użytkownikiem, mówi, że od momentu zakupu IAP aplikacja ulega awarii po uruchomieniu. Po awarii urządzenie często monituje użytkownika o wprowadzenie identyfikatora użytkownika i hasła (tak jakby ponownie próbowało dokonać zakupu). Próbowaliśmy ponownie zainstalować aplikację, zaktualizować do systemu iOS 7, zaktualizować samą aplikację ... bez powodzenia.
Była na tyle miła, że wysłała mi kilka dzienników awarii, które skopiowałem poniżej. Wszelkie dane będą mile widziane!
Śledziłem IAP Raya Wenderlicha w samouczku iOS 6, jeśli to pomaga ... ponownie, nie zgłoszono żadnych innych problemów oprócz tego, co sprawia, że zastanawiam się, czy coś poszło nie tak podczas procesu zakupu.
Incident Identifier: 1E0C36A9-C7EC-48D7-9BB8-D56F6203D62E
CrashReporter Key: 2ac3185fb0d2c64d11247cccfa4a55af32fd5462
Hardware Model: iPhone4,1
Process: MetricMe [9322]
Path: /var/mobile/Applications/847DC898-FD57-40F5-98F2-6C361DC7DECC/MetricMe.app/MetricMe
Identifier: com.anthonydubis.metricme
Version: 3.0.5 (3.0.5)
Code Type: ARM (Native)
Parent Process: launchd [1]
Date/Time: 2013-10-04 13:48:13.129 -0400
OS Version: iOS 7.0.2 (11A501)
Report Version: 104
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Triggered by Thread: 0
Last Exception Backtrace:
0 CoreFoundation 0x2ebf9f4e __exceptionPreprocess + 126
1 libobjc.A.dylib 0x38fd26aa objc_exception_throw + 34
2 CoreFoundation 0x2eb37c12 -[__NSSetM addObject:] + 558
3 MetricMe 0x00069fc4 -[IAPHelper provideContentForRestoredProductIdentifier:] (IAPHelper.m:172)
4 MetricMe 0x00069ce8 -[IAPHelper restoreTransaction:] (IAPHelper.m:146)
5 MetricMe 0x00069b14 -[IAPHelper paymentQueue:updatedTransactions:] (IAPHelper.m:124)
6 StoreKit 0x312fddc8 __NotifyObserverAboutChanges + 80
7 CoreFoundation 0x2eb2d714 CFArrayApplyFunction + 32
8 StoreKit 0x312fdd64 -[SKPaymentQueue _notifyObserversAboutChanges:sendUpdatedDownloads:] + 124
9 StoreKit 0x312fe646 -[SKPaymentQueue _processUpdates:trimUnmatched:sendUpdatedDownloads:] + 1022
10 StoreKit 0x312fed1c -[SKPaymentQueue _setTransactionsWithReply:] + 124
11 StoreKit 0x312fd906 __38-[SKPaymentQueue _establishConnection]_block_invoke_2 + 58
12 libdispatch.dylib 0x394b5d76 _dispatch_call_block_and_release + 6
13 libdispatch.dylib 0x394b5d62 _dispatch_client_callout + 18
14 libdispatch.dylib 0x394bc7bc _dispatch_main_queue_callback_4CF$VARIANT$mp + 264
15 CoreFoundation 0x2ebc481c __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 4
16 CoreFoundation 0x2ebc30f0 __CFRunLoopRun + 1296
17 CoreFoundation 0x2eb2dce2 CFRunLoopRunSpecific + 518
18 CoreFoundation 0x2eb2dac6 CFRunLoopRunInMode + 102
19 GraphicsServices 0x3384e27e GSEventRunModal + 134
20 UIKit 0x313cfa3c UIApplicationMain + 1132
21 MetricMe 0x00043842 main (main.m:16)
22 libdyld.dylib 0x394daab2 tlv_initializer + 2
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x395911fc __pthread_kill + 8
1 libsystem_pthread.dylib 0x395faa2e pthread_kill + 54
2 libsystem_c.dylib 0x39541ff8 abort + 72
3 libc++abi.dylib 0x38870cd2 abort_message + 70
4 libc++abi.dylib 0x388896e0 default_terminate_handler() + 248
5 libobjc.A.dylib 0x38fd291e _objc_terminate() + 190
6 libc++abi.dylib 0x388871c4 std::__terminate(void (*)()) + 76
7 libc++abi.dylib 0x38886a18 __cxa_throw + 112
8 libobjc.A.dylib 0x38fd277e objc_exception_throw + 246
9 CoreFoundation 0x2eb37c12 -[__NSSetM addObject:] + 558
10 MetricMe 0x00069fc4 -[IAPHelper provideContentForRestoredProductIdentifier:] (IAPHelper.m:172)
11 MetricMe 0x00069ce8 -[IAPHelper restoreTransaction:] (IAPHelper.m:146)
12 MetricMe 0x00069b14 -[IAPHelper paymentQueue:updatedTransactions:] (IAPHelper.m:124)
13 StoreKit 0x312fddc8 __NotifyObserverAboutChanges + 80
14 CoreFoundation 0x2eb2d716 CFArrayApplyFunction + 34
15 StoreKit 0x312fdd64 -[SKPaymentQueue _notifyObserversAboutChanges:sendUpdatedDownloads:] + 124
16 StoreKit 0x312fe646 -[SKPaymentQueue _processUpdates:trimUnmatched:sendUpdatedDownloads:] + 1022
17 StoreKit 0x312fed1c -[SKPaymentQueue _setTransactionsWithReply:] + 124
18 StoreKit 0x312fd906 __38-[SKPaymentQueue _establishConnection]_block_invoke_2 + 58
19 libdispatch.dylib 0x394b5d78 _dispatch_call_block_and_release + 8
20 libdispatch.dylib 0x394b5d64 _dispatch_client_callout + 20
21 libdispatch.dylib 0x394bc7bc _dispatch_main_queue_callback_4CF$VARIANT$mp + 264
22 CoreFoundation 0x2ebc481c __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 4
23 CoreFoundation 0x2ebc30f0 __CFRunLoopRun + 1296
24 CoreFoundation 0x2eb2dce2 CFRunLoopRunSpecific + 518
25 CoreFoundation 0x2eb2dac6 CFRunLoopRunInMode + 102
26 GraphicsServices 0x3384e27e GSEventRunModal + 134
27 UIKit 0x313cfa3c UIApplicationMain + 1132
28 MetricMe 0x00043842 main (main.m:16)
29 libdyld.dylib 0x394daab4 start + 0
Edytowane, aby dodać linię 172 IAPHelper:
Jest wywoływana podczas przywracania produktu i przechodzi w identyfikator produktu IAP. Co ciekawe, dzieje się to tuż po uruchomieniu aplikacji, co sprawia, że zastanawiam się, czy jest to scenariusz, w którym połączenie internetowe zostało utracone podczas procesu zakupu IAP, a teraz próbuje go przywrócić po uruchomieniu.
IAPHelper zawiera wiele metod zakupu i przywracania produktu (także obserwatora powiadomień o zakupach). Funkcja sharedInstance jest wywoływana w applicationDidFinishLaunching, aby była gotowa do odbierania pokwitowań od Apple. Linia 172 to miejsce, w którym identyfikator produktu jest dodawany do _purchasedProductIdentifiers, który jest zmienną instancji NSMutableSet. Czy błąd sugerowałby, że coś jest nie tak z _purchasedProductIdentifiers (zestaw NSMutable powinien zostać zainicjowany zanim się tutaj pojawi) lub przekazany został productIdentifier? W praktyce nigdy nie powinniśmy dotrzeć do tego punktu, dopóki nie zostanie utworzona sharedInstance IAPHelper, czyli gdzie tworzony jest _purchasedProductIdentifiers.
- (void)provideContentForRestoredProductIdentifier:(NSString *)productIdentifier
{
[_purchasedProductIdentifiers addObject:productIdentifier];
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:productIdentifier];
[[NSUserDefaults standardUserDefaults] synchronize];
[[NSNotificationCenter defaultCenter] postNotificationName:IAPHelperProductRestoredNotification object:productIdentifier userInfo:nil];
}