2014-03-07 1 views
0

Monogame에서 Windows Phone 8 용 IAP를 구현하는 데 문제가 있습니다. 내가 API 문서 다음 봤는데 : 실버 라이트 애플리케이션에 다른 Monogame/XNA 업데이트로 WP8 In-App Purchase API

을, 나는 UI 스레드에서 IAP를 실행하고 있습니다. 스토어의 베타 앱을 테스트했으며 Store Front UI를로드하고 내 제품을 표시 할 수 있습니다. 구매를 시도 할 때 구매 한 것처럼 보이지만 게임으로 돌아가려고하지만 충돌이 발생합니다. 더 많은 앱이로드되면 이후에도 스토어가 표시되지 않습니다.

나는 행운이 문제를 해결하기 위해 어디에서나 검색했습니다. 아무도 이걸 도와 줄 수 없다면 정말 고마워. 내가 InvokeOnUIThread (Part1Purchase)를 호출하는 데 사용할Monogame : Windows Phone 8 IAP (In App Purchases)

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 
    } 

; 여기

내 코드 샘플입니다

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); 
     } 
    } 

나는 또한 내가 당신의 상황을 정확히 무엇이 잘못되었는지 모르겠어요

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

답변

1

UI 스레드에서 실행하려면이 방법을 시도하지만 (구매 완료에 충돌) 같은 결과가 있었다. 그러나 우리는 이미 매장에 있으며 인앱이 훌륭하게 작동하는 MonoGame 프로젝트를 보유하고 있습니다. Store와의 상호 작용 도중 충돌이 발생했지만 결국 작동하게되었습니다.

... 
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.xaml.cs에서

은 우리가 가진 : 이것은 우리의 현재 접근 방식

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

좋아 좋아! 구매를 시작하는 메소드의 ReturnFromStoreCallback 값에 무엇을 전달합니까? – xDev

+0

은 System.Action 또는 단순히 string, string, bool 인수가있는 메서드로 정의 된 동작을 전달합니다. 이 메소드는 구매가 완료되고 첫 번째 문자열 인수에 productID가 있고 두 번째 문자열에 영수증이 있고 세 번째 bool에 true가 설정된 경우 구매 오류가 발생했을 때 호출됩니다. –