如何在应用内购买中识别当前的订阅计划[自动续订]

时间:2019-06-19 07:45:43

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

我在in-app-purchase 1个月 6个月 1年中有三个订阅计划,所以我想检查用户当前的订阅计划和到期日期,所以我现在正在做的是从收据中得到latest_receipt_info,因为我正在使用最后一个对象。 从最后一个对象开始,我正在使用product_id并将其用作当前的 subscription 计划,而expires_date则用于检查是否处于活动状态。 以下是我正在使用的code块。 那么这是正确的方法吗?

if([dict[@"status"] integerValue] == 0) {
    if([dict.allKeys containsObject:@"latest_receipt_info"]) {
        NSArray *iapReceipts = dict[@"latest_receipt_info"];
        if(iapReceipts) {
            if(iapReceipts.count > 0) {
                NSDictionary *latestReceipt = [iapReceipts lastObject];
                if(latestReceipt) {
                    _currentIAPID = latestReceipt[@"product_id"];
                    NSDate *expireDate = latestReceipt[@"expires_date"];
                    if(expireDate) {
                        NSInteger days = DaysBetween(NSDate.date, expireDate);
                        if(days >= 0) {
                            NSLog(@"days %ld",(long)days);
                            status = SubscriptionStatusActive;

                        } else {
                            NSLog(@"Subs :NEGATIVE DAYS");
                            status = SubscriptionStatusExpired;
                        }
                    }
                }
            }
        }
    }
}

任何建议都会更有帮助。

1 个答案:

答案 0 :(得分:0)

不,这不是正确的方法。您不应该得到最后一个对象,因为该数组未排序。它包含您的所有交易,包括所有续订。此示例代码未考虑cancel_date:

- (void)parseResponse:(NSDictionary*)dict{
    if ([dict[@"status"] integerValue] != 0) {return;}

    NSArray *iapReceipts = dict[@"latest_receipt_info"];

    NSDateFormatter *formatter = [NSDateFormatter new];
    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss VV";

    for (NSDictionary *iapReceipt in iapReceipts){
        NSString *productID = iapReceipt[@"product_id"];
        NSDate *date = [formatter dateFromString:iapReceipt[@"expires_date"]?:@""];

        if (date && [date timeIntervalSinceDate:[NSDate date]] > 0){
            [[NSUserDefaults standardUserDefaults] setObject:date forKey:productID];
        }
    }
}

- (BOOL)isSubscriptionActive:(NSString*)productID {
    NSDate *date = [[NSUserDefaults standardUserDefaults] objectForKey:productID];
    if (date && [date timeIntervalSinceDate:[NSDate date]] > 0){
        return YES;
    } else {
        return NO;
    }
}