2013-10-05 5 views
19

Ho lavorato con un utente della mia app con arresti anomali al momento dell'avvio dell'app. Crediamo che debba fare qualcosa con il processo di acquisto in-app, ma non sono stato in grado di diagnosticare la causa, quindi ho pensato di portarlo qui (per ogni altro utente con cui ho parlato, le cose sembrano funzionare va bene).Nella procedura di acquisto di app (IAP) sembra bloccarsi l'applicazione al momento del lancio per uno dei miei utenti

Torna all'utente con il problema, dice che da quando ha acquistato lo IAP, l'app si arresta in modo anomalo al momento del lancio. E in seguito all'incidente, il dispositivo richiede spesso all'utente di inserire il suo ID utente e la sua password (come se cercasse di effettuare nuovamente l'acquisto). Abbiamo provato a reinstallare l'app, aggiornando su iOS 7, aggiornando l'app stessa ... senza fortuna.

Era abbastanza gentile da inviarmi alcuni registri degli arresti anomali, che ho copiato qui di seguito. Qualsiasi input sarebbe apprezzato!

Ho seguito l'IAP di Ray Wenderlich in iOS 6 tutorial se questo aiuta ... di nuovo, non ci sono altri problemi segnalati oltre a questo, il che mi fa chiedere se qualcosa è andato in tilt durante il processo di acquisto.

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 

A cura di aggiungere la linea 172 di IAPHelper:

Si chiama durante un prodotto ripristino e passa nel ProductIdentifier della IAP. Ciò che è interessante è che questo si sta verificando proprio al momento del lancio della app, il che mi chiede se si tratta di uno scenario in cui la connessione Internet è stata persa durante il processo di acquisto IAP e ora sta tentando di ripristinarla al momento del lancio.

IAPHelper contiene molti metodi per acquistare e ripristinare un prodotto (anche l'osservatore per le notifiche di acquisto). SharedInstance viene chiamato in applicationDidFinishLaunching in modo che sia pronto a ricevere le ricevute da Apple. La riga 172 è dove l'identificatore del prodotto viene aggiunto a _purchasedProductIdentifiers, che è una variabile di istanza NSMutableSet. L'errore implicherebbe che qualcosa non funzioni con _purchasedProductIdentifiers (il set NSMutable deve essere inizializzato prima che arrivi qui) o che il productIdentifier sia passato? In pratica, non dovremmo mai arrivare a questo punto a meno che non venga creata la SharedInstance of IAPHelper, che è dove vengono creati _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

Cosa linea 172 di IAPHelper.m assomiglia? Più contesto, meglio è. –

+0

Aggiunti solo alcuni dettagli. – tonyd

+0

@tonyd Che fine ha fatto il tuo problema? Sto avendo lo stesso problema, e sembra che sia nello stesso posto. Apprezzerei molto il tuo feedback! – SAHM

risposta

15

Recentemente abbiamo iniziato a ricevere segnalazioni di crash simili da alcuni dei nostri utenti, il problema è che il productId viene passata qui è 'pari a zero', che causerà un crash b/c verrà utilizzato come una chiave e un hash dovrà essere calcolato lungo la linea.

Tuttavia, non ci è ancora chiaro perché a volte è "nulla". Ma almeno l'incidente può essere evitato proteggendo dalla possibilità che il prodotto possa essere nullo a volte.

+0

Questa è la risposta corretta al problema. Il productID stava arrivando come zero, il che causava l'arresto anomalo dell'app quando si aggiungeva a un NSSet. Poiché l'app si è arrestata in modo anomalo, finishTransaction: non è mai stato chiamato, quindi si arresterebbe in modo consistente all'avvio quando ho aggiunto un osservatore delle transazioni, che ha richiesto la transazione nuovamente (ancora con un ID prodotto nullo). – tonyd

+1

La correzione doveva essere preparata per un ID prodotto nullo. Per la mia app in cui ho un singolo IAP, semplicemente inizializzo l'ID prodotto con quello del mio acquisto in-app. Un altro sviluppatore che ha più productID ha detto che stava semplicemente chiamando finishTransaction: senza fare nulla. L'utente può quindi ripristinare la transazione e l'ID prodotto sarebbe passato. – tonyd

+1

Come possiamo risolvere questo problema per gli utenti che hanno già l'identificativo del prodotto nullo? Ho un utente in particolare che mi dà una recensione a 1 stella ogni volta che rilascio un aggiornamento perché la sua app si blocca (comprensibile) – Eric

9

Questa mattina ho avuto questo problema con il mio iPhone 5S e un'app. Il problema sembrava essere dovuto al fatto che dovevo convalidare il codice di sicurezza su una carta di credito aggiunta di recente dopo aver tentato di eseguire l'acquisto in app. Questo mi ha tirato fuori dall'app, nell'App Store.

Dopo aver verificato il mio codice di sicurezza, mi è stato richiesto di acquistare nuovamente l'acquisto in-app. L'ho fatto, ma dal momento che non ero nell'app al momento, l'app non mi è stata notificata che ho effettuato l'acquisto. Sono tornato all'app e ho utilizzato l'opzione di ripristino degli acquisti dell'app e nel momento in cui ho inserito la password dell'app store, l'app si è bloccata e ha continuato a bloccarsi all'avvio anche dopo la disinstallazione, il telefono è stato riavviato e l'app re-installata. Ho persino provato a ripristinare tutte le impostazioni e ad uscire dal mio account iTunes App Store. Niente ha impedito gli arresti.

Ho guardato il crash stack ed era molto simile a quello incollato sopra, con un gruppo di voci StoreKit nello stack. Sfortunatamente non ho salvato la pila prima di prendere l'opzione nucleare (vedi sotto). Questo era sotto iOS 7.0.3. Sembra che l'acquisto sia andato a buon fine quando ho installato l'app su un altro dispositivo e ho effettuato un ripristino degli acquisti e questo ha funzionato.

Sfortunatamente l'unico modo per risolvere questo problema è stato quello di pulire il telefono e ripristinare da un backup effettuato prima che l'acquisto fosse tentato. Fortunatamente per me avevo appena eseguito il backup su iCloud circa 30 minuti prima che ciò accadesse, quindi ho fatto un "Cancella tutte le impostazioni e i dati", seguito da "Ripristino da iCloud Backup". Ci sono volute diverse ore, ma dopo ho potuto ripetere l'acquisto e mi è stato detto che avevo già acquistato e funzionava.

Questo non aiuta chi non ha un backup recente o ha incontrato questo problema e ha continuato ad utilizzare il dispositivo da allora. Fondamentalmente c'è qualcosa memorizzato sul dispositivo in quel punto che non viene cancellato rimuovendo l'App o facendo un "Reset All Settings". Solo pulendo il dispositivo lo corregge.

Suppongo che tutto ciò che viene memorizzato sia parte di "In app-acquistato" di cui viene eseguito il backup, quindi qualsiasi backup eseguito dopo questo evento sarà probabilmente "danneggiato", a meno che non ci sia un modo per correggerli manualmente usando un programma di terze parti.

Suggerirei di segnalarlo a bugreport.apple.com. Puoi dare loro i miei dettagli oltre alla traccia traccia se vuoi.

+0

Questa è una informazione ECCELLENTE e aiuta a descrivere la causa del problema. Grazie Morac. – tonyd

0

ho avuto sintomi simili (app si è schiantato a ogni avvio) e il problema era che StoreObserver non è stato trattenuto dalla coda:

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

soluzione era di fare l'osservatore una variabile di istanza.

Discussione affrontare questo problema: App crash on [[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

Problemi correlati