【问题标题】:Restore Purchase Functionality doesn't work well in ios恢复购买功能在 ios 中效果不佳
【发布时间】:2013-05-01 10:09:20
【问题描述】:

我有一个应用程序,其中我有 5 次非消耗性应用程序内购买。

我正在使用以下代码恢复应用内购买。

- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{

    //NSLog(@"into method1");
    purchasedItemIDs = [[NSMutableArray alloc] init];

    NSLog(@"received restored transactions: %i", queue.transactions.count);
    for (SKPaymentTransaction *transaction in queue.transactions)
    {
        NSString *productID = transaction.payment.productIdentifier;
        [purchasedItemIDs addObject:productID];
    }

    // [customSpinner hide:YES];

    if (queue.transactions.count==0)
    {

        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"FameFace" message:@"It seems you have not buy this Package" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
        [alert show];
        [alert release];

    }

    else
    {

        NSLog(@"Data available");


       NSString *isInApp = [[NSUserDefaults standardUserDefaults]valueForKey:@"Package"];

        if ([isInApp isEqualToString:@"Pack1"])
        {

            if ([[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedp1Once"])
            {
                // app already launched
                NSLog(@"Launching secondtime");
            }
            else
            {
                [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedp1Once"];
                NSLog(@"Launching first time");
                requestText= @"Animal";
                [self MakeQueryForUpdate];
                [self getdata];
            }




        }

        else if ([isInApp isEqualToString:@"Pack2"])
        {

            if ([[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedp2Once"])
            {
                // app already launched
                NSLog(@"Launching secondtime");
            }
            else
            {
                [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedp2Once"];
                NSLog(@"Launching first time");
                requestText= @"Celebrity";
                [self MakeQueryForUpdate];
                [self getdata];
            }

        }

        else if ([isInApp isEqualToString:@"Pack3"])
        {
            if ([[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedp3Once"])
            {
                // app already launched
                NSLog(@"Launching secondtime");
            }
            else
            {
                [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedp3Once"];
                NSLog(@"Launching first time");
                requestText= @"Nature";
                [self MakeQueryForUpdate];
                [self getdata];
            }


        }
}

以下是交易成功时的代码。

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
    for (SKPaymentTransaction *transaction in transactions) {
        switch (transaction.transactionState) {
            case SKPaymentTransactionStatePurchasing:

                break;

            case SKPaymentTransactionStatePurchased:
                //[self downloadFromURL:[NSURL URLWithString:@"http://www.iphonedevnation.com/tutorials/ForestGreen.mp3"]];
                // flgCheck = 1;
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

                [self completeTransaction:transaction];
   NSString *isInApp = [[NSUserDefaults standardUserDefaults]valueForKey:@"Package"];
 if ([isInApp isEqualToString:@"Pack1"])
                {
                    //by manthan...7th  may
                    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedp1Once"])
                    {
                        // app already launched
                        NSLog(@"Launching secondtime");
                    }
                    else
                    {
                        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedp1Once"];
                        NSLog(@"Launching first time");
                        requestText= @"Animal";
                        [self MakeQueryForUpdate];
                        [self getdata];
                    }

                }

                else if ([isInApp isEqualToString:@"Pack2"])
                {

                    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedp2Once"])
                    {
                        // app already launched
                        NSLog(@"Launching secondtime");
                    }
                    else
                    {
                        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedp2Once"];
                        NSLog(@"Launching first time");
                        requestText= @"Celebrity";
                        [self MakeQueryForUpdate];
                        [self getdata];
                    }

                }

                else if ([isInApp isEqualToString:@"Pack3"])
                {
                    //by manthan... 7th may
                    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedp3Once"])
                    {
                        // app already launched
                        NSLog(@"Launching secondtime");
                    }
                    else
                    {
                        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedp3Once"];
                        NSLog(@"Launching first time");
                        requestText= @"Nature";
                        [self MakeQueryForUpdate];
                        [self getdata];
                    }
                }

这工作正常。

我正在做的是,当用户从 In App Purchase 购买包时,我在我的数据库中插入了一些图像。

但是由于产品是非消耗品,如果用户删除应用程序并尝试恢复图像,我的数据库不会得到更新。

任何帮助将不胜感激。

谢谢...

已编辑

当用户尝试恢复购买时,我将代码放入以下方法中。

由于我有一个恢复按钮,并且在按下该按钮时,用户之前购买的包可能是 2,3 或 4 个(用户购买过的 5 个包中的任何一个,因为这些是非消耗品)。

case SKPaymentTransactionStateRestored:
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

                NSString *pk = [[NSUserDefaults standardUserDefaults]valueForKey:@"Package"];

                if ([pk isEqualToString:@"Pack1"])
                {
                    //by manthan...7th  may
                    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedp1Once"])
                    {
                        // app already launched
                        NSLog(@"Launching secondtime");
                    }
                    else
                    {
                        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedp1Once"];
                        NSLog(@"Launching first time");
                        requestText= @"Animal";
                        [self MakeQueryForUpdate];
                        [self getdata];
                    }

                }

                else if ([pk isEqualToString:@"Pack2"])
                {
                    //by manthan... 7th may
                    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedp2Once"])
                    {
                        // app already launched
                        NSLog(@"Launching secondtime");
                    }
                    else
                    {
                        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedp2Once"];
                        NSLog(@"Launching first time");
                        requestText= @"Celebrity";
                        [self MakeQueryForUpdate];
                        [self getdata];
                    }

                }

                else if ([pk isEqualToString:@"Pack3"])
                {
                    //by manthan... 7th may
                    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedp3Once"])
                    {
                        // app already launched
                        NSLog(@"Launching secondtime");
                    }
                    else
                    {
                        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedp3Once"];
                        NSLog(@"Launching first time");
                        requestText= @"Nature";
                        [self MakeQueryForUpdate];
                        [self getdata];
                    }
                }

当只有一次购买时,我可以简单地在 SKPaymentTransactionStateRestored 中更新我的数据库。

但是当我有多个非消耗品时,我该怎么办?

已编辑

 if ([transaction.payment.productIdentifier isEqualToString:@"Pack1"])
                {
                    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedp1Once"])
                    {
                        // app already launched
                        NSLog(@"Launching secondtime");
                    }
                    else
                    {
                        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedp1Once"];
                        NSLog(@"Launching first time");
                        requestText= @"Animal";
                        [self MakeQueryForUpdate];
                        [self getdata];
                    }
                }


                else if ([transaction.payment.productIdentifier isEqualToString:@"Pack2"])
                {
                    //by manthan... 7th may
                    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedp2Once"])
                    {
                        // app already launched
                        NSLog(@"Launching secondtime");
                    }
                    else
                    {
                        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedp2Once"];
                        NSLog(@"Launching first time");
                        requestText= @"Celebrity";
                        [self MakeQueryForUpdate];
                        [self getdata];
                    }

                }

                else if ([transaction.payment.productIdentifier isEqualToString:@"Pack3"])
                {
                    //by manthan... 7th may
                    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedp3Once"])
                    {
                        // app already launched
                        NSLog(@"Launching secondtime");
                    }
                    else
                    {
                        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedp3Once"];
                        NSLog(@"Launching first time");
                        requestText= @"Nature";
                        [self MakeQueryForUpdate];
                        [self getdata];
                    }
                }

【问题讨论】:

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


    【解决方案1】:

    您需要在updatedTransactions 方法中使用SKPaymentTransactionStateRestored 的大小写来执行此操作。

    恢复时会执行这种情况。

    - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
    {
        for (SKPaymentTransaction * transaction in transactions)
       {
            switch (transaction.transactionState)
            {
                case SKPaymentTransactionStatePurchased:
                    //do your stuff
                    break;
                case SKPaymentTransactionStateFailed:
                    //do your stuff
                    break;
                case SKPaymentTransactionStateRestored:
                    //do your database stuff
                default:
                    break;
            }
        };
    }
    

    参考

    支付交易状态

    交易的状态。

    enum { SKPaymentTransactionStatePurchasing,
    SKPaymentTransactionStatePurchased, SKPaymentTransactionStateFailed,
    SKPaymentTransactionStateRestored };
    
    typedef NSInteger SKPaymentTransactionState;
    

    常量

    SKPaymentTransactionStatePurchasing

    The transaction is being processed by the App Store.
    

    SKPaymentTransactionStatePurchased

    The App Store successfully processed payment. Your application should provide the content the user purchased.
    

    SKPaymentTransactionStateFailed

    The transaction failed. Check the error property to determine what happened.
    

    SKPaymentTransactionStateRestored

    This transaction restores content previously purchased by the user. Read the originalTransaction property to obtain information about the original purchase.
    
    Available in iOS 3.0 and later.
    
    Declared in SKPaymentTransaction.h.
    

    查看SKPaymentTransaction了解更多信息

    【讨论】:

    • 感谢您的回复。但是我想问你,苹果提供了这个功能,以防用户删除应用程序并恢复,以前在应用程序中购买的功能确实会出现。那么当用户按下恢复按钮时我需要触发查询吗?
    • 如果用户按下“恢复”按钮,之前购买的物品将在那里,无需任何费用。但是您需要自己完成其他任务(购买商品的数据库添加),否则当您终止应用程序时,状态将再次重置为初始状态。当您按下购买物品的恢复按钮时,SKPaymentTransactionStateRestored 案例将被执行。
    • 是的,你是对的。谢谢你。正如你所说,我将我的代码转移到方法 SKPaymentTransactionStateRestored 正如你从我上面的代码中看到的那样,按下恢复按钮时它不会进入我的循环,所以当我尝试时数据库不会更新将代码转换为您上面提到的方法后恢复购买。
    • @ManthanPatel:您可以使用transaction.payment.productIdentifier获取产品标识符
    • @ManthanPatel:第二个代码(第二个编辑)看起来不错,当你添加它时发生了什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多