Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c iOS应用程序内购买:只有一笔付款添加到SKPaymentQueue,但SKPaymentTransactionObserver方法被多次调用_Objective C_Ios_Sandbox_In App Purchase - Fatal编程技术网

Objective c iOS应用程序内购买:只有一笔付款添加到SKPaymentQueue,但SKPaymentTransactionObserver方法被多次调用

Objective c iOS应用程序内购买:只有一笔付款添加到SKPaymentQueue,但SKPaymentTransactionObserver方法被多次调用,objective-c,ios,sandbox,in-app-purchase,Objective C,Ios,Sandbox,In App Purchase,我正在使用一个测试用户(在沙箱中)测试IAP,我有一个实现SKPaymentTransactionObserver协议的类,当用户选择某个表视图单元格时,我启动支付: SKPayment *payment = [SKPayment paymentWithProductIdentifier:productIdentifier]; [[SKPaymentQueue defaultQueue] addPayment:payment]; 这只做了一次,我检查过:代码被调用一次。问题是,“-(void)

我正在使用一个测试用户(在沙箱中)测试IAP,我有一个实现SKPaymentTransactionObserver协议的类,当用户选择某个表视图单元格时,我启动支付:

SKPayment *payment = [SKPayment paymentWithProductIdentifier:productIdentifier];
[[SKPaymentQueue defaultQueue] addPayment:payment];
这只做了一次,我检查过:代码被调用一次。问题是,“-(void)paymentQueue:(SKPaymentQueue*)队列更新事务:(NSArray*)事务”有时会被多次调用,我不知道为什么。这种情况并不总是发生,但决不应该发生


是否有人在沙盒测试时遇到过这种行为(如果在真实场景中发生这种情况,这将是一个大问题)

这是正常行为,也是您使用
transactionState
获取任何正在进行的事务状态的原因。其中一种可能的交易状态是
SKPaymentTransactionStatePurchasing
——即系统告诉您交易中有一些进展,但尚未完成


我认为关键是,委托可能并不总是启动事务的同一个参与者。因此,代理可以在
SKPaymentTransactionStatePurchasing
上发布忙碌指示,而无需想出某种方法将发布请求的人与管理显示的人联系起来。

我通常会“分配”我的代理,但这次将代理分配给处理所有事务处理的类。委托(视图控制器)和应用内购买类均泄漏。因此,每次我展示视图控制器时, 创建了另一个实例并设置了另一个委托。处理事务时,应用内购买类(漫游免费:)的实例数与视图显示的次数相同。
因此,这不是IAP问题,而是注意力和内存管理问题。

您可能会收到多个回调的原因是您无意中注册了多个观察者。如果要实例化在支付队列中注册为观察者的视图控制器,则需要确保在交易完成时将其删除

处理这种情况的一个更好的方法可能是使用一个将通知发送回控制器的单例观察者

@implementation MyViewController : SomeParentController<SKPaymentTransactionObserver>

- (void)startPayment:(SKPayment *)payment {
  SKPaymentQueue *queue = [SKPaymentQueue defaultQueue];

  /* Unless MyViewController is a singleton this line of code will add a new observer
   * to the default queue. The observer is retained and every time a transaction is added
   * to the queue the callback code will be executed on all registered observers.
   */
  [queue addTransactionObserver:self];
  [SKPaymentQueue addPayment:payment];
}

- (void)paymentQueue:(SKPaymentQueue *)queue 
   updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions {
   // Your transaction processing code here
}

@end
@实现MyViewController:SomeParentController
-(无效)开始付款:(SKPayment*)付款{
SKPaymentQueue*队列=[SKPaymentQueue defaultQueue];
/*除非MyViewController是单例,否则这行代码将添加一个新的观察者
*默认队列。每次添加事务时,都会保留观察者
*对于队列,回调代码将在所有注册的观察者上执行。
*/
[队列添加TransactionObserver:self];
[SKPaymentQueue addPayment:payment];
}
-(void)paymentQueue:(SKPaymentQueue*)队列
更新的事务:(NSArray*)事务{
//您的交易处理代码在这里
}
@结束

问题在于,SKPaymentTransactionStatePurchased多次调用该方法。与SKPaymentTransactionStatePurchasing状态相同的次数(IAP标识符相同)。例如,一行4个购买电话,然后一行4个购买电话-相同的标识符;我从没见过这样的事。显然,您已经检查了四次是否无意中将产品请求添加到队列中(例如)?我已经检查过-有时是2次、3次、4次。。。我还确保调用finish transaction。发现我的错误。谢谢你的回答:)你犯了什么错?我也有同样的问题。你能分享一些你的答案代码吗?我在iOS 8中遇到了这个问题。不幸的是,我不再能够访问该代码,并且已经有一段时间没有在iOS上工作了,因此我无法真正帮助您:(