- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经成功实现了一种消费品,但我不知道实现多种消费品。我想添加更多产品标识符,例如 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
关于ios - 如何实现多消耗品内购,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31084166/
这是一个 Cocoa 应用内购买问题。 我有一款游戏,您可以购买一组 10 条生命,这是一种消耗品应用内购买 - 一旦生命用完,用户必须购买更多生命。 如果用户使用生命的子集(例如 5),然后删除应用
我正在我的应用程序中实现应用内购买。根据要求,每次我在应用程序中按下“购买”按钮时,应该购买产品。 在 itunesconnect 网站上,我的产品属于哪一类? 消耗品或非消耗品。 我对选择类别感到困
在我的实时应用程序上,用户不断收到有关消费品的错误消息。这是非常随机的错误,很少发生。 此应用内购买已被购买。它将免费恢复。 在我的应用程序中,除非应用程序购买过程完成,否则我阻止用户点击“立即购买”
我的问题主要围绕使用 Google 的应用内结算 API 处理应用内消费品购买。 ( https://developer.android.com/google/play/billing/api.htm
我对应用内购买的特定情况有疑问。 我们在我们的应用程序中有一个用于购买硬币的消耗品: 使用 IAP 购买 0.99 美元的硬币包 我们向我们的服务器发送请求以记录购买并将硬币添加到他们的帐户(这些硬币
是否可以通过 Windows 应用商店购买以下项目作为应用内购买? 插件 消耗品(一次性使用) 订阅 我在哪里可以找到有关如何在应用内购买中为插件、消耗品、订阅编码的资源? 是的,我曾尝试使用谷歌搜索
我是一名优秀的程序员,十分优秀!