我在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;
}
}
}
}
}
}
}
任何建议都会更有帮助。
答案 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;
}
}