【问题标题】:iPhone consumable product is behaving like a non-consumable product (already purchased...)iPhone 消耗品表现得像非消耗品(已购买...)
【发布时间】:2010-08-12 15:01:38
【问题描述】:

我们的应用有一个锁定产品列表,这些产品共享相同的消耗品产品 ID(即多个产品的一个消耗品产品 ID)。我们的服务器为我提供了产品列表以及与之关联的产品 ID:

item name="itemA" iphoneProductId="consumable.test.1"

item name="itemB" iphoneProductId="consumable.test.1"

item name="itemC" iphoneProductId="consumable.test.1"

我们选择消耗品是因为我们的物品是动态创建的,需要立即提供给用户(请不要回复建议我们使用非消耗品,还有很多其他原因没有我很难解释泄露与我们合作的公司的私人详细信息,以及我们使用消耗品的原因)。这使我们可以让多个产品共享相同的价格。

当用户购买 itemA(例如)时,该项目被解锁。但是,有时,当用户尝试成为 itemB 时,Apple 会返回“您已经购买了这个但尚未下载”。点击确定立即下载。这绝对不应该发生在消耗品上。我知道我们的系统相当复杂,但就苹果商店套件而言,只是再次购买相同的产品。

这可能只是沙盒问题吗?由于该应用尚未发布,因此我们无法进行实时测试。事实上,整个问题都推迟了发布,因为我们的客户和我们一样关心这个问题。

我遵循了 iphone 文档和一些应用购买教程中的相同代码。我看到论坛上的很多人似乎都目睹了上面关于消耗品的“已购买”对话框,但没有一个人得到回答。

请帮忙!谢谢

