2014-03-07 67 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将意味着存在购买错误。 –