2012-04-03 110 views
15

我的意思是,我的步驟應該如何?我應該何時驗證應用內購買交易收據?

1)獲取SKPaymentTransactionStatePurchased

2)[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

3)驗證從SKPaymentQueue刪除它,並提供所述內容的接收和然後,如果它是無效的,塊我剛剛提供的內容

或者我應該改變第二步而不是第三步?

1)獲取SKPaymentTransactionStatePurchased

2)確認收貨,然後,如果它是無效的,dont't提供內容

3)SKPaymentQueue刪除也無妨[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

在第一種情況下,用戶可以在購買後立即關閉互聯網,所以我將無法驗證收據。但是第二步,在步驟1和步驟2之間可能會出現一些互聯網問題,所以我不會完成交易並且不會提供內容,這將是一種糟糕的用戶體驗。

那麼你選擇什麼方式爲你的應用程序,爲什麼?

我的選擇

我選擇了第二個方案,因爲選擇第一個讓我的應用程序很容易被IAP餅乾破解。

+0

我對這個答案也很有興趣。我目前正在做你的第一個方法,因爲它是一個更好的用戶體驗,它仍然很難濫用(我一直試圖驗證收據在後臺) – 2012-04-22 16:40:06

+0

我也決定選擇一個爲我的應用程序 – 2012-04-22 16:53:39

+0

你確定是否從應用程序代碼中下載內容(有效收據)或不收據(無效收據)?如果是這樣,只需要將'if(valid)'改爲'if(1)'。看到我的答案。 – 2012-07-15 10:48:57

回答

9

情景2. 如果網絡爆炸了,你將無法進入-finishTransaction。 但這很酷,因爲您可以重試(NSTimer),並且您的應用程序將在啓動時獲得未完成的事務。 這就是正好 StoreKit是如何設計的(儘管從閱讀文檔來看它並不明顯)。

StoreKit附帶交易,這是有原因的。用戶可以在購買後立即退出應用程序,但仍然需要從中恢復。 這就是爲什麼Apple建議儘快在應用程序生命週期中設置事務觀察者的原因。

在提供內容之前不要完成交易,您必須在StoreKit之上實施自己的交易系統,並且您不希望這樣做,相信我(我已經看到它完成了, 那是一場災難)。

編輯:誠實地說,在購買之後和驗證之前關閉互聯網的用戶的最終結果是低得離譜。這傢伙第二次在互聯網上,沒有人會在購買過程中出去切斷互聯網。 但此時用戶可能會被中斷並將您的應用程序發送到後臺。 無論iOS認爲合適的原因,您的應用可能會被殺害。 當您的應用程序再次啓動時,您的應用程序不會記得先購買產品,並且由於您已完成交易,所以存儲工具包不會有很大的幫助。

+0

是的,我看到後,我轉向這種情況,我的應用程序可以很容易地被iAP cracker破解。而且,是的,當然我在didFinishLaunching中添加觀察者)謝謝你的回答! – 2012-07-15 07:25:22

1

我會先驗證。它需要2-3秒。您可以使用ReceiptKit https://github.com/maciekish/ReceiptKit來達到此目的。

+1

ReceiptKit如何幫助驗證您的收據,而無需在受控服務器環境中進行驗證?似乎很容易破解,不是嗎? – 2013-06-25 07:38:06

3

這是我做的:

  1. 應用程序發送與接收附加內容的請求。

  2. 服務器用iTunes驗證收據,如果有效,則將購買的內容作爲響應主體返回到原始請求。

這樣,即使應用程序二進制文件被黑/修改,內容也只下載一個有效的收據。