检测 UWP 应用中存在哪些 API

Detect which APIs are present in a UWP app

了解为什么不建议检测设备类型以执行 运行 时间功能,最佳实践指示检测存在哪些 API。这样,例如,用户 运行 在桌面模式下使用平板电脑就不会遇到意外行为。此外,由于硬件是如此动态,检查触摸功能等用户交互也不是一个好方法。

在我们的项目中,我们决定确定我们需要的 API 三种不同的屏幕宽度 - 小、中和大。 Microsoft 列出了这些 APIs here。但是这个列表相当长,检查每个列表的存在会很麻烦。

对于 Microsoft 提供的 API 列表中的每个合同,如有任何关于如何执行这些检查而无需重复调用 ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons") 的建议,我们将不胜感激。

您通常做的只是在需要特定 API:

的代码周围添加检查
if(ApiInformation.IsEventPresent("Windows.Phone.UI.Input.HardwareButtons", "BackPressed"))
{
    HardwareButtons.BackPressed += OnHardwareButtonsBackPressed;
}

如果您知道您有多个代码块需要相同的 API,您可以缓存该值。

另一种方法是一次检查整个合同。如果您知道您需要能够执行 phone 调用,而不是检查每个事件或方法调用,只需检查合同即可。

ApiInformation.IsApiContractPresent("Windows.ApplicationModel.Calls.CallsPhoneContract");

"Not knowing" 您的客户可能需要 'non-issue'。该问题的答案是 YAGNI。不要检查合同,除非你正处于执行合同的时刻。

实际上我正在为移动和桌面设备的 UWP 开发应用程序和合同 "Windows.ApplicationModel.Calls.CallsPhoneContract" 如果您的桌面上安装了 Skype,那将是一份可以找到的 Api 合同。

要真正确保您的目标只是 phone 合同,您应该使用此代码:

ApiInformation.IsApiContractPresent("Windows.Phone.PhoneContract",1,0)

windowsphone.

的独家合约

我还添加了一个从我的调试会话中截取的屏幕截图证明,证明 "Windows.ApplicationModel.Calls.CallsPhoneContract" 可以在桌面上找到,即使在文档中没有考虑。

另外我刚刚向 Microsoft 报告了这个问题 Here at github and here at microsoft documentation

希望这个答案对大家有所帮助,如果您正在构建桌面和移动应用程序,请改用此合同"Windows.Phone.PhoneContract"。