【问题标题】:Windows Phone 8.1 and CurrentAppSimulatorWindows Phone 8.1 和 CurrentAppSimulator
【发布时间】:2014-09-07 00:06:16
【问题描述】:

我正在尝试将应用购买添加到我的通用应用中,但在 Windows Phone 版本中测试它时遇到了问题。该指南说,为了使用CurrentAppSimulator,我必须“在%userprofile%\AppData\local\packages\<package name>\LocalState\Microsoft\Windows Store\ApiData 中自定义名为"WindowsStoreProxy.xml" 的文件”。

但我无法在手机上执行此操作,因为我无法访问手机的文件系统。如何启用CurrentAppSimulator

【问题讨论】:

    标签: c# windows-phone windows-store-apps winrt-xaml windows-phone-8.1


    【解决方案1】:
    • 适用于 Windows Phone 8.1、Dev Studio 2013

    您可以使用位于此处的“ISETool”访问隔离存储文件:“Program Files (x86)\Microsoft SDKs\Windows Phone\v8.0\Tools\IsolatedStorageExplorerTool”。 How to use the Isolated Storage Explorer tool for Windows Phone 8。 将它们复制到计算机上的文件夹后,您将拥有一个子文件夹“IsolatedStore”。在“\Microsoft\Windows Store\ApiData”中,您将找到“WindowsStoreProxy.xml”:

    <?xml version="1.0" encoding="utf-16" ?>
    <CurrentApp>
        <ListingInformation>
            <App>
            <AppId>00000000-0000-0000-0000-000000000000</AppId>
            <LinkUri>http://apps.microsoft.com/webpdp/app/00000000-0000-0000-0000-000000000000</LinkUri>
            <CurrentMarket>en-US</CurrentMarket>
            <AgeRating>3</AgeRating>
            <MarketData xml:lang="en-us">
                <Name>AppName</Name>
                <Description>AppDescription</Description>
                <Price>1.00</Price>
                <CurrencySymbol>$</CurrencySymbol>
                <CurrencyCode>USD</CurrencyCode>
            </MarketData>
        </App>
        <Product ProductId="1" LicenseDuration="0" ProductType="Durable">
            <MarketData xml:lang="en-us">
                <Name>Product1Name</Name>
                <Price>1.00</Price>
                <CurrencySymbol>$</CurrencySymbol>
                <CurrencyCode>USD</CurrencyCode>
            </MarketData>
        </Product>
        <Product ProductId="2" LicenseDuration="0" ProductType="Consumable">
            <MarketData xml:lang="en-us">
                <Name>Product2Name</Name>
                <Price>1.00</Price>
                <CurrencySymbol>$</CurrencySymbol>
                <CurrencyCode>USD</CurrencyCode>
            </MarketData>
        </Product>
    </ListingInformation>
    <LicenseInformation>
        <App>
            <IsActive>true</IsActive>
            <IsTrial>true</IsTrial>
        </App>
        <Product ProductId="1">
            <IsActive>true</IsActive>
        </Product>
    </LicenseInformation>
    <ConsumableInformation>
        <Product ProductId="2" TransactionId="00000000-0000-0000-0000-000000000000" Status="Active" />
    </ConsumableInformation>
    

    将此文件复制到您的资产文件夹并将其包含在您的项目中。更改文件,您需要将 ProductId 从“1”更改为“您的产品 ID”。如果您不需要应用产品中的消耗品,您可以删除产品 id="2" 的产品。将第二个许可证信息更改为:

    <LicenseInformation>
        <App>
            <IsActive>true</IsActive>
            <IsTrial>false</IsTrial>
        </App>
        <Product ProductId="Your Product ID">
            <IsActive>false</IsActive>
        </Product>
    </LicenseInformation>
    

    让你的应用的构造函数看起来像这样:

    private static LicenseInformation licenseInformation=null;
    public App()
        {
            this.InitializeComponent();
            this.Suspending += this.OnSuspending;
    
    #if DEBUG
            licenseInformation = CurrentAppSimulator.LicenseInformation;
    #else
            licenseInformation = CurrentApp.LicenseInformation; 
    #endif
            licenseInformation.LicenseChanged += licenseInformation_LicenseChanged;            
        }
    

    添加事件处理程序:

    private static void licenseInformation_LicenseChanged()
    {
        if (licenseInformation.ProductLicenses["Your Product ID"].IsActive)
        {
            // add code for purchased (e.g. property of a data class derived from INotifyPropertyChanged)
        }
        else
        {
            // add code for not yet purchased (e.g. property of a data class derived from INotifyPropertyChanged)
        }
    }
    

    将这样的内容添加到您的 App 类中:

    public static async void RequestFeatureXYZ()
        {
            if (!licenseInformation.ProductLicenses["Your Product ID"].IsActive)
            {
                try
                {
    #if DEBUG
                    StorageFolder installFolder = await Package.Current.InstalledLocation.GetFolderAsync("Assets");
                    StorageFile appSimulatorStorageFile = await installFolder.GetFileAsync("WindowsStoreProxy.xml");                                      
    
                    await CurrentAppSimulator.ReloadSimulatorAsync(appSimulatorStorageFile);
                    PurchaseResults result = await CurrentAppSimulator.RequestProductPurchaseAsync("Your Product ID");
    #else
                    PurchaseResults result = await CurrentApp.RequestProductPurchaseAsync("Your Product ID");
    #endif
                    // licenseInformation_LicenseChanged(); // (un)comment if you find out that the event does (not) always fire                }
                catch (Exception ex)
                {
                    // handle error or do nothing
                }
            }            
        }
    

    还有参考文献..

    using Windows.Storage;
    using Windows.Storage.Streams;
    using Windows.ApplicationModel.Store;
    using System.ComponentModel;
    

    【讨论】:

    • 感谢您提供详细信息!我让它显示对话框并引发事件。不过,我不确定如何处理它。当我连续两次请求该功能时,我有一种购买没有传播的感觉。我应该如何告诉 LicenseInformation 对象应用程序不再处于试用模式?谢谢!
    【解决方案2】:

    他们为此提供了一个 API。您需要使用Windows.ApplicationModel.Store.CurrentAppSimulator.ReloadSimulatorAsync(IStorageFile file) 并将其指向包含的“WindowsStoreProxy.xml”文件。该文件的结构与您在 Windows 8.1 应用程序中使用的结构相同。

    【讨论】:

      【解决方案3】:

      在上一个答案中更详细:

      1.在您的解决方案中使用文件 WindowsStoreProxy.xml(或其他名称)创建文件夹“Data”。

      2.在属性文件中设置“要复制的输出目录”-“复制一个较新的版本”。

      1. 使用这个方法:

         public static async Task ConfigureSimulatorAsync()
        {
            var proxyFile = await Package.Current.InstalledLocation.GetFileAsync(@"data\WindowsStoreProxy.xml");
            await CurrentAppSimulator.ReloadSimulatorAsync(proxyFile);
        }
        
        protected override async void OnNavigatedTo(NavigationEventArgs e)
        {
            await MainPage.ConfigureSimulatorAsync();
        }
        

      【讨论】:

        猜你喜欢
        • 2014-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多