在WWDC 2013关于处理应用商店收据的讨论中,建议对于iOS应用程序,应尽快调用收据验证代码。甚至在application:didFinishLaunchingWithOptions:
之前,即在main()
函数中。我想这样做的方式如下:
int main(int argc, char *argv[]) {
@autoreleasepool {
validateReceiptMethod(); // <---- HERE
int retVal = UIApplicationMain(argc, argv, nil, nil);
return retVal;
}
}
这个想法是UIApplicationMain()
方法启动您的应用程序并调用application:didFinishLaunchingWithOptions:
。如果将validateReceiptMethod()
放在UIApplciationMain()
之后,它将永远不会运行。
不管怎样,这很有效。但是如果没有收据怎么办?然后你需要调用SKReceiptRefreshRequest
从应用商店获得一个新的,这很好。但是,如果您在UIApplciationMain()
之前运行此代码,它也将在任何UI显示之前运行。那么,向用户显示apple ID登录对话框会发生什么呢?是否可以从main()
方法调用SKReceiptRefreshRequest
?
那么,向用户显示apple ID登录对话框会发生什么呢?
Store Kit警报显示在应用程序不拥有的窗口中,因此在应用程序未处于活动状态时(甚至在启动之前)也会显示。但这并不是真正相关的。
是否可以从
main()
方法调用SKReceiptRefreshRequest
?
如果您设置自己的事件循环,然后在接收请求完成时停止它,这可能是可能的,但您不应该这样做。不要在等待网络请求时延迟启动应用程序;它可能永远不会完成。如果收据无效,我建议输入UIApplicationMain()
,并在启动完成时请求另一张收据。
编辑:由于在输入UIApplicationMain()
之前您无法处理没有有效收据的问题,我不明白苹果为什么建议在此时进行检查。这在OS X上是有意义的,因为应用程序应该终止,但在iOS上则不然,因为iOS上应用程序应该继续运行,并且可以忽略无效收据。您可以提前检查,将状态存储在全局变量中,然后稍后做出响应;但为什么不只在你准备好回应的时候检查一下呢。