2011-04-26 87 views
8

我正在使用StoreKit进行应用内购买。当用户按下“取消”按钮时,我发现该API的行为古怪。处理取消的IAP交易

例如,如果我在“确认您的应用程序内购买”屏幕上按下取消,我会按照我的预期收到SKPaymentTransactionStateFailed交易error.code == SKErrorPaymentCancelled

但是,如果我推动Buy,然后按取消,我得到一个Failed交易与error.code == 0error.localizedDescription是“无法连接到iTunes Store”,这显然是谎言。

将所有Failed交易视为可忽略的取消是很诱人的,但我也可以清楚地看到,如果设备在飞行模式下处于脱机状态,我会收到Failed交易,并且不会显示警报弹出窗口;在这种情况下,我应该通知用户解释问题。

我注意到MKStoreKit假设所有失败都是取消。 MKStoreManagerfailedTransaction方法永远不会被调用; MKStoreObserver总是针对所有Failed交易调用transactionCanceledMKStoreManager.h评论recommend no error messagetransactionCanceled,这是有道理的,但谁会通知用户关于Failed未取消的交易?

处理这些故障的最佳做法是什么?我应该吞下错误吗?始终显示错误,即使它是多余的?

回答

11

我们有移动连接,只显示一个警报相当可观的用户群购买的东西的

code != SKErrorPaymentCancelled && code != SKErrorPaymentNotAllowed 

显然,这是你能做的最好的。我也看到了你提到的取消上的奇怪行为,据我所知,这是一个框架错误。

3

上一个答案非常接近。 MKStoreKit可以自动显示错误消息,以显示有效的错误情况,如开启家长控制等等。

尽管如此,为了处理购买取消,我还提供了一个名为transactionCanceled in MKStoreKitDelegate的委托(从v3.5开始)。

句柄,并停止任何活动纺纱或视图控制器,使购买呼叫进展HUD ...

+2

MKStoreKit 3.5不区分故障和取消。我在github https://github.com/MugunthKumar/MKStoreKit/issues/3上记录了一个问题,我已经将它修复在我的叉子中。 – 2011-04-29 06:47:16

+0

谢谢!我合并了你的拉取请求 – Mugunth 2011-04-29 07:24:50

+0

现在我的拉取请求被合并了,最新的MKStoreKit会自动显示失败时的错误,然后在委托上调用transactionCanceled,以便用户可以隐藏微调器。 – 2011-04-29 09:42:09

-1

还有一个问题... 点击购买按钮,它会显示另一个警报视图后并询问账户信息。

如果我没有取消有那么它将进入的情况下SKErrorUnknown: 然后 我不能表现出这样的 消息“您的订单无法完成,请检查您的网络设置,稍后再试。”

- (void) failedTransaction: (SKPaymentTransaction *)transaction 
{ 
    switch (transaction.error.code) { 
     case SKErrorUnknown: 
      NSLog(@"SKErrorUnknown"); 
      break; 
     case SKErrorClientInvalid: 
      NSLog(@"SKErrorClientInvalid"); 
      break; 
     case SKErrorPaymentCancelled: 
      NSLog(@"SKErrorPaymentCancelled"); 
     break; 
     case SKErrorPaymentInvalid: 
      NSLog(@"SKErrorPaymentInvalid"); 
      break; 
     case SKErrorPaymentNotAllowed: 
      NSLog(@"SKErrorPaymentNotAllowed"); 
     break; 
     default: 
      NSLog(@"No Match Found for error"); 
      break; 
    } 
    NSLog(@"transaction.error.code %@",[transaction.error description]); 
    if (transaction.error.code == SKErrorPaymentCancelled) { 
     [[MKStoreManager sharedManager] transactionCanceled:transaction]; 
    } else { 
     [[MKStoreManager sharedManager] failedTransaction:transaction]; 
    } 
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 
} 
0

我只是想补充的是,由于没有互联网连接的错误应该被大多之前,使用苹果可达类IMO任何交易抓获。这样,您就不需要依赖Apple的API来处理简单且常见的错误。

0

我认为这是您的责任和决定在何处显示取消交易的提醒。但是你一定要完成它,否则它会一直下降到失败。所以,应该是这样的:

if (transaction.error.code == SKErrorPaymentCancelled) { 
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
} else { 
    [self notifyError:transaction.error]; 
} 

UPDATE: 由于The Business of iPhone App Development: Making and Marketing Apps that Succeed我们应该任何更新失败的状态之后,完成交易。知道是否存在我们不应该的情况会很有趣。