2013-11-25 60 views
1

在WWDC 2013關於處理應用商店收據的討論中,建議iOS應用盡快調用收據驗證代碼。甚至在application:didFinishLaunchingWithOptions:之前 - 即在main()函數中。我想,這會的工作方式如下:是否可以從main()調用SKReceiptRefreshRequest?

int main(int argc, char *argv[]) { 

    @autoreleasepool { 
     validateReceiptMethod(); // <---- HERE 
     int retVal = UIApplicationMain(argc, argv, nil, nil); 
     return retVal; 
    } 
} 

的想法是,UIApplicationMain()方法就是啓動您的應用並調用application:didFinishLaunchingWithOptions:。如果您在UIApplciationMain()之後放置validateReceiptMethod(),它將永遠不會運行。

無論如何,這是行之有效的。但如果沒有收據呢?然後,您需要撥打SKReceiptRefreshRequest以從應用商店獲取新的付款,這很好。但是,如果您在UIApplciationMain()之前運行此代碼,它也將在任何UI顯示之前運行。那麼在向用戶顯示蘋果ID登錄對話框方面會發生什麼?是否可以從main()方法撥打SKReceiptRefreshRequest

回答

2

那麼在向用戶顯示蘋果ID登錄對話框方面會發生什麼?

Store Kit警報出現在不屬於您的應用程序的窗口中,因此可以在您的應用程序未處於活動狀態時顯示 - 即使在啓動之前。但這不是真的有關。

是否可以從main()方法中調用SKReceiptRefreshRequest

如果您設置了自己的事件循環,然後在收到請求結束時將其停止,但您不應該這樣做,這可能是可能的。不要延遲啓動等待網絡請求的應用程序;它可能永遠不會完成。如果收據無效,我會建議輸入UIApplicationMain()並在啓動完成時請求另一張收據。

編輯:既然你不能做進入UIApplicationMain()之前沒有一個有效的收據什麼,我不明白爲什麼蘋果公司建議在此點檢查。這對於OS X來說是有意義的,因爲應用程序應該終止,但在iOS上應用程序應該繼續運行並且忽略無效收據是可以接受的。您可以儘早檢查,將狀態存儲在全局變量中,然後稍後作出響應;但爲什麼不檢查只有當你準備好迴應。

+0

這是一個好主意。 'validateReceiptMethod()'可以基於發生什麼返回一個INT(例如,如果收據無效,則爲1;如果沒有收到,則返回-1)。有一種簡單的方法可以將返回變量從main()傳遞給'application:didFinishLaunchingWithOptions:',這樣當調用該方法時,它將知道(不必驗證收據的第二次)是否有收據,因此它應該調用'SKReceiptRefreshRequest'並獲得一個新的? – Jason