在应用程序购买(IAP)过程似乎是崩溃的应用程序启动我的用户之一

我一直在与我的应用程序的用户正在遇到崩溃后启动应用程序。 我们相信它必须在应用内购买过程中做些事情,但是我还没有能够诊断原因,所以我想我会把它带到这里(对于我所说的其他用户来说,事情似乎正在工作正好)。

回到有问题的用户,她说,自从她购买IAP以来,该应用程序在启动时崩溃。 在发生崩溃之后,设备会经常提示用户input她的用户名和密码(好像正在尝试再次购买)。 我们已经尝试重新安装应用程序,更新到iOS 7,更新应用程序本身…没有运气。

她很高兴给我发送一些崩溃日志,我在下面复制。 任何input将不胜感激!

我跟着Ray Wenderlich的iOS 6教程中的IAP(如果有帮助的话),除此之外,没有其他报告的问题,这让我想知道在购买过程中是否有什么问题。

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 

编辑添加第172行的IAPHelper:

它在产品恢复过程中被调用并传入IAP的productIdentifier。 有趣的是,这是发生在应用程序的启动,这让我不知道这是一个情况下,在IAP购买过程中,互联网连接丢失,现在它正试图恢复它启动。

IAPHelper包含许多购买和恢复产品的方法(也是购买通知的观察者)。 在applicationDidFinishLaunching中调用sharedInstance,以便它可以从Apple接收收据。 第172行是产品标识符被添加到_purchasedProductIdentifiers的位置,这是一个NSMutableSet实例variables。 这个错误是否意味着_purchasedProductIdentifiers(NSMutable集应该在它到达这里之前被初始化)或者传入了productIdentifier? 在实践中,除非创build了IAPHelper的sharedInstance,否则我们不应该得到这一点,这是创build_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]; } 

我们最近开始从我们的一些用户那里得到类似的崩溃报告,问题是这里传递的productId是'nil',这将导致崩溃b / c它将被用作关键字并且需要计算散列下线。

但是,它仍然不清楚为什么有时是“零”。 但至less可以通过防止productId有时可能为零的可能性来避免崩溃。

今天早上我遇到了这个问题,我的iPhone 5S和一个应用程序。 这个问题似乎是由于我在尝试执行应用内购买时需要validation最近添加的信用卡上的安全代码。 这把我拉出应用程序,进入App Store。

validation我的安全代码后,系统提示我再次购买应用内购买。 我这样做了,但由于当时我并没有在应用程序,应用程序没有通知,我购买。 我切换回应用程序,并使用应用程序的恢复购买选项,当我input我的应用程序商店密码,应用程序然后崩溃,并继续崩溃,即使在卸载,手机重新启动和应用程序重新启动。 我甚至尝试重置所有设置并退出我的App Store iTunes帐户。 没有什么阻止了崩溃。

我查看了崩溃堆栈,它与上面粘贴的堆栈非常相似,堆栈中有一堆StoreKit条目。 不幸的是,在采取核选项之前,我没有保存这个堆栈(见下文)。 这是在iOS 7.0.3。 当我在另一台设备上安装应用程序时,似乎购买已经完成,并进行了恢复购买,并且工作。

不幸的是,我发现解决这个问题的唯一方法是擦拭手机,并在购买之前进行备份恢复。 幸运的是,在这之前的大约30分钟,我刚备份到iCloud,所以我做了一个“擦除所有设置和数据”,然后是“从iCloud备份还原”。 最终花了几个小时,但之后我可以再次购买,并被告知我已经购买,它的工作。

这对于没有最近的备份或已经遇到这个问题并且从那时起继续使用该设备的人没有帮助。 基本上这个设备上的东西存储在那个地方,通过删除应用程序或执行“重置所有设置”不能清除。 只有擦拭设备才能修复它。

我假设存储的内容是“应用程序购买”中的一部分,因此在此之后进行的备份可能会“损坏”,除非有办法使用第三方程序手动修复它们。

我build议将此报告给bugreport.apple.com。 如果你愿意的话,除了轨迹追踪之外,你可以给他们提供我的细节。

我有类似的症状(应用程序在每次启动时崩溃),问题是StoreObserver不被队列保留:

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

解决办法是让观察者成为一个实例variables。

处理这个问题的线程: [[SKPaymentQueue defaultQueue] addTransactionObserver:observer];