我正在尝试实施自动续订订阅,但对我来说并不是很清楚。
如果我有一个类似app的杂志,并且想要跟踪订阅,即使它们现在无效,我是否必须将收据保存在我的应用程序中(例如Core Data)?我必须跟踪它们,因为即使订阅无效,我也必须让用户访问旧问题。所以要么它的状态代码为0或21006。
另一个问题是为什么Apple使用21006状态代码取消Apple取消的订阅,因为例如某人错误地订阅了订阅。当我只知道它现在无效时,我如何确定是否发生了这种情况?它也可能无效,因为它超出了订阅期。我从iTunes U上的WWDC 2011视频获得此信息。
任何帮助将不胜感激; - )
答案 0 :(得分:0)
Apple建议您存储并验证服务器上的所有收据,而不一定是应用程序上的收据。要检查某人订阅的状态,只需验证您为该用户存储的任何收据。 (必须是来自同一订阅系列的收据)然后,Apple将回复该订阅中的最新收据。您可以使用此信息向用户提供该杂志的所有问题,直到该收据的到期日期为止。如果需要,您可以在应用程序上执行此操作,但Apple不鼓励它,因为您必须将iTunes验证secret
存储在应用程序本身中。
至于你的第二个问题,我的假设是Apple认为退款是非常规的。所以他们不想为此作出任何让步。他们不想让它更容易或自动化。这就是为什么你没有得到一个特殊的代码,这意味着'用户的订阅因退款而被取消'。我希望这种情况非常罕见,只需免费向退款用户提供杂志文章,就不会让你破产。 (并且由于您的收据验证会显示其帐户未续订,因此您无需向他们提供新问题)。
答案 1 :(得分:0)
Apple建议您存储并验证服务器上的所有收据。
(OR)
RMStore委托事务持久性,并提供两个可选的引用实现,用于在Keychain或NSUserDefaults中存储事务。您可以实施交易,使用库提供的参考实施,或者在非消耗品和自动续订订阅的情况下,直接从收据中获取交易。
-(void) startProductPurchase{
[[RMStore defaultStore] requestProducts:[NSSet setWithArray:_products] success:^(NSArray *products, NSArray *invalidProductIdentifiers) {
_productsRequestFinished = YES;
NSLog(@"Product Request Finished");
[self buyApplication:products];
} failure:^(NSError *error) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Products Request Failed", @"")
message:error.localizedDescription
delegate:nil
cancelButtonTitle:NSLocalizedString(@"OK", @"")
otherButtonTitles:nil];
[alertView show];
}];
刷新收据通知(仅限iOS 7+)
- (void)storeRefreshReceiptFailed:(NSNotification*)notification;
{
NSError *error = notification.rm_storeError;
}
- (void)storeRefreshReceiptFinished:(NSNotification*)notification { }
收据验证
默认情况下,RMStore不会执行收据验证,但会提供参考实施。您可以实施自己的自定义验证或使用库提供的参考验证器。
以下概述了两种选择。有关更多信息,请查看维基。
参考验证员
RMStore通过RMStoreAppReceiptVerificator(适用于iOS 7或更高版本)和RMStoreTransactionReceiptVerificator(适用于iOS 6或更低版本)提供收据验证。要使用它们中的任何一个,请将RMStore / Optional中的相应文件添加到项目中,并在启动时设置验证程序委托(receiptVerificator)。例如:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
const BOOL iOS7OrHigher = floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1;
_receiptVerificator = iOS7OrHigher ? [[RMStoreAppReceiptVerificator alloc] init] : [[RMStoreTransactionReceiptVerificator alloc] init];
[RMStore defaultStore].receiptVerificator = _receiptVerificator;
// Your code
return YES;
}
有关详情,请参阅以下链接。
iOS In-App purchases made easy
A lightweight iOS library for In-App Purchases
欢迎。
希望它会帮助你.............