【问题标题】:Detect which APIs are present in a UWP app检测 UWP 应用中存在哪些 API
【发布时间】:2015-12-17 19:12:17
【问题描述】:

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

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

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

【问题讨论】:

  • 您只需要检查您的应用中真正需要的内容。如果您需要它们,我会感到惊讶。
  • 这是有道理的,你是对的,我们当然不会全部需要它们。我认为这是我的差距......不完全了解我们的客户对于应用程序的每种风格(屏幕宽度)需要什么功能。谢谢,巴特。

标签: c# windows-phone uwp detection windows-10-universal


【解决方案1】:

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

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

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

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

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

“不知道”您的客户可能需要什么是“非问题”。这个问题的答案是YAGNI。除非您即将实施,否则不要检查合同。

【讨论】:

    【解决方案2】:

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

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

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

    这是windows phone的独家合同。

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

    另外,我刚刚向 Microsoft Here at githubhere at microsoft documentation 报告了这个问题

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      • 2021-12-18
      • 1970-01-01
      • 2017-05-07
      • 2021-09-08
      • 2018-07-01
      相关资源
      最近更新 更多