19

我一直在与我的应用程序用户合作,该用户在启动应用程序时遇到崩溃。我们认为它与应用内购买过程有关,但我无法诊断原因,所以我想我会把它带到这里(对于我与之交谈过的所有其他用户,一切似乎都在工作正好)。

回到有问题的用户,她说自从她购买 IAP 后,应用程序在启动时就崩溃了。并且在崩溃之后,设备经常提示用户输入她的用户 ID 和密码(就好像它正在尝试再次购买一样)。我们已经尝试重新安装应用程序,更新到 iOS 7,更新应用程序本身......没有运气。

她很好地给我发了一些崩溃日志,我在下面复制了这些日志。任何输入将不胜感激!

如果有帮助,我在 iOS 6 教程中遵循了 Ray Wenderlich 的 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

编辑添加 IAPHelper 的第 172 行:

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

IAPHelper 包含许多购买和恢复产品的方法(也是购买通知的观察者)。在 applicationDidFinishLaunching 中调用 sharedInstance 以便它准备好接收来自 Apple 的收据。第 172 行是将产品标识符添加到 _purchasedProductIdentifiers 的位置,这是一个 NSMutableSet 实例变量。该错误是否暗示 _purchasedProductIdentifiers 有问题(NSMutable 集应在到达此处之前初始化)或传入的 productIdentifier?在实践中,除非创建了 IAPHelper 的 sharedInstance,否则我们永远不会达到这一点,这是创建 _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];

}
4

3 回答 3

15

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

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

于 2013-11-11T22:46:52.803 回答
9

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

验证我的安全码后,我被提示再次购买应用内购买。我这样做了,但由于当时我不在应用程序中,因此没有通知应用程序我进行了购买。我切换回应用程序并使用应用程序的恢复购买选项,当我输入我的应用商店密码时,应用程序崩溃并在启动时继续崩溃,即使在被卸载、手机重新启动并重新安装应用程序后也是如此。我什至尝试重置所有设置并退出我的 App Store iTunes 帐户。没有什么能阻止崩溃。

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

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

这对没有最近备份或遇到此问题并从那时起继续使用该设备的任何人都没有帮助。基本上,此时设备上存储的某些内容无法通过删除应用程序或执行“重置所有设置”来清除。只有擦拭设备才能修复它。

我假设存储的任何内容都是“在应用程序中购买的”的一部分,它会被备份,所以在这种情况发生后所做的任何备份都可能被“损坏”,除非有办法使用第三方程序手动修复它们。

我建议将此报告给 bugreport.apple.com。如果你愿意的话,你可以给他们我的详细信息以及跟踪信息。

于 2013-11-13T19:18:44.230 回答
0

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

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

解决方案是让观察者成为实例变量。

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

于 2013-12-23T11:52:57.047 回答