在应用内购买,如何在购买后提供消耗品

时间:2013-04-29 19:12:59

标签: iphone objective-c in-app-purchase

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

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

    SKProductsRequestDelegate SKPaymentTransactionObserver SKRequestDelegate

我用这段代码做了:

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

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

Method 'paymentQueue:updatedTransactions:' in protocol not implemented

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

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

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

这是我正在使用的代码:

在文件中.h我得到了

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


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

在文件.m中我得到了:

-(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]);
           }
       }

}

感谢您的帮助......

1 个答案:

答案 0 :(得分:1)

  

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

     

Method 'paymentQueue:updatedTransactions:' in protocol not implemented

错误信息在这里非常有用。 paymentQueue:updatedTransactions:是SKPaymentTransactionObserver协议的一部分,是一种必需的方法(意思是,如果您要成为支付交易的观察者, >实施它。请记住,警告是您应该做的事情认真看待,通常你应该把它们视为错误)。该协议的文档can be found here

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

  

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

     

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

Apple提供了有关如何使用IAP系统的最佳文档,我强烈建议您仔细阅读。 It is available here.

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

- (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中使用它,因为这更像是一种视觉效果,而不是数据模型问题。