在UWP应用程序中购买IAP后出现未处理的崩溃 - Windows 10

时间:2016-03-10 03:28:18

标签: in-app-purchase win-universal-app windows-10-universal

我正在将应用内购买IAP添加到我的UWP应用中,但在测试过程时,它会导致应用崩溃,但只有在购买已通过调用时显示的测试对话框:

await CurrentAppSimulator.RequestProductPurchaseAsync(
      IAPs.CoreFeatures, false);

以下是我的ViewModel中包含的完整功能:

private async void UnlockFeaturesNow()
{
    LicenseInformation licenseInformation = App.LicenseInformation;

    if (!licenseInformation.ProductLicense[IAPs.CoreFeatures].IsActive)
    {
        try
        {
            // The customer doesn't own this feature, so show the purchase dialog.
            await CurrentAppSimulator.RequestProductPurchaseAsyn(
                  IAPs.CoreFeatures, false);

            //Check the license state to determine if the in-app purchase was successful.
            if (!licenseInformation.ProductLicenses[IAPs.CoreFeatures].IsActive)
            {
              await this._messageBoxService.Show("features were not purchased.", 
                    "Features");
            }
            else
            {
                await this._messageBoxService.Show("features were purchased 
                successfully.", "Features");

                //Remove the purchase button from splitview popup menu.
                SectionModel unlockFeatureSection = this.Sections.FirstOrDefault
                (m => m.PageName == PageNameEnum.UnlockFeaturesPage);

                if (unlockFeatureSection != null)
                {
                    this.Sections.Remove(unlockFeatureSection);
                    unlockFeatureSection = null;
                }
            }
        }
        catch (Exception ex)
        {
            // The in-app purchase was not completed because an error occurred.
            await this._messageBoxService.Show("Failed to purchase the features for 
                  the following reason: " + ex.Message, "Features");
        }
    }
    else
    {
        // The customer already owns this feature.
    }
}

如果我取消了“IAP测试对话框”,我的应用永远不会崩溃。或者如果我选择除OK之外的任何其他选项。

如果我选择确定,它会告诉我我的IAP已成功购买,并且取决于我在我的应用中的位置,它按预期工作但第二次点击我的汉堡菜单,它会显示我的{{1} }菜单如果我点击我的应用程序上的任何其他地方它只是崩溃并显示以下错误:

SplitView

我查看了我的事件查看器以获取更多信息,这是我发现的:

"A debugger is attached to myApp.exe but not configured to debug 
this unhandled exception. To debug this exception, detach the current
debugger."

所以看起来Combase.dll崩溃了,但是我不知道这个.dll是什么用的,为什么在选择' OK'之后它才会崩溃。而不是其他选择。

我刚刚尝试了使用Faulting application name: MyApp.exe, version: 1.0.0.0, time stamp: 0x563304b4 Faulting module name: combase.dll, version: 10.0.10586.103, time stamp: 0x56a84cbb Exception code: 0xc000027b Fault offset: 0x00166d7e Faulting process ID: 0x2138 Faulting application start time: 0x01d17a76e526db18 Faulting application path: C:\MyFolder\MyApp\bin\x86\Debug\AppX\MyApp.exe Faulting module path: C:\WINDOWS\SYSTEM32\combase.dll Report ID: bb041374-507f-4927-84b8-75bf7cb6df63 Faulting package full name: MyApp1.1.25.0_x86__z2199h13vtehs Faulting package-relative application ID: App 的{​​{1}}提供的UWP Store示例,并提供了相同的IAP(方案2)选项我使用和何时使用我在购买' IAP测试'上选择了Microsoft。对话框,一切都按预期工作,所以它会让你认为它与我的代码有关,但我很确定它不是因为应用程序在使用时永远不会崩溃,并且当它不会崩溃时除非我选择“确定”,否则将显示IAP测试对话框。选项。

我将继续调查明天,因为我的应用和Microsoft示例之间的一个重大区别是我使用SplitView并且此代码位于我的OK而不是{{1}来自XAML Page。

如果您遇到此问题,并且管理层解决了问题,您能告诉我吗?

感谢。

2 个答案:

答案 0 :(得分:1)

我刚刚通过侥幸找到了我的问题的答案,我仍然无法相信.NET的处理能力有多差。

成功购买Listbox后,罪魁祸首是从SplitView菜单中的IAP删除“购买”选项。与CurrentAppCurrentAppSimulator

无关
//Remove the purchase button from splitview popup menu.
SectionModel unlockFeatureSection = this.Sections.FirstOrDefault
(m => m.PageName == PageNameEnum.UnlockFeaturesPage);

if (unlockFeatureSection != null)
{
    this.Sections.Remove(unlockFeatureSection);
    unlockFeatureSection = null;
}

没有刷新绑定到Listbox菜单中SplitView的项目的列表(此实例中的部分)。所以现在,当删除项目时,我确保通过mvvmlight引发一个事件,这将在我的MainViewModel中重建我的列表。

在我的MainViewModel中,我在构造函数中有以下内容:

Messenger.Default.Register<bool>(this, 
Tokens.LicenseInformationChanged, (value) =>
{
    InitializeSections();
});

我现在已将我的章节从List更改为ObservableCollection

private void InitializeSections()
{
    this.Sections = (this.Sections 
       ?? new ObservableCollection<SectionModel>());

    this.Sections.Clear(); 

    .... Add sections (or not!)
}

但同样,.NET处理这个问题的可怕方式!轰炸我的应用程序抛出错误而没有抛出适当的异常只是可怕!

希望这有助于其他人。

答案 1 :(得分:0)

我认为它崩溃是因为您应该将此代码用于 licenseInformation

print id.text
print id.get_attribute("id")