在[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];上,应用程序崩溃。

10

关于这起事故我能得到的不多

当我在applicationDidBecomeActive中执行时,这就是我能从这次事故中获得的全部信息。

MyStoreObserver * observer = [[MyStoreObserver alloc] initWithContext:self.managedObjectContext andDelegate:self];

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

但奇怪的是,我过去已经能够购买两次,即使我删除了应用程序重新启动一切,我也无法摆脱这个困境。这似乎不合逻辑。我可以单独分配观察者而不会出现问题,并且我可以调用默认的paymentQueue而不会出现问题,但如果我尝试将事务观察器添加到队列中,生活就会停止。它在ARC上运行,并且我添加到观察器的委托不是问题。我确定。

我已经向观察器中的每个方法添加了nslog,并且在崩溃之前没有任何方法被调用

解决方案已找到

好吧,看起来观察者没有被队列保留,因此观察者需要成为实例变量。

谢谢


也许你应该将自己的解决方案添加为答案并将其标记为解决方案,否则赏金将保持开放状态。 - Chris Truman
2个回答

10

好的,看起来观察者没有被队列保留,因此观察者需要成为实例变量(或以某种方式被保留)。


实例变量意味着您应该在对象上保持指针,以便它不会被释放。您可以简单地创建一个属性(强引用),指向您的观察者。 - Nicolas Manzini

1
为此答案添加官方来源的方法:
在框架 Storekit 的头文件 SKPaymentQueue.h 中,有以下明确的注释:
// Observers are not retained.
// The transactions array will only be synchronized with the server while the queue has observers.
// This may require that the user authenticate.
- (void)addTransactionObserver:(id <SKPaymentTransactionObserver>)observer __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接