这是使用Apple的doc并按照建议编辑的表格。 我创建了2个独立的按钮和2个独立的IBAction。
UIButton *buyCredit1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
buyCredit1.frame = scrollViewFrame;
[buyCredit1 setTitle:@"A bundle of 10 credits - 99¢" forState:UIControlStateNormal];
buyCredit1.tag = 10;
[scrollView addSubview:buyCredit1];
[buyCredit1 addTarget:self
action:@selector(purchase10credit:)
forControlEvents:UIControlEventTouchUpInside];
UIButton *buyCredit2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
buyCredit2.frame = scrollViewFrame;
[buyCredit2 setTitle:@"A bundle of 30 credits - 1.99¢" forState:UIControlStateNormal];
buyCredit2.tag = 30;
[scrollView addSubview:buyCredit2];
[buyCredit2 addTarget:self
action:@selector(purchase30credit:)
forControlEvents:UIControlEventTouchUpInside];
-(IBAction)purchase10credit:(id)sender{
SKMutablePayment *payment = [[SKMutablePayment alloc] init];
payment.productIdentifier = @"Bundle.10.credits";
[[SKPaymentQueue defaultQueue] addPayment:payment];
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
-(IBAction)purchase30credit:(id)sender{
SKMutablePayment *payment = [[SKMutablePayment alloc] init];
payment.productIdentifier = @"Bundle.30.credits";
[[SKPaymentQueue defaultQueue] addPayment:payment];
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
-(void) productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
SKProduct *validProduct = nil;
int count = [response.products count];
if (count > 0) {
validProduct = [response.products objectAtIndex:0];
}
else if (!validProduct) {
NSLog(@"No Products Available");
}
}
这是Apple针对应用内购买所反映的文档
-(void) productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
SKProduct *validProduct = nil;
int count = [response.products count];
if (count > 0) {
validProduct = [response.products objectAtIndex:0];
}
else if (!validProduct) {
NSLog(@"No Products Available");
}
}
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
for (SKPaymentTransaction *transaction in transactions)
{
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchased:
[self completeTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
[self failedTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
[self restoreTransaction:transaction];
default:
break;
}
}
}
- (void) updateCredit: (NSString *)productIdentifier {
//Adding to plist
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"data.plist"];
NSMutableArray *currPlist = [[NSMutableArray alloc] initWithContentsOfFile: path];
NSString *lastEx = [currPlist objectAtIndex:0];
int lastScore = [[currPlist objectAtIndex:1] intValue];
int numberOfTries = [[currPlist objectAtIndex:2] intValue];
int totalScore = [[currPlist objectAtIndex:3] intValue];
int avg = [[currPlist objectAtIndex:4] intValue];
int credit = [[currPlist objectAtIndex:5] intValue];
credit += 10;
NSString *currentCredit = [NSString stringWithFormat:@"%d credits",credit];
creditShow.text = currentCredit;
NSMutableArray *updatePlist = [[NSMutableArray alloc] init];
[updatePlist addObject:lastEx];
[updatePlist addObject:[NSNumber numberWithInt:lastScore]];
[updatePlist addObject:[NSNumber numberWithInt:numberOfTries]];
[updatePlist addObject:[NSNumber numberWithInt:totalScore]];
[updatePlist addObject:[NSNumber numberWithInt:avg]];
[updatePlist addObject:[NSNumber numberWithInt:credit]];
[updatePlist writeToFile: path atomically:YES];
}
- (void) completeTransaction: (SKPaymentTransaction *)transaction
{
// Your application should implement these two methods.
[self updateCredit:transaction.payment.productIdentifier];
// Remove the transaction from the payment queue.
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
- (void) restoreTransaction: (SKPaymentTransaction *)transaction
{
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
- (void) failedTransaction: (SKPaymentTransaction *)transaction
{
if (transaction.error.code != SKErrorPaymentCancelled) {
// Optionally, display an error here.
}
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
在 - (void)updateCredit:(NSString *)productIdentifier中,如何创建2个单独的信用更新?一个用于信用+ = 10(购买0.99¢和信用+ = 30(用于1.99美元)?
答案 0 :(得分:3)
检查purchase:
中的(id)发件人并确定按下了哪个按钮(您可以为按钮设置标签属性,例如标签= 1表示10个学分,标签= 5表示50个学分)。然后,您可以设置另一个应用内购买:
UIButton *tempButton = (UIButton *)sender;
if (tempButton.tag == 1)
payment.productIdentifier = @"Bundle.10.credits";
else
payment.productIdentifier = @"Bundle.50.credits";
至于更新推荐方式的状态:
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
for (SKPaymentTransaction *transaction in transactions)
{
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchased:
[self completeTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
[self failedTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
[self restoreTransaction:transaction];
default:
break;
}
}
}
- (void) completeTransaction: (SKPaymentTransaction *)transaction
{
// Your application should implement these two methods.
[self recordTransaction:transaction];
[self provideContent:transaction.payment.productIdentifier];
// Remove the transaction from the payment queue.
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
- (void) restoreTransaction: (SKPaymentTransaction *)transaction
{
[self recordTransaction: transaction];
[self provideContent: transaction.originalTransaction.payment.productIdentifier];
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
- (void) failedTransaction: (SKPaymentTransaction *)transaction
{
if (transaction.error.code != SKErrorPaymentCancelled) {
// Optionally, display an error here.
}
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
中提供了正确实现的应用内购买