No processo de compra de aplicativo (IAP) parece estar travando o aplicativo na inicialização de um dos meus usuários

Estou trabalhando com um usuário do meu aplicativo que está com problemas ao iniciar o aplicativo. Acreditamos ter que fazer algo com o processo de compra no aplicativo, mas não consegui diagnosticar a causa, então pensei em trazê-la para cá (para todos os outros usuários com quem falei, as coisas parecem estar funcionando bem).

De volta para o usuário com o problema, ela diz que desde que ela comprou o IAP, o aplicativo trava no lançamento. E após a falha, o dispositivo solicita com freqüência que o usuário insira seu ID de usuário e senha (como se estivesse tentando fazer a compra novamente). Tentamos reinstalar o aplicativo, atualizando para o iOS 7, atualizando o aplicativo em si ... sem sorte.

Ela foi legal o suficiente para me enviar alguns registros de falhas, que eu copiei abaixo. Qualquer entrada seria apreciada!

Eu segui o tutorial do IAP no iOS 6 de Ray Wenderlich se isso ajudar ... novamente, nenhum outro problema relatado além deste, o que me faz pensar se algo deu errado durante o processo de compra.

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

Editado para adicionar a linha 172 do IAPHelper:

É chamado durante a restauração de um produto e passa no productIdentifier do IAP. O interessante é que isso está ocorrendo logo no lançamento do aplicativo, o que me faz pensar se esse é um cenário em que a conexão com a Internet foi perdida durante o processo de compra do IAP e agora ele está tentando restaurá-lo no lançamento.

O IAPHelper contém muitos dos métodos para comprar e restaurar um produto (também o observador para as notificações de compra). O sharedInstance é chamado em applicationDidFinishLaunching para que esteja pronto para receber recibos da Apple. A linha 172 é onde o identificador do produto está sendo adicionado a _purchasedProductIdentifiers, que é uma variável de instância NSMutableSet. O erro implicaria que algo está errado com _purchasedProductIdentifiers (o conjunto NSMutable deve ser inicializado antes de chegar aqui) ou o productIdentifier foi passado? Na prática, nunca devemos chegar a este ponto a menos que a sharedInstance do IAPHelper seja criada, que é onde _purchasedProductIdentifiers é criado.

- (void)provideContentForRestoredProductIdentifier:(NSString *)productIdentifier
{
    [_purchasedProductIdentifiers addObject:productIdentifier]; 
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:productIdentifier];
    [[NSUserDefaults standardUserDefaults] synchronize];
    [[NSNotificationCenter defaultCenter] postNotificationName:IAPHelperProductRestoredNotification object:productIdentifier userInfo:nil];

}

questionAnswers(3)

yourAnswerToTheQuestion