Pracuję z użytkownikiem mojej aplikacji, która ma awarie podczas uruchamiania aplikacji. Wierzymy, że musi coś zrobić z procesem zakupu w aplikacji, ale nie udało mi się zdiagnozować przyczyny, więc pomyślałem, że przyniosę to tutaj (dla każdego innego użytkownika, z którym rozmawiałem, wszystko wygląda na to, że działa w porządku).Proces zakupu aplikacji (IAP) prawdopodobnie powoduje awarię aplikacji po uruchomieniu przez jednego z moich użytkowników.
Wracając do użytkownika z problemem, mówi, że od momentu zakupu IAP aplikacja ulega awarii po uruchomieniu. Po awarii zdarza się, że urządzenie często prosi użytkownika o podanie swojego identyfikatora użytkownika i hasła (tak jakby próbował ponownie dokonać zakupu). Próbowaliśmy ponownie zainstalować aplikację, aktualizując ją do iOS 7, aktualizując 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 wejściowe zostaną docenione!
Podążyłem za IAP Ray'a Wenderlicha w samouczku iOS 6, jeśli to pomoże ... znowu, nie ma innych zgłoszonych problemów poza tym, 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
Edited by dodać linię 172 IAPHelper:
Nazywa się podczas produktu przywrócić i przechodzi w productIdentifier z IAP. Co ciekawe, dzieje się to tuż po uruchomieniu aplikacji, co sprawia, że zastanawiam się, czy jest to scenariusz, w którym utracono połączenie internetowe podczas procesu zakupu IAP, a teraz próbuje przywrócić go po uruchomieniu.
IAPHelper zawiera wiele metod zakupu i przywrócenia produktu (także obserwatora dla powiadomień o zakupie). Obiekt SharedInstance jest wywoływany w applicationDidFinishLaunching, dzięki czemu jest gotowy do otrzymywania potwierdzeń od firmy Apple. Linia 172 to miejsce, w którym identyfikator produktu jest dodawany do "kupionego identyfikatora produktu", który jest zmienną instancji NSMutableSet. Czy błąd sugerowałby, że coś jest nie tak z "kupionymi" identyfikatorami produktu "(NSMutable set powinien zostać zainicjowany, zanim się tu dostanie) lub przekazany productIdentifier? W praktyce nigdy nie powinniśmy do tego dojść, chyba że zostanie utworzona wspólna instancja IAPHelper, czyli tam, 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];
}
Co linia 172 IAPHelper.m wyglądać? Im więcej kontekstu, tym lepiej. –
Właśnie dodałem kilka dalszych szczegółów. – tonyd
@tonyd Jaka była twoja sprawa? Mam ten sam problem i wygląda na to, że jest w tym samym miejscu. Byłbym wdzięczny za wysłuchanie twoich opinii! – SAHM