恢复单个应用程序购买iOS

时间:2014-08-13 21:10:21

标签: ios objective-c

我正在开发一款免费应用,可以购买年度订阅,解锁全部内容。在过去的几个星期里,我一直在阅读苹果网站和查找更好地解释如何完成这个过程的教程之间切换。我已经浏览了带有测试帐户的页面并且付款流程正常运行,我遇到的唯一问题是在访问此页面之前验证用户已付款。

我用来连接Apple商店的页面是名为PurchaserViewController的UIViewController,在要求用户订阅之后才能访问此页面。根据Apple网站:

解锁应用程序功能

如果产品启用了应用程序功能,请设置布尔值以启用代码路径并根据需要更新用户界面。要确定要解锁的功能,请查看应用在交易发生时所做的持久性记录。只要购买完成并在应用启动时,您的应用就需要更新此布尔值。

根据我的理解,他们正在引用应用收据系统,但我感到困惑,因为Apple开发者网站提到了所有这些工具和事情来实现您的目标,但没有给您提供示例或向您展示如何实现它们。 / p>

对于iOS 7及更高版本中的非消耗品和自动续订订阅,请使用应用收据作为持久记录。

首先,我认为这一步骤就像在paymentQueue中设置NSUserDefaults一样简单,并在订阅到期时更新它。当我在网上查看收据验证时,我得到了有关本地恢复的文章,通过应用程序商店在线恢复,编码和解码收据,验证收据是否由苹果签名并且它引用了我的应用程序...此时我忘记了什么我甚至想要完成。

我是否有一种简单的方法可以恢复单个应用购买,因此当用户登录应用时,它不会通过Confirm Subscription - Do you want to subscribe to *product* for *duration* for *price*?提示他们,当他们点击Confirm时 - > You're currently subscribed to this.

到目前为止这是我的PurchaserViewController.m,要访问它,我的主ViewController.m页面上有一个按钮segue:

#import "PurchaserViewController.h"

@interface PurchaserViewController ()
@end

@implementation PurchaserViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    if ([SKPaymentQueue canMakePayments]) {
        NSLog(@"Parental-controls are disabled");

        //product name replaced with 1
        SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:@"1"]];
        productsRequest.delegate = self;
        [productsRequest start];
    } else {
        NSLog(@"Parental-controls are enabled");
    }
}

- (IBAction)purchase:(SKProduct *)product {
    SKPayment *payment = [SKPayment paymentWithProduct:product];
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [[SKPaymentQueue defaultQueue] addPayment:payment];}

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
    SKProduct *validProduct = nil;
    int count = (int)[response.products count];
    if (count > 0) {
        validProduct = [response.products objectAtIndex:0];
        [self purchase:validProduct];
        NSLog(@"self purchase validProduct");
    } else if (!validProduct) {
        NSLog(@"No products available");
    }
}

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
    for (SKPaymentTransaction *transaction in transactions) {
        NSLog(@"paymentQueue");
        switch (transaction.transactionState) {
            case SKPaymentTransactionStatePurchasing:
                break;
            case SKPaymentTransactionStatePurchased:
                NSLog(@"Should work now!");

                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                NSLog(@"Work once again!");
                break;
            case SKPaymentTransactionStateFailed:
                if (transaction.error.code != SKErrorPaymentCancelled) {
                    NSLog(@"Error encountered");
                }

                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;
        }
    }
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end

换句话说,我如何验证用户是否购买了?在购买时是否可以根据用户默认值设置某些内容?但如果是这样,我如何让它过期并重新检查,或者在重新安装应用程序时恢复它?如何找到收据或询问苹果购买凭证?

2 个答案:

答案 0 :(得分:2)

ViewController.m文件中,加入viewDidLoad

NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
if (!receipt) { NSLog(@"No local receipt -- handle the error."); } else { NSLog(@"Local Receipt Found"); }

希望这有帮助。

答案 1 :(得分:0)

您正在创建不可续订的订阅。根据Apple的StoreKitGuide,收据不是坚持这个的地方。这就是他们所说的:

对于非续订订阅,请使用iCloud或您自己的服务器来保留持久记录。

您可以在该文档的pdf版本的第26页找到此内容。