我已经成功实现了一种消耗品,但是我不知道要实现多种消耗品。我想添加更多产品标识符,例如com.lalala.20batteries,com.lalala.30batteries

谁能给我一些指南

这是我的单耗材代码

@interface ViewController () <SKProductsRequestDelegate, SKPaymentTransactionObserver>

@end

@implementation ViewController


#define ProductIdentifier @"com.lalala.10batteries"

- (IBAction)taps10batteries{
   NSLog(@"User requests to get 10 batteries");

   if([SKPaymentQueue canMakePayments]){
      NSLog(@"User can make payments");

      SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:ProductIdentifier]];
      productsRequest.delegate = self;
      [productsRequest start];

   }
   else{
      NSLog(@"User cannot make payments due to parental controls");

   }
}



- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
   SKProduct *validProduct = nil;
   int count = [response.products count];
   if(count > 0){
      validProduct = [response.products objectAtIndex:0];
      NSLog(@"Products Available!");
      [self purchase:validProduct];
   }
   else if(!validProduct){
      NSLog(@"No products available");

   }
}


- (IBAction)purchase:(SKProduct *)product{
   SKPayment *payment = [SKPayment paymentWithProduct:product];

   [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
   [[SKPaymentQueue defaultQueue] addPayment:payment];


}



- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
   NSLog(@"received restored transactions: %i", queue.transactions.count);
   for(SKPaymentTransaction *transaction in queue.transactions){
      if(transaction.transactionState == SKPaymentTransactionStateRestored){
         //called when the user successfully restores a purchase
         NSLog(@"Transaction state -> Restored");

         [self get10Batteries];
         [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
         break;
      }
   }
}

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{
   for(SKPaymentTransaction *transaction in transactions){
      switch(transaction.transactionState){
         case SKPaymentTransactionStatePurchasing: NSLog(@"Transaction state -> Purchasing");

            break;
         case SKPaymentTransactionStatePurchased:

            [self get10Batteries];
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            NSLog(@"Transaction state -> Purchased");
            break;
         case SKPaymentTransactionStateRestored:
            NSLog(@"Transaction state -> Restored");

            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            break;
         case SKPaymentTransactionStateFailed:

            if(transaction.error.code == SKErrorPaymentCancelled){
               NSLog(@"Transaction state -> Cancelled");
               //the user cancelled the payment ;(
            }
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            break;
      }
   }
}


- (void)get10Batteries{

    NSUbiquitousKeyValueStore *cloudstore1 = [NSUbiquitousKeyValueStore defaultStore];

   //load cloud integer
   coins = [cloudstore1 doubleForKey:@"yo" ];



   coins = [[NSUserDefaults standardUserDefaults]
                       integerForKey:@"com.lalala.10batteries"];
   coins += 10;
   [[NSUserDefaults standardUserDefaults] setInteger:coins
                                              forKey:@"com.lalala.10batteries"];
   [[NSUserDefaults standardUserDefaults] synchronize];



  _coinLabel.text =  [NSString stringWithFormat:@"%li", (long)coins];



   //save icloud

   [cloudstore1 setDouble:coins forKey:@"yo"];

   [cloudstore1 synchronize];


}

- (void)viewDidLoad {
    [super viewDidLoad];

   NSUbiquitousKeyValueStore *cloudstore1 = [NSUbiquitousKeyValueStore defaultStore];
   _coinLabel.text = [cloudstore1 stringForKey:@"yo" ];


   NSUserDefaults *coinsdefaults = [NSUserDefaults standardUserDefaults];




   if([coinsdefaults objectForKey:@"com.lalala.10batteries"] != nil) {

      coins = [[NSUserDefaults standardUserDefaults] integerForKey:@"com.lalala.10batteries"];

      coins = [coinsdefaults integerForKey:@"com.lalala.10batteries"];

       _coinLabel.text =  [NSString stringWithFormat:@"%li", (long)coins];



   }



}

最佳答案

您的代码可以轻松支持多种产品,就像它支持一种产品一样。
首先,声明您的其他产品ID,就像您对一个产品ID一样:

#define ProductIdentifier1 @"com.lalala.10batteries"
#define ProductIdentifier2 @"com.lalala.20batteries"

然后,创建一个loadAllProducts方法,该方法与taps10batteries方法完全相同,不同之处在于,使用所有产品ID声明SKProductsRequest就像使用一个方法一样:
SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObjects:ProductIdentifier1, ProductIdentifier2, nil]];

除非您希望分别加载每个产品,否则您将需要为每个产品创建一个方法,即taps20batteries,并且可以忽略我的答案的下一部分...

回调方法可以返回多个产品,就像可以返回一个一样。按照您认为合适的方式处理响应,就像处理一个响应一样:
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
   int count = [response.products count];
   if(count > 0){
       _products = [response.products sortedArrayUsingComparator:^(id a, id b) { //sort all products by price
            NSDecimalNumber *first = [(SKProduct*)a price];
            NSDecimalNumber *second = [(SKProduct*)b price];
            return [second compare:first];
        }];
       for (SKProduct *product in _products) {
         NSLog(@"Product Available: %@", product.productIdentifier);
         //do something with the product..
         //perhaps gather the products into an array and present it somehow to the user so s/he can select what to buy?
       }
   }
   else {
   NSLog(@"No products available");

   }
}

如果您想使用完整的实现,请尝试this one

07-24 09:45
查看更多