Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在应用程序购买中实现多个易耗品_Ios_Objective C_Xcode_In App Purchase - Fatal编程技术网

Ios 如何在应用程序购买中实现多个易耗品

Ios 如何在应用程序购买中实现多个易耗品,ios,objective-c,xcode,in-app-purchase,Ios,Objective C,Xcode,In App Purchase,我已经成功地实现了一个消耗品,但是我没有实现多个消耗品的线索。我想添加更多产品标识符,如com.lalala.20电池,com.lalala.30电池 谁能给我一些指南吗 这是我的单一消费品代码 @interface ViewController () <SKProductsRequestDelegate, SKPaymentTransactionObserver> @end @implementation ViewController #define ProductIden

我已经成功地实现了一个消耗品,但是我没有实现多个消耗品的线索。我想添加更多产品标识符,如com.lalala.20电池,com.lalala.30电池

谁能给我一些指南吗

这是我的单一消费品代码

@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];



   }



}
@界面视图控制器()
@结束
@实现视图控制器
#定义ProductIdentifier@“com.lalala.10batters”
-(iAction)TAPS10蓄电池{
NSLog(@“用户请求获得10块电池”);
如果([SKPaymentQueue canMakePayments]){
NSLog(@“用户可以付款”);
SKProductsRequest*productsRequest=[[SKProductsRequest alloc]initWithProductIdentifiers:[NSSet setWithObject:ProductIdentifier]];
productsRequest.delegate=self;
[产品需求启动];
}
否则{
NSLog(@“由于家长控制,用户无法付款”);
}
}
-(无效)产品请求:(SKProductsRequest*)请求DID接收方响应:(SKProductsResponse*)响应{
SKProduct*validProduct=nil;
int count=[response.products count];
如果(计数>0){
validProduct=[response.products对象索引:0];
NSLog(@“产品可用!”);
[自购:validProduct];
}
否则,如果(!validProduct){
NSLog(“无可用产品”);
}
}
-(iAction)采购:(SKProduct*)产品{
SKPayment*payment=[SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue]addTransactionObserver:self];
[[SKPaymentQueue defaultQueue]addPayment:payment];
}
-(无效)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue*)队列
{
NSLog(@“已接收还原的事务:%i”,queue.transactions.count);
用于(SKPaymentTransaction*队列中的事务。事务){
if(transaction.transactionState==SKPaymentTransactionStateRestored){
//当用户成功恢复购买时调用
NSLog(@“事务状态->已恢复”);
[自备电池];
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
打破
}
}
}
-(void)paymentQueue:(SKPaymentQueue*)队列更新事务:(NSArray*)事务{
用于(SKPaymentTransaction*交易中的交易){
开关(transaction.transactionState){
案例SKPaymentTransactionStatePurchasing:NSLog(@“交易状态->采购”);
打破
案例SKPaymentTransactionStatesPurchased:
[自备电池];
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
NSLog(@“交易状态->已购买”);
打破
案例SKPaymentTransactionStateRestored:
NSLog(@“事务状态->已恢复”);
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
打破
案例SKPaymentTransactionState失败:
if(transaction.error.code==SKErrorPaymentCancelled){
NSLog(@“事务状态->已取消”);
//用户取消了付款(
}
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
打破
}
}
}
-(无效)获取10个电池{
NSUbiquitousKeyValueStore*cloudstore1=[NSUbiquitousKeyValueStore defaultStore];
//加载云整数
硬币=[cloudstore1 doubleForKey:@“yo”];
硬币=[[NSUserDefaults standardUserDefaults]
integerworkey:@“com.lalala.10batters”];
硬币+=10;
[[NSUserDefaults standardUserDefaults]setInteger:coins
福克斯:“com.lalala.10batters”];
[[NSUserDefaults standardUserDefaults]同步];
_coinLabel.text=[NSString stringWithFormat:@“%li”,长)硬币];
//拯救icloud
[cloudstore1 setDouble:coins forKey:@“yo”];
[cloudstore1同步];
}
-(无效)viewDidLoad{
[超级视图下载];
NSUbiquitousKeyValueStore*cloudstore1=[NSUbiquitousKeyValueStore defaultStore];
_coinLabel.text=[cloudstore1 stringForKey:@“yo”];
NSUserDefaults*coinsdefaults=[NSUserDefaults standardUserDefaults];
如果([coinsdefaults objectForKey:@“com.lalala.10batters”]!=nil){
coins=[[NSUserDefaults standardUserDefaults]IntegerWorkey:@“com.lalala.10batters”];
coins=[coinsdefaults integerworkey:@“com.lalala.10batters”];
_coinLabel.text=[NSString stringWithFormat:@“%li”,长)硬币];
}
}

查看创建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]];  
- (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];
    }];
}
然后,您应该有一个自定义包装器类(CustomIAPHelper),如教程中所示

在view controller中,假设您有一个tableView,那么代码如下所示:

SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObjects:
                                  @"com.blahblah.unlockall",
                                  @"com.blahblah.sounds",
                                  @"com.blahblah.alarms",
                                  @"com.blahblah.wallpapers",
                                  nil]];  
- (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的协议方法。

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

#define ProductIdentifier1 @"com.lalala.10batteries"
#define ProductIdentifier2 @"com.lalala.20batteries"
SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObjects:ProductIdentifier1, ProductIdentifier2, nil]];
- (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");

   }
}
然后,创建一个
loadAllProducts
方法,该方法与
taps10batteries
方法完全相同,只是您使用所有产品ID声明了您的
SKProductsRequest
,就像您使用一个ID一样:

#define ProductIdentifier1 @"com.lalala.10batteries"
#define ProductIdentifier2 @"com.lalala.20batteries"
SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObjects:ProductIdentifier1, ProductIdentifier2, nil]];
- (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");

   }
}
除非您喜欢单独加载每个产品,否则您需要为每个产品创建一个方法,即
点击20电池
,您可以忽略我回答的下一部分

回调方法可以返回多个产品,就像它可以返回一个一样。按照您认为合适的方式处理响应,就像处理一个产品一样:

#define ProductIdentifier1 @"com.lalala.10batteries"
#define ProductIdentifier2 @"com.lalala.20batteries"
SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObjects:ProductIdentifier1, ProductIdentifier2, nil]];
- (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");

   }
}

如果您想要一个可以使用的完整实现,请尝试

您是否尝试过实现多个可消费产品?请进行一些研究并努力尝试,我们将很乐意帮助您调试。我做了很多工作,但仍然没有任何线索。例如,ray w