2013-11-21 48 views
12

當我們需要刷新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,問題確實發生。有了所有三個系統版本,這是在真實的硬件上運行,而不是模擬器。

+0

我剛剛測試過2號)。如果在刷新之前有一個非空的收據,其中不包含購買,刷新後它將是一個**不同的非空收據。或者至少在我這樣做的兩次嘗試中,情況就是如此。當然,更直接的解決方案是很好的。例如,一個被調用來指示用戶按下取消的刪除方法。順便說一下,在我做的測試中,收據之間的5515字節和5522字節不同。 –

回答

1

的iOS 9.2.1,7.2.1的Xcode,ARC啓用

我明白你這個2年前問過,但我最近有我這個問題在運行,並找到了解決方案,並希望分享這樣別人可以節省一些時間。

1)您可以選擇將收據存儲到鑰匙串中並訪問它的副本,這樣您可以刪除它或按照您認爲合適的方式刷新它。

2)是的,你絕對可以檢查它是否改變了,我覺得這樣做最簡單的方法是使用:

[receipt isEqualToData:(NSData *)(copyReceiptObject)] 

我的建議如下:

的關鍵是期望error你從方法得到:

- (void)request:(SKRequest *)request didFailWithError:(NSError *)error;

當登錄對話出現登錄iTunes Store後,用戶點擊取消時會被調用。有很多習慣是你可以做的刷新請求,所以結果可能會有所不同,但這裏是不同的錯誤,你得到了我的請求:

當有到iTunes沒有聯繫

錯誤域名= SSErrorDomain代碼= 110 「無法連接到iTunes Store的」 的UserInfo = {NSLocalizedDescription =無法連接到iTunes商店, NSUnderlyingError = 0x13c76d680 {錯誤域= NSURLErrorDomain 代碼= -1009「無法連接到iTunes商店「 的UserInfo = {NSLocalizedDescription =無法連接到iTunes商店, NSErrorFailingURLStringKey =

{您的產品ID,並在此相應的URI}

,_kCFStreamErrorCodeKey = 8,_kCFStreamErrorDomainKey = 12, NSLocalizedDescription =出現網絡連接。爲脫機}}}

當用戶點擊取消:

錯誤域= SSErrorDomain碼= 16 「無法連接到iTunes Store的」 的UserInfo = {NSLocalizedDescription =無法連接到iTunes商店, NSUnderlyingError = 0x13c6ac7b0 {錯誤域= AKAuthenticationError 代碼= -7003「(空)「}}

我覺得是檢查error.code,如果你想變得更加複雜,你可以選擇解析完整的錯誤字符串,以獲取有關錯誤的更多詳細信息,最簡單的。

在我的情況,沒有連接錯誤代碼是110和當用戶取消在日誌中錯誤代碼是16。處理錯誤。

+0

我想知道更多關於這些錯誤的信息,並詢問了關於SSErrorDomain的後續問題http://stackoverflow.com/q/35851069/4018041。 –

+0

我不知道它是如何可靠地使用這樣的錯誤代碼,但截至2017年1月,當按下取消時仍然返回錯誤代碼16。 – Richard

+0

根本不可靠,但我不知道有任何其他檢測方法,這是檢測以提高用戶體驗的理想條件。感謝您驗證它仍然有效。 –