是否可以从main()调用SKReceiptRefreshRequest?

时间:2013-11-25 21:52:33

标签: ios app-store lifecycle storekit apple-id

在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之前运行。那么在向用户显示苹果ID登录对话框方面会发生什么?甚至可以从SKReceiptRefreshRequest方法拨打main()吗?

1 个答案:

答案 0 :(得分:2)

  

那么在向用户显示苹果ID登录对话框方面会发生什么?

Store Kit警报显示在不属于您的应用程序的窗口中,因此可以在应用程序未处于活动状态时显示 - 甚至在启动之前也会显示。但这并不是真的相关。

  

甚至可以从SKReceiptRefreshRequest方法拨打main()吗?

如果你设置了自己的事件循环,然后在收据请求完成时停止它,这可能是可能的,但是你不应该这样做。不要延迟启动等待网络请求的应用程序;它可能永远不会完成。如果收据无效,我建议您在启动完成时输入UIApplicationMain()并请求另一张收据。

修改:由于您在输入UIApplicationMain()之前无法获得有效收据,因此我不明白Apple为何建议您进行检查。这在OS X上是有意义的,因为应用程序应该终止,但是在应用程序应该继续运行的iOS上并不可以忽略无效的收据。您可以提前检查,将状态存储在全局变量中,然后再回复;但为什么不在你准备回应时检查。