2014-03-07 102 views
0

我一直在爲Monogame上的Windows Phone 8實施IAP時遇到了麻煩。我一直在關注API文檔:WP8 In-App Purchase API

由於Monogame/XNA更新與Silverlight應用程序不同,因此我在UI線程上運行IAP。我已經在商店中測試了一個測試版應用程序,並且可以加載Store Front UI並顯示我的產品。當我試圖購買時,似乎它會使購買,嘗試返回到遊戲,但崩潰。在此之後,進一步的應用程序加載不會顯示商店。

我到處尋找解決方案,這沒有運氣。如果有人能幫助我,我會很感激。Monogame:Windows Phone 8 IAP(應用內購買)

這裏是我的代碼示例:

public static void InvokeOnUIThread(Action action) 
    { 
     #if WINDOWS8 || OPENGL 
     action(); 
     #else 
     var dispatcher = System.Windows.Deployment.Current.Dispatcher; 

     if (dispatcher.CheckAccess() /*IsUIThread*/) 
      action(); 
      else 
      dispatcher.BeginInvoke(action); 
     #endif 
    } 

我用它來調用InvokeOnUIThread(Part1Purchase);

async void Part1Purchase() 
    { 
     ListingInformation li = await CurrentApp.LoadListingInformationAsync(); 
     string pID = li.ProductListings["img.1"].ProductId; 
     try 
     { 
      string receipt = await Windows.ApplicationModel.Store.CurrentApp.RequestProductPurchaseAsync(pID, false); 

      Part2Fulfillment(); 
     } 
     catch (Exception ex) 
     {} 
    } 

    public void Part2Fulfillment() 
    { 
     var productLicenses = Windows.ApplicationModel.Store.CurrentApp.LicenseInformation.ProductLicenses; 
     Part3DeliverGold(productLicenses["img.1"], 50); 
    } 

    void Part3DeliverGold(ProductLicense license, int goldCount) 
    { 
     if (license.IsConsumable && license.IsActive) 
     { 
      gold += goldCount; 
      CurrentApp.ReportProductFulfillment(license.ProductId); 
     } 
    } 

我也嘗試這種方法在UI線程上執行,但有相同的結果(崩潰的購買完成)

private void RestoreTitleDelayed(int delay) 
    { 
     ThreadPool.QueueUserWorkItem((object o) => 
      { 
       Thread.Sleep(delay); 
       System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() => 
       { 
        Part1Purchase(); 
       }); 
      }); 
    } 

回答

1

我不知道究竟是什麼不對您的情況。但是,我們有一個已經在商店中的MonoGame項目,並且應用內工作很好。我們在與Store進行互動時發生崩潰,但最終得到了正常工作。這是我們目前的做法:

在GamePage.xaml.cs我們:

... 
using StoreExitAction = System.Action<string, string, bool>; 
... 
private static StoreExitAction StoreExitCallback; 
.... 

    public void LaunchStoreForProductPurchase(string productID, bool requestReceipt, StoreExitAction storeExitCallback) 
    { 

     StoreExitCallback = storeExitCallback; 
     Dispatcher.BeginInvoke(() => LaunchStoreForProductPurchaseASync(productID, requestReceipt)); 
    } 

    private static async void LaunchStoreForProductPurchaseASync(string productID, bool requestReceipt) 
    { 
     bool productPurchaseError = false; 
     string receipt = ""; 

     try { 
      receipt = await Store.CurrentApp.RequestProductPurchaseAsync(productID, requestReceipt); 
     } 
     catch (Exception ex) 
     { 
      productPurchaseError = true; 
     } 

     try 
     { 
      if (StoreExitCallback != null) StoreExitCallback(productID, receipt, productPurchaseError); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.ToString()); 
     } 
    } 

要啓動應用程序內購買你這樣做:

GamePage.Instance.LaunchStoreForProductPurchase(productID, true, ReturnFromStoreCallback); 
+0

好極了!您在傳遞方法中的ReturnFromStoreCallback值時會傳遞什麼內容以開始購買? – xDev

+0

你傳遞一個定義爲System.Action的動作或者只是一個具有string,string,bool參數的方法。購買完成後,此方法將被調用,並且第一個字符串參數將具有productID,第二個字符串將具有收據,第三個bool如果設置爲true將意味着存在購買錯誤。 –