1

我正在尝试在一个应用程序中实现 IAP,我快到了,但仍然面临一些问题。我之前已经发布了另一个问题,因为我发现一个不完整的教程缺少一些东西所以我被卡住了,有人已经帮我解决了这个问题......但在那个教程中他们使用的是一张桌子,而我只想使用普通按钮. 在各种答案之间,有一个答案给了我一种解决这个问题的新方法..所以我试了一下,但我发现的问题出现了:

  • 我收到警告,该人在回答中告诉我在我的头文件中包含以下每个协议:

    SKProductsRequestDelegate SKPaymentTransactionObserver SKRequestDelegate

我用这段代码做到了:

@interface BuyTest2 : UIViewController <SKProductsRequestDelegate, SKPaymentTransactionObserver, SKRequestDelegate>

但现在我在 m 文件中收到此警告:

Method 'paymentQueue:updatedTransactions:' in protocol not implemented

这是为什么?我错过了什么吗?(我确定我是……)

  • 当我单击按钮购买硬币时,一切正常,但购买完成后,我不知道如何交付硬币......我有我的代码来做,但我不知道把它放在哪里......我该怎么做?

  • 如果我再次尝试进行测试购买,我会收到消息说我已经购买了该项目并且我必须单击“确定”才能下载它......但之后没有任何反应......我真的没有给一些东西下载,但我只需要添加一些硬币到一个变量,然后用 NSUserDefaults 保存它......

这是我正在使用的代码:

在文件 .hi 中

@interface BuyTest2 : UIViewController <SKProductsRequestDelegate, SKPaymentTransactionObserver, SKRequestDelegate>


@property (nonatomic, retain) SKProduct *currentProduct;
@property(nonatomic, readonly) SKPaymentTransactionState transactionState;
@property (nonatomic, retain) SKProductsRequest *ualRequest;

在文件 .mi 中得到:

-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
  {
if(response.products.count > 0)
{
    SKProduct* product;

    for(int i = 0; i<response.products.count; i++)
    {
        product = [response.products objectAtIndex:i];

        if([product.productIdentifier isEqualToString:@"com.mycompany.myapp.1"])
        {
            self.currentProduct = product;
            [self beginPaymentWithProduct:product];
        }
    }
   }
   }


   - (void)beginPaymentWithProduct:(SKProduct*)product
   {
       SKPayment *payment = [SKPayment paymentWithProduct:product];
       [[SKPaymentQueue defaultQueue] addPayment:payment];
   }


   - (BOOL)canMakePurchases
   {
       return [SKPaymentQueue canMakePayments];
   }


   - (IBAction)buyCoins:(id)sender
   {
       if([self canMakePurchases])
       {
           ualRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet        setWithArray:[NSArray arrayWithObjects: @"com.mycompany.myapp.1", nil]]];
           [ualRequest setDelegate:self];
           [ualRequest start];
       }
   }



   - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
   {
       for (SKPaymentTransaction* transaction in transactions) {
           if (transaction.transactionState == SKPaymentTransactionStatePurchased) {
               NSLog(@"Transaction Purchased: %@", transaction);
               // Make purchase available to the user, etc...
               // Once that's all done...
               [queue finishTransaction:transaction];
           }
           else if (transaction.transactionState == SKPaymentTransactionStateFailed) {
               NSLog(@"Transaction Failed: %@", transaction);
               // Display error to the user, using the error text in the transaction
               // This example uses NSLog, typically you'd use UIAlertView here
               NSLog(@"Error: %@", [transaction.error localizedDescription]);
           }
       }

}

谢谢你的帮助...

4

1 回答 1

1

但现在我在 m 文件中收到此警告:

Method 'paymentQueue:updatedTransactions:' in protocol not implemented

错误消息在这里非常有用。paymentQueue:updatedTransactions:是 SKPaymentTransactionObserver 协议的一部分,并且是必需的方法(意思是,如果您要成为支付交易的观察者,则必须实现它。请记住,警告是您应该认真看待的事情,通常您应该考虑它们作为错误)。可以在此处找到此协议的文档。

对这种特定方法的讨论非常清楚它的目的以及您需要做什么。这是检查交易是否已完成的方法,如果已完成,您有责任向用户提供功能/内容。

应用程序应通过检查事务的 transactionState 属性来处理每个事务。如果 transactionState 是 SKPaymentTransactionStatePurchased,则成功接收到所需功能的付款。应用程序应使用户可以使用该功能。如果 transactionState 是 SKPaymentTransactionStateFailed,应用程序可以读取交易的错误属性以向用户返回一个有意义的错误。

处理完交易后,应通过调用支付队列的 finishTransaction: 方法将其从支付队列中移除,并将交易作为参数传递。

Apple 提供了有关如何使用 IAP 系统的最佳文档,我强烈建议您仔细阅读。它可以在这里找到。

更新: 这是一个代码片段,显示了此方法所需内容的一般要点:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    for (SKPaymentTransaction* transaction in transactions) {
        if (transaction.transationState == SKPaymentTransactionStatePurchased) {
            NSLog(@"Transaction Purchased: %@", transaction);
            // Make purchase available to the user, etc...
            // Once that's all done...
            [queue finishTransaction:transaction];
        }
        else if (transaction.transactionState == SKPaymentTransactionStateFailed) {
            NSLog(@"Transaction Failed: %@", transaction);
            // Display error to the user, using the error text in the transaction
            // This example uses NSLog, typically you'd use UIAlertView here
            NSLog(@"Error: %@", [transaction.error localizedDescription]);
        }
    }
}

并记得为自己注册活动。您可以通过以下方式执行此操作:

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];

将这些添加到适当的位置,例如 init/dealloc。不要在 viewDidLoad 中使用它,因为这更像是一种视觉效果,而不是数据模型问题。

于 2013-04-29T20:25:08.447 回答