當我們需要刷新iOS7收據時,正確的方法是使用SKReceiptRefreshRequest。這會彈出一個Apple對話框供用戶使用他們的Apple ID登錄。它也允許他們取消。 我們如何檢測用戶是否按下取消?(當然,在iOS6中,這可以使用catching the cancel event for [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]來完成)。檢測用戶是否取消SKReceiptRefreshRequest以登錄
的SKReceiptRefreshRequest對象有兩種方法委託:
- (void)requestDidFinish:(SKRequest *)request;
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error;
在我的代碼,如果用戶或不按取消requestDidFinish委託方法被調用。
這對我很重要的原因是,如果用戶按下取消,我想取消恢復過程。如果在刷新請求後沒有收到任何收據,這可能相對容易。但是,有時在SKReceiptRefreshRequest之前,應用程序中會出現收據(包含一些購買),因此如果用戶從登錄對話框中取消,它將保留在應用程序中。
我對如何做到這兩個想法:
1)刪除收到之前刷新請求的包。這個明顯的問題是,應用程序無法從軟件包中刪除文件(例如,請參閱Delete file from bundle after install)。我試過了。不。
2)檢查刷新請求之前和之後的收據字節;如果它們不同,那麼這應該表明用戶沒有按取消。如果他們沒有不同,我不確定確實表明他們按下取消。如果收據包含購買,我認爲字節將有所不同,因爲刷新的收據應該具有不同的事務ID(但是相同的「原始」事務ID)。如果收據不包含購買,我不確定。
更新日期11/9/15;我剛剛注意到,對於用戶按下取消的代理響應似乎已經改變。現在,調用didFailWithError。然而,檢測用戶取消的問題依然存在。我們如何區分用戶按下取消和真正的錯誤?我一直在測試iOS8.4和iOS9.2(測試版)。我現在已經將這種缺乏區分能力的報告稱爲Apple的bug(bug#23476210)。
更新日期:11/10/15;此問題確實不是與iOS 9.0.2一起出現!我現在只用同樣的應用程序二進制文件在所有三個系統中嘗試了這一點,在相同的大致時間間隔內(所有三個系統在20分鐘內):(A)iOS9.2(13C5050d):問題確實發生(didFailWithError被調用並且不能區分真正的錯誤和用戶按下取消),(B)iOS9.0.2,不會發生問題(requestDidFinish被調用),並且(C)iOS8.4.1,問題確實發生。有了所有三個系統版本,這是在真實的硬件上運行,而不是模擬器。
我剛剛測試過2號)。如果在刷新之前有一個非空的收據,其中不包含購買,刷新後它將是一個**不同的非空收據。或者至少在我這樣做的兩次嘗試中,情況就是如此。當然,更直接的解決方案是很好的。例如,一個被調用來指示用戶按下取消的刪除方法。順便說一下,在我做的測試中,收據之間的5515字節和5522字節不同。 –