独立版与非独立版 Wear OS 应用

我们建议 Wear OS 应用独立于手机运行,以便用户在没有 Android 或 iOS 手机的情况下也能在手表上完成任务。如果您的手表应用需要手机互动,您必须将您的 Wear OS 应用标记为非独立版,并采取措施确保用户安装了手机应用。

规划您的应用

您可以使用 Android App Bundle 自动为每位用户的设备配置生成优化的 Android Package Kits (APK),并在同一个应用列表中发布。这让用户只需下载运行应用所需的代码和资源。

有关通过 Google Play 商店分发应用的信息,请参阅打包和分发 Wear OS 应用以及Android App Bundles入门指南。

对于新应用,目标 API 级别必须是 30 或更高。如需了解详情,请参阅满足 Google Play 的目标 API 级别要求。将 targetSdkVersion 设置为 API 级别 30 (Wear OS 3),以帮助确保您的应用在最新平台版本上运行良好。

有关网络请求和高带宽网络访问的信息,请参阅Wear OS 上的网络访问和同步

将应用定义为 Wear OS 应用

您必须在应用的 Android 清单文件中定义 <uses-feature> 标记。要指示其为手表应用,请添加如下条目:

  <manifest>
  ...
  <uses-feature android:name="android.hardware.type.watch" />
  ...
  </manifest>
  

将应用识别为独立版或非独立版

手表应用被认为是独立版或非独立版

  • 独立版:一个完全独立的应用,其核心功能不需要手机应用。虽然“在手机上打开”提示是可以接受的,但应用必须提供替代方式(例如短链接或二维码)让用户完成应用功能,而无需依赖已连接的手机。
  • 非独立版:一个依赖型应用,其核心功能需要手机或其他设备上的应用。当应用无法轻松提供替代方式(例如二维码或短链接)来完成核心应用功能(例如身份验证)时,此选项最适用。

注意:即使是非独立应用,用户也可以在安装移动应用之前安装 Wear OS 应用。因此,如果您的 Wear OS 应用检测到附近的手持设备缺少必要的配套应用,请提示用户安装配套应用。

Google 在应用服务期间会验证应用独立状态的准确性。此值会影响应用在未连接设备(例如未与手持设备配对的 Wear OS 设备)上的 Play 商店中的可见性。非独立应用以及开发者错误地指定为“独立版”的应用,在这些未连接设备上无法供用户使用。

在您的 Wear OS 应用中,在 Android 清单文件中设置 meta-data 元素 com.google.android.wearable.standalone 的值,以声明您的应用是独立版还是非独立版。

如果您的手表应用是完全独立的独立应用,请通过将 com.google.android.wearable.standalone 的值设置为 true 来向 Google Play 商店指示。

<application>
...
  <meta-data
    android:name="com.google.android.wearable.standalone"
    android:value="true" />
...
</application>

如果您的手表应用是非独立版,并且核心功能依赖于另一个应用,请将 com.google.android.wearable.standalone 的值设置为 false。这表示手表应用需要其他设备,但这不会影响您应用在 Google Play 商店中的推广。

注意:即使 com.google.android.wearable.standalone 的值为 false,手表应用也可以在安装手机应用之前安装。因此,如果您的手表应用检测到配套手机缺少必要的手机应用(如本页所述),请提示用户安装手机应用。

共享代码和数据存储

Wear OS 应用和手机应用之间可以共享代码。例如,网络通用代码可以放在共享库中。

或者,特定于某种外形规格的代码可以放在单独的模块中。

您可以使用标准的 Android 存储 API 在本地存储数据,就像在手机上一样。例如,您可以使用 SharedPreferences APIRoom 持久性库。

在另一设备上检测您的应用

您的手表应用和相应的手机应用都可以检测到对方是否可用。

您的手机和手表应用可以使用 CapabilityClient 向配对设备广播它们的存在。它们可以静态或动态地执行此操作。

当应用位于用户 Wear OS 网络中的某个节点上时(例如在手机、配对手表或云端),CapabilityClient 允许其他应用检测它。如需了解详情,请参阅广播功能

如果您的某个应用无法检测到另一个应用,您可以提示用户在受影响的设备上打开 Play 商店列表。这是一种适用于需要配套手机应用才能正常运行的手表应用的解决方案。

您必须检查设备上是否提供 Play 商店,因为并非所有手机(例如 iPhone)都支持 Play 商店。

以下部分介绍了两种情境的最佳实践:

  • 您的独立手表应用需要您的手机应用。
  • 您的手机应用需要您的独立手表应用。

您还可以查看 Datalayer helpers 示例,其中展示了如何使用 Datalayer helpers 库(属于 Horologist)。这些辅助程序可让您监控手持设备与 Wear OS 设备之间的连接。有关下一节中描述的类的更多信息,请参阅 Wear OS API 参考文档。该参考文档还包含有关 PhoneTypeHelper 类的信息,该类包含一个 getPhoneDeviceType() 方法,可让您的 Wear OS 应用检查配套手机是 Android 设备还是 iOS 设备。

