2013-10-05 13 views
19

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]; 

} 
+0

Co linia 172 IAPHelper.m wyglądać? Im więcej kontekstu, tym lepiej. –

+0

Właśnie dodałem kilka dalszych szczegółów. – tonyd

+0

@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

Odpowiedz

15

Niedawno zaczęła się podobne raporty o awariach z niektórych naszych użytkowników, problem jest taki, że productId przepuszcza tutaj jest „zero”, co spowoduje awarię b/c będzie on używany jako klucz i hasz będzie musiał być obliczony w dół linii.

Jednak nadal nie jest dla nas jasne, dlaczego czasami jest "zerowy". Ale co najmniej katastrofy można uniknąć, chroniąc przed możliwością, że productId może być czasami zerowe.

+0

To jest poprawna odpowiedź na problem. Identyfikator produktu pojawił się jako zero, co spowodowało awarię aplikacji podczas dodawania do NSSet. Ponieważ aplikacja uległa awarii, metoda finishTransaction: nigdy nie została wywołana, więc po uruchomieniu, gdy dodałem obserwatora transakcji, nastąpiłoby stałe zawieszenie transakcji, co spowodowało, że transakcja ponownie wystąpi (nadal z zerowym identyfikatorem produktu). – tonyd

+1

Poprawka miała być przygotowana na zerowy identyfikator produktu. W przypadku mojej aplikacji, w której mam pojedynczy punkt dostępu do Internetu, po prostu inicjuję identyfikator produktu, który jest identyfikatorem zakupu w aplikacji. Inny programista, który ma wiele identyfikatorów productID, powiedział, że po prostu nazwał on finishTransaction: bez robienia czegokolwiek. Użytkownik może następnie przywrócić transakcję i nastąpi identyfikacja produktu. – tonyd

+1

Jak to naprawić dla użytkowników, którzy mają już zerowy identyfikator produktu? Mam jednego konkretnego użytkownika, który daje mi 1 gwiazdkę za każdym razem, gdy wyda aktualizację, ponieważ jego aplikacja się zawiesza (zrozumiałe). – Eric

9

Wpadłem dziś na ten problem z moim iPhone 5S i aplikacją. Problem spowodowany był koniecznością sprawdzenia poprawności kodu bezpieczeństwa na ostatnio dodanej karcie kredytowej po próbie dokonania zakupu w aplikacji. To wyciągnęło mnie z aplikacji do App Store.

Po zweryfikowaniu mojego kodu bezpieczeństwa, zostałem poproszony o ponowne zakupienie zakupu w aplikacji. Zrobiłem to, ale ponieważ nie było mnie wtedy w aplikacji, aplikacja nie została powiadomiona, że ​​dokonałem zakupu. Wróciłem do aplikacji i skorzystałem z opcji przywracania zakupów w aplikacji, a gdy tylko wprowadziłem hasło do mojego sklepu App Store, aplikacja się zawiesiła i kontynuowała awarię po uruchomieniu, nawet po odinstalowaniu, po ponownym uruchomieniu telefonu i ponownym zainstalowaniu aplikacji. Próbowałem nawet zresetować wszystkie ustawienia i wylogować się z mojego konta iTunes w App Store. Nic nie zapobiegło awariom.

Spojrzałem na stos wypadków i był bardzo podobny do tego, który został wklejony powyżej, z mnóstwem wpisów StoreKit w stosie. Niestety nie zapisałem stosu przed wzięciem opcji nuklearnej (patrz poniżej). To było pod iOS 7.0.3. Wygląda na to, że zakup został zrealizowany, ponieważ zainstalowałem aplikację na innym urządzeniu i dokonałem przywrócenia zakupów.

Niestety jedynym sposobem na naprawienie tego, co znalazłem, było wyczyszczenie telefonu i przywrócenie kopii zapasowej wykonanej przed zakupem. Na szczęście miałem właśnie kopię zapasową do iCloud około 30 minut przed tym wydarzeniem, więc zrobiłem "Wymaż wszystkie ustawienia i dane", a następnie "Przywróć z iCloud Backup". Zajęło to kilka godzin, ale potem mogłem ponownie dokonać zakupu i powiedziano mi, że już kupiłem i zadziałało.

To nie pomaga każdemu, kto nie ma ostatniej kopii zapasowej lub wystąpił w tym problemie, i od tego czasu nadal używa urządzenia. Zasadniczo w urządzeniu jest przechowywane coś, co nie jest usuwane przez usunięcie aplikacji lub "Zresetuj wszystkie ustawienia". Tylko czyszczenie urządzenia to naprawia.

Zakładam, że wszystko, co jest przechowywane, jest częścią "W zakupionej aplikacji", która jest tworzona w kopii zapasowej, więc wszelkie kopie utworzone po tym zdarzeniu będą prawdopodobnie "uszkodzone", chyba że istnieje sposób na ręczne naprawienie ich za pomocą program zewnętrzny.

Sugerowałbym zgłoszenie tego błędu na bugreport.apple.com. Możesz podać im moje dane oprócz śledzenia śladu, jeśli chcesz.

+0

To jest DOSKONAŁA informacja i pomaga opisać przyczynę problemu. Dzięki Morac. – tonyd

0

miałem podobne objawy (app rozbił się na każdym starcie) i problem było to, że StoreObserver nie została utrzymana przez kolejki:

StoreObserver *observer = [[StoreObserver alloc] init]; 
[[SKPaymentQueue defaultQueue] addTransactionObserver:observer]; 

Roztwór aby obserwator zmienną instancji. czynienia

Temat ten problem: App crash on [[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

Powiązane problemy