【问题讨论】:

    标签: iphone itunes in-app-purchase


    【解决方案1】:

    问题是您永远无法完成交易。您需要将其从队列中移除。

    喜欢:

    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    

    【讨论】:

      【解决方案2】:

      我假设您已致电 -[SKPaymentQueue finishTransaction:]

      在我的脑海中,有几种可能性:

      • 商店还没有收到“完成”消息(我不知道有什么订购保证)。
      • 您尝试在第一个调用 finishTransaction: 之前购买第二个项目,而 App Store 认为这是重播。
      • App Store 会检测到您似乎在重复购买同一商品的情况,并认为一定有问题。

      一个技巧是循环浏览几个(10?100?)消耗品的列表,假设当您回到列表中较早的一个时,它已经完成了处理。

      另一种解决方案是预先分配大量非消耗品(“product.1”、“product.2”、...、“product.100”),并将具有适当价格的非消耗品分配给服务器。然后可以在 iTunes Connect 上更改价格,或者根据需要分配其他产品 ID。

      【讨论】:

        【解决方案3】:

        感谢您的快速回复,但我的应用似乎正在完成交易等。

        我的项目的应用内购买类已经变得相当复杂,所以我重新创建了一个新的基础项目,其中包含一个测试消耗品和来自这个开源的应用内购买管理器/观察者的标准实现:
        http://blog.mugunthkumar.com/coding/iphone-tutorial-%E2%80%93-in-app-purchases/#idc-cover

        同样的问题发生了。这是顺序:
        1。第一次购买耗材(下面是我打印出来的debug)
        _MKStoreManager: buyFeature:test.consumable.1
        __MKStoreObserver: SKPaymentTransactionStatePurchased
        __MKStoreObserver: 完成交易
        _MKStoreManager:提供内容
        2。 Apple 会显示“感谢您购买”对话框
        3。第二次购买消耗品:
        _MKStoreManager: buyFeature:test.consumable.1
        __MKStoreObserver: SKPaymentTransactionStatePurchased
        __MKStoreObserver: 完成交易
        _MKStoreManager:提供内容
        __MKStoreObserver: SKPaymentTransactionStateFailed
        __MKStoreObserver: failedTransaction
        4. “你已经购买了这个,但还没有下载。点击确定立即下载。[环境:沙盒]”对话框由苹果显示。

        在第 3 步中交易被购买然后同时失败是没有意义的。你有什么想法吗。

        【讨论】:

        • 我遇到了完全相同的问题,你能解决这个问题吗?
        • 不,恐怕不会。经过几次会议后,我们决定转向非消耗性产品,因为它们更稳定。最后我们的购买系统发生了如此大的变化 - 不理想!不过,这些更改效果很好,直到过去 2 天,现在无论进行任何购买,我们都会收到“无法连接到 iTunes”的警报,这会破坏整个购买过程。对 Apple 的系统及其文档非常失望。
        • 我遇到了这个问题......虽然昨天它让我“购买”了几次。有什么想法吗?
        • 你错过了 [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
        【解决方案4】:

        非消耗品不值得使用消耗品,因为Apple会拒绝它。这是发生在我身上的事情:

        我也遇到了同样的问题。说明您已购买该物品的消息只偶尔出现一次,而且大多数情况下,如果您购买了很多东西 - 一个接一个地立即出现。

        无论如何,我们已将其放在 App Store 中进行审核,并得到以下答案:

        ..... We have completed the review of your in-app purchase but cannot post it to the App Store because the Purchasability Type is not set correctly. For information on Purchasing and Currency guidelines, please see section 11 of the App Store Review Guidelines [ @987654321@ ]. ..... The purchase of a [magazine issue] is set to "consumable", however based on product functionality it should be set as non-consumable instead. ......... You are required to create a new in-app purchase product with the correct purchasability type. ..........

        我希望这可以节省一些人的时间和头痛。

        【讨论】:

        • 那么,如果您打算拥有超过 3k 种不同的杂志,该怎么办? (IAP 限制)
        • 请耐心等待几周,我猜它们一个接一个地放了几个星期...顺便说一句,有一种称为“订阅”的新型应用内购买 - 所以可能有一些更简单的方法来做吧...虽然没有检查详细信息..
        【解决方案5】:

        我也面临同样的问题。我犯的错误是在发送 finishTransaction 之前取消分配购买。确保您在完成交易后处理交易结果

        - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
        
         BOOL success = YES;
        
         for (SKPaymentTransaction *transaction in transactions){
        
          switch (transaction.transactionState){
        
           case SKPaymentTransactionStatePurchased:
        
            success = YES;
        
            break;
        
           case SKPaymentTransactionStateFailed:
        
            if (transaction.error.code == SKErrorPaymentCancelled){
             if(DEBUG) NSLog(@"Transaction failed => Payment cancelled.");
            }else if (transaction.error.code == SKErrorPaymentInvalid){
             if(DEBUG) NSLog(@"Transaction failed => Payment invalid.");
            }else if (transaction.error.code == SKErrorPaymentNotAllowed){
             if(DEBUG) NSLog(@"Transaction failed => Payment not allowed.");
            }else if (transaction.error.code == SKErrorClientInvalid){
             if(DEBUG) NSLog(@"Transaction failed => client invalid.");
            }else if (transaction.error.code == SKErrorUnknown){
             if(DEBUG) NSLog(@"Transaction failed => unknown error.");
            }else{
             if(DEBUG) NSLog(@"I have no idea.");
            }
        
            success = NO;
        
            break;
        
           case SKPaymentTransactionStateRestored:
        
            success = YES;
        
            break;
        
          }
        
          [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
        
          NSLog(@"transaction finished: %@", transaction);
        
         }
        
        
         if(success){
                     // do something
                }
        
        }
        

        希望对你们中的一些人有所帮助。

        干杯, K.

        【讨论】:

          【解决方案6】:

          您应该将这一行 [[SKPaymentQueue defaultQueue] finishTransaction:transaction] 放在交易之后,以确定您是进行新购买还是恢复购买。

          【讨论】:

            【解决方案7】:
            [[SKPaymentQueue defaultQueue] addTransactionObserver:observer];
            

            确保您已在控制器处理请求中添加此方法。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-07-10
              • 1970-01-01
              • 1970-01-01
              • 2015-09-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多