指定用于检测应用的 capabilities 名称

对于每种设备类型(手表或手机)对应的应用,请在 res/values/wear.xml 文件中为 capability name 指定一个唯一的字符串。

例如,在您的移动模块中,wear.xml 文件可以包含以下内容:

<resources xmlns:tools="http://schemas.android.com/tools"
        tools:keep="@array/android_wear_capabilities">
    <string-array name="android_wear_capabilities">
        <item>verify_remote_example_phone_app</item>
    </string-array>
</resources>

在您的 Wear OS 模块中,wear.xml 文件包含 capability name 的不同值,例如以下内容:

<resources xmlns:tools="http://schemas.android.com/tools"
        tools:keep="@array/android_wear_capabilities">
    <string-array name="android_wear_capabilities">
        <item>verify_remote_example_wear_app</item>
    </string-array>
</resources>

如需了解详情,请参阅广播功能

应用检测和从手表打开网址

您的手表应用可以检测用户的配套手机是否安装了您的手机应用。请按照以下步骤操作:

  1. 使用 CapabilityClient 检查您的手机应用是否已安装在配对的手机上。如需了解详情,请参阅 GitHub 上的 Datalayer helpers 示例
  2. 如果您的手机应用未安装在手机上,请使用 PhoneDeviceType.getPhoneDeviceType() 方法检查手机类型。有关详细信息,请参阅下一节。
  3. 如果返回 PhoneDeviceType.DEVICE_TYPE_ANDROID,则该手机是 Android 手机。在 Wear OS 设备上调用 RemoteActivityHelper.startRemoteActivity() 以在手机上打开 Play 商店。使用您手机应用的商店 URI,这可能与您的 Wear 应用的 URI 不同。例如,使用如下商店 URI:market://details?id=com.example.android.wearable.wear.finddevices
  4. 如果返回 PhoneTypeHelper.DEVICE_TYPE_IOS,则该手机是 iOS 手机,没有可用的 Play 商店。在 Wear OS 设备上调用 RemoteActivityHelper.startRemoteActivity() 以在 iPhone 上打开 App Store。您可以指定应用的 iTunes 网址,例如 https://itunes.apple.com/us/app/yourappname

    在 Wear OS 中,您无法以编程方式确定您的手机应用是否已安装在 iOS 设备上。作为最佳实践,请为用户提供一种机制来手动触发 App Store 的打开。

注意:使用前面描述的 RemoteActivityHelper API,指定从手表在手机上打开任何网址,并且不需要手机应用。

检测配对手机类型的详细信息

以下代码段使用 getPhoneDeviceType() 方法检查手表配对的手机类型:

Kotlin

var phoneDeviceType: Int = PhoneDeviceType.getPhoneDeviceType(context)

Java

int phoneDeviceType = PhoneDeviceType.getPhoneDeviceType(context);

getPhoneDeviceType() 方法返回的值是以下之一:

返回值 说明
DEVICE_TYPE_ANDROID 配套手机是 Android 设备。
DEVICE_TYPE_IOS 配套手机是 iOS 设备。
DEVICE_TYPE_UNKNOWN 配套手机是未知设备。
DEVICE_TYPE_ERROR 确定配对手机类型时发生错误;稍后应进行另一次检查。

从 Android 手机开始的应用检测

您的 Android 手机可以检测用户的 Wear OS 设备是否安装了您的手表应用。请按照以下步骤操作:

  1. 使用 NodeClient,查找连接到用户手机的所有手表。如需了解详情,请参阅 GitHub 上的 Datalayer helpers 示例
  2. 使用 CapabilityClient,检查用户的哪些手表安装了您的应用。
  3. 如果您的应用未安装在用户的所有手表上,请让用户从手机上使用 RemoteActivityHelper.startRemoteActivity() 方法在剩余的 Wear OS 设备上打开 Play 商店。使用 Wear OS 应用的商店 URI,这可能与您手机应用的 URI 不同。例如,使用如下商店 URI:market://details?id=com.example.android.wearable.wear.finddevices

与 iPhone 配对的手表的位置数据

对于与 iPhone 配对的手表,请使用 融合定位提供商 (FLP) 在手表上获取位置数据。如需了解详情,请参阅在 Wear OS 上检测位置

如果配套手机可用,FLP 会使用配套手机提供位置数据。

仅获取必要数据

通常,从互联网获取数据时,只获取必要的数据。否则,您可能会引入不必要的延迟、内存使用和电池使用。

当手表通过低功耗蓝牙连接时,您的应用可能只能访问每秒 4 千字节的带宽,具体取决于手表。因此,建议执行以下步骤:

  • 审核您的网络请求和响应,查找仅手机应用需要的额外数据。
  • 在通过网络将大图像发送到手表之前,将其缩小。

对于需要高带宽网络的情况,请参阅高带宽网络访问

其他代码示例

Datalayer helpers 示例进一步演示了本页介绍的 API 的使用。