【问题标题】:Implementing more than one type of purchase for In-App purchase为应用内购买实施不止一种类型的购买
【发布时间】:2012-05-16 03:08:03
【问题描述】:

这是根据建议使用 Apple 文档编辑的表单。 我用 2 个独立的 IBAction 创建了 2 个独立的按钮。

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 个单独的信用更新? 1 个积分 += 10(购买 0.99 美分,积分 += 30(1.99 美元)?

【问题讨论】:

    标签: objective-c ios xcode in-app-purchase


    【解决方案1】:

    检查purchase: 中的 (id)sender 并确定按下了哪个按钮(您可以为按钮设置标签属性,例如 tag=1 表示 10 个积分,tag=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];
    }
    

    应用内购买的正确实现见Apple official In-App Purchase Programming Guide.

    【讨论】:

    • 你的意思是UIButton *tempButton = (UIButton *)sender;
    • 设置另一个应用内购买是什么意思?就像在itunesconnect上一样?我已经这样做了。只是想知道如何区分 productIdentifier 以相应更新...
    • 您的应用内购买操作错误。请参阅 Apple 建议。或者我的代码(它基于该建议)。
    • 函数recordTransaction和provideContent里面是什么?我认为“provideContent”可以替换为我的 updateCredit 函数?
    • 我的 provideContent 提供内容 :) - (void) provideContent: (NSString *)productIdentifier { [[NSNotificationCenter defaultCenter] postNotificationName:@"productPurchased" object:nil userInfo:[NSDictionary dictionaryWithObject:productIdentifier forKey:@ "productIdentifierKey"]]; }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多