是否可以从main()调用SKReceiptRefreshRequest



在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上应用程序应该继续运行,并且可以忽略无效收据。您可以提前检查,将状态存储在全局变量中,然后稍后做出响应;但为什么不只在你准备好回应的时候检查一下呢。

相关内容

  • 没有找到相关文章

最新更新