2012-06-27 159 views
3

我對使用應用程序內購買的特定情況有疑問。iOS應用程序內購買(耗材) - 服務器超時

我們必須在我們的應用程序購買金幣消耗:

  • 使用購買了$ .99硬幣包與IAP
  • 我們發送請求到我們的服務器,記錄購買和硬幣增加他們的帳戶(這些硬幣是在多個設備之間共享,我們的服務器在這裏所​​做的工作)
  • 的IAP完整的交易

問題是,我們應該做的,如果請求到我們的服務器超時或失敗?用戶花了錢,但永遠不會拿到硬幣。如果他們在那個時候再次嘗試購買,它會給他們一個錯誤,說購買沒有下載。

我看到一個「恢復事務」選項,但不知道如何在這裏應用它。我寧願沒有在應用程序某處的按鈕。

不要擔心,這個程序尚未發佈,而這個應用程序是用C#與MonoTouch的,但Objective-C的答案是受歡迎的。

+0

也許生成一個交易ID?如果應用程序最近檢測到事務已被嘗試,並且您的服務器沒有事務ID的記錄,請將購買添加到服務器。從技術上講,這將是「可破解的」,所以我建議使用可以驗證的種子隨機數生成器是由您創建的,而不是用戶創建的。 – Dustin

+0

有沒有「蘋果建議」的方式去解決它?我想我可以保存購買信息並在應用程序打開時恢復。 – jonathanpeppers

+0

我覺得我最近讀了一些東西,讓我看看我能否找到它。 – Dustin

回答

1

恢復事務將做到這一點。它只是重新下載購買。看看第五張貼在這裏:

http://monogame.codeplex.com/discussions/359109

下面是代碼來實現它:

InAppPurchaseManager> MySKPaymentObserver:

public override void PaymentQueueRestoreCompletedTransactionsFinished (SKPaymentQueue queue) 
     { 
      foreach(SKPaymentTransaction transaction in queue.Transactions) 
      { 

       #if DEBUG 
       Console.WriteLine("Restoring Transaction " + transaction.Payment.ProductIdentifier); 
       #endif 
       theManager.restoreTransaction(transaction); 
      } 
     } 

下面是如何調用的代碼在你的遊戲:

app = new InAppPurchaseManager(); 
app.LoadStore(); 
SKPaymentQueue.DefaultQueue.RestoreCompletedTransactions(); 
+1

這對消費品購買是否正常工作?我認爲這不會,它聽起來像可以通過按恢復按鈕獲得免費硬幣。 – jonathanpeppers

1

我有辦法ne是通過在NSUserDefaults中保存失敗的事務。所以,每次應用程序都來自後臺時,它會檢查用戶默認的任何失敗的事務,然後再次重試。

我不確定它是否正確。但是,我想知道是否有更好的方法來做到這一點。