ios - 获取应用内购买的订阅到期日期 - 从 appStoreReceiptURL 开始

标签 ios objective-c in-app-purchase

我有一项应用内购买是自动续订订阅。从完成的应用内购买中,我需要能够检索订阅到期日期,以便我知道订阅何时不再有效。我的理解是,这意味着(现在从 iOS 7 开始)从 appStoreReceiptURL 开始,获取其背后的数据,然后以某种方式从那里我可以访问有关应用内购买的元素。

但是从那里开始就很模糊,而且我在网上找到的所有代码示例似乎都不起作用。其中很多对于 iOS 7 来说已经过时了。其中大部分根本不处理订阅。我真正需要的是一些示例代码,它从 appStoreReceiptURL 到订阅到期日期成一条直线,中间的代码行最少。出于某种原因,这似乎非常困难,但我不明白为什么。人们经常将收据验证纳入其中,这似乎是个好主意,但它也增加了另一个巨大的复杂性,使我的主要目标模糊不清,而且这个收据验证代码似乎总是不起作用。我似乎总是碰壁的地方是我采用 NSData 和 base64 对其进行编码的地方。看起来应该是这样的:

NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSLog(@"receiptURL:%@", receiptURL);

NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL];
NSLog(@"receiptData:%@", receiptData);

NSString *receiptString = [self base64forData:receiptData];
NSLog(@"receiptString:%@", receiptString);

base64forData 方法如下所示:

// from http://stackoverflow.com/questions/2197362/converting-nsdata-to-base64
+ (NSString*)base64forData:(NSData*)theData {
    const uint8_t* input = (const uint8_t*)[theData bytes];
    NSInteger length = [theData length];
    static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    NSMutableData* data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
    uint8_t* output = (uint8_t*)data.mutableBytes;
    NSInteger i;
    for (i=0; i < length; i += 3) {
        NSInteger value = 0;
        NSInteger j;
        for (j = i; j < (i + 3); j++) {
            value <<= 8;

            if (j < length) {
                value |= (0xFF & input[j]);
            }
        }
        NSInteger theIndex = (i / 3) * 4;
        output[theIndex + 0] =                    table[(value >> 18) & 0x3F];
        output[theIndex + 1] =                    table[(value >> 12) & 0x3F];
        output[theIndex + 2] = (i + 1) < length ? table[(value >> 6)  & 0x3F] : '=';
        output[theIndex + 3] = (i + 2) < length ? table[(value >> 0)  & 0x3F] : '=';
    }
    return [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
}

在输出中,我得到了一个有效的 receiptURL,但前提是我在应用程序委托(delegate)中执行了代码。如果我尝试在像我的商店观察者这样的子类中执行它,它总是返回 nil。我暂时忽略它,只是在应用程序委托(delegate)中执行它。然后,如果 receiptURL 有效,那么我会得到一个有效的 receiptData block ,然后 receiptString 为 nil。所以看起来好像 base64forData 方法不起作用,或者整个方法可能是错误的?

从 iOS 7 中未弃用的已完成 SKPaymentTransaction 获取订阅到期日期的最简单方法是什么?

最佳答案

我们使用 Apple 的应用商店收据验证服务。 Tom Kincaid 对这个问题的回答中有很好的示例代码:-

StackOverflow app store receipt question

关于ios - 获取应用内购买的订阅到期日期 - 从 appStoreReceiptURL 开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20029144/

相关文章:

ios - -[UIView setHostedGraph :] unrecognized selector sent to instance

iOS 第一个应用程序,接受 hello world 的不受信任证书

ios - writeToFile 失败,错误 = null

ios - NSUserDefaults 覆盖以前保存的值

iOS 重定向回应用程序

ios 以毫秒为单位向 UITableView 添加数据

ios - 专为 iOS7 设计的 Storyboard 在 4 英寸设备的 iOS 6 上无法全屏显示

ios - 有没有办法从 StoreKit API 中的 SKPayment 获取 SKProduct?

ios - iOS应用内购买仅会使生产失败

ios - 应用内购买,部分使用积分