2015-06-27 67 views
2

我已经成功实施了一种消费品,但我不知道如何实施多种消费品。我还想ADDD更ProductIdentifiers像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]; 



    } 



} 
+1

你有什么企图实现多种消费类产品?请做一些研究并付出努力尝试,我们很乐意帮助您进行调试。 – kittykittybangbang

+0

我做了很多,但我仍然没有线索。例如,来自ray wenderlich的教程。他们使用 “的NSSet * productIdentifiers = [NSSet中setWithObjects: @” com.razeware.inapprage.drummerrage”, @ “com.razeware.inapprage.itunesconnectrage”, @ “com.razeware.inapprage.nightlyrage”, 零];”我只是不知道如何申请我的情况。请帮忙 – Sacha

回答

2

您的代码可以轻松支持多个产品,就像它支持一个......所有的 首先,声明你的其他产品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

+1

呵呵,同时写了。我按价格排序:P – Jaro

+0

是@Jaro,按价格排序绝对是一种很好的方式,我会将其添加到我的答案中。不好意思偷你的雷霆;) – orenk86

1

看到代码在其中创建SKProductsRequest对象行:

SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:ProductIdentifier]]; 

的NSSet是内部无序对象一个袋子,只是一种允许内袋(没有模糊)。

所有你所要做的就是改变这样的:

SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObjects: 
            @"com.blahblah.unlockall", 
            @"com.blahblah.sounds", 
            @"com.blahblah.alarms", 
            @"com.blahblah.wallpapers", 
            nil]]; 

然后ü应该有一个自定义包装类(CustomIAPHelper)的教程。

在视图控制器让我们假设你有一个的tableView然后代码如下所示:

- (void)reload { 
    _products = nil; 
    [self.tableView reloadData]; 
    [CustomIAPHelper sharedInstance].delegate = self; 
    [[CustomIAPHelper sharedInstance] requestProductsWithCompletionHandler:^(BOOL success, NSArray *products) { 
     if (success) { 

      // Sort the products array (by price) 
      _products = [products sortedArrayUsingComparator:^(id a, id b) { 
       NSDecimalNumber *first = [(SKProduct*)a price]; 
       NSDecimalNumber *second = [(SKProduct*)b price]; 
       return [second compare:first]; 
      }]; 

      [self.tableView reloadData]; 
     } 
     [refreshControl endRefreshing]; 
     [activity stopAnimating]; 
     [activity setHidden:YES]; 
    }]; 
} 

记得启动和实现iAPHelper的协议方法。

相关问题