3

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

在我们的项目中,我们决定确定三种不同屏幕宽度(小、中和大)所需的 API。Microsoft 已在此处列出了这些 API 。但是这个列表相当长,检查它们中的每一个是否存在会很麻烦。

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

4

2 回答 2

3

您通常所做的只是在需要特定 API 的代码周围添加检查:

if(ApiInformation.IsEventPresent("Windows.Phone.UI.Input.HardwareButtons", "BackPressed"))
{
    HardwareButtons.BackPressed += OnHardwareButtonsBackPressed;
}

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

另一种方法是一次检查整个完整的合同。如果你知道你需要能够打电话,而不是检查每个事件或方法调用,只需检查合同。

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

“不知道”您的客户可能需要什么是“非问题”。这个问题的答案是YAGNI。不要检查合同,除非你正在执行它。

于 2015-12-17T19:48:37.670 回答
1

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

为了真正确保您只是针对电话合同,您应该使用以下代码:

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

这是windows phone的独家合同。

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

在此处输入图像描述

此外,我刚刚在 githubmicrosoft 文档中向 Microsoft 报告了这个问题

希望这个答案对每个人都有帮助,如果您正在构建桌面和移动应用程序,请使用此合同而不是“Windows.Phone.PhoneContract”。

于 2018-11-10T17:12:36.623 回答