翻译自HealthKit
Framwork
与其他应用共享用户的健康和健身数据,同时保持用户的隐私和对数据的控制。
概观
HealthKit存储来自iPhone和Apple Watch上的应用程序的数据。它也直接与一些健康和健身设备。在iOS 8.0中,系统可以自动保存兼容的蓝牙LE心率监视器的数据。如果有的话,系统也可以自动从M7运动协处理器导入活动数据。其他设备和数据源必须具有可以访问数据并将其保存到HealthKit的配套应用程序。
HealthKit将数据保存在称为HealthKit存储的加密数据库中。你可以使用这个类来访问这个数据库。iPhone和Apple Watch都有自己的HealthKit商店。Apple Watch和iPhone之间的健康数据同步; 但是,Apple Watch会定期清除旧数据以节省空间。使用此方法确定Apple Watch上最早的数据。earliestPermittedSampleDate()
HealthKit旨在管理来自各种来源的数据,根据用户的偏好自动合并来自不同来源的数据。应用程序也可以访问每个来源的原始数据,自己合并数据。
HealthKit提供了一个应用程序来帮助管理用户的健康数据。Health应用程序充当HealthKit数据的用户界面。用户可以查看,添加,删除,并以其他方式管理他们的健康和健身数据使用这个应用程序。他们还可以编辑每种数据类型的共享权限。
HealthKit和Health应用程序在iPad上不可用。
保护用户隐私
由于健康数据可能非常敏感,因此HealthKit通过对应用程序可以共享的信息进行细粒度控制来授予用户对其数据的控制权。用户必须明确授予每个应用程序读写数据到HealthKit商店的权限。用户可以为每种类型的数据分别授予或拒绝权限。例如,用户可以让您的应用程序读取步数数据,但不能读取血糖水平。为了防止可能的信息泄露,应用程序不知道它是否被拒绝读取数据的权限。从应用程序的角度来看,如果应用程序被拒绝读取数据的权限,则不存在该类型的数据。
在iOS 10.0或之后链接的iOS应用程序必须在其Info.plist文件中包含它需要访问的数据类型的使用说明键,否则将会崩溃。要特别访问和更新HealthKit数据,它必须分别包含NSHealthShareUsageDescription和NSHealthUpdateUsageDescription键。
HealthKit数据只保存在用户的设备上。为了安全起见,HealthKit存储在设备被锁定时被加密。HealthKit商店只能由授权的应用程序访问。因此,当您的应用程序在后台启动时,您可能无法从商店读取数据; 不过,应用程序仍然可以将数据写入商店,即使手机已锁定。一旦手机解锁,HealthKit会暂时缓存数据并将其保存到加密存储中。
另外,除非应用程序主要用于提供健康或健身服务,否则您的应用程序不得访问HealthKit API。您的应用程序作为健康和健身服务的角色必须在您的营销文本和用户界面中都清楚。具体而言,以下准则适用于所有HealthKit应用程序:
- 您的应用程序不得将通过使用HealthKit框架获得的信息用于广告或类似服务。请注意,您仍然可以在使用HealthKit框架的应用中投放广告,但不能使用HealthKit商店中的数据投放广告。
- 未经用户明确许可,不得将通过HealthKit获得的任何信息透露给第三方。即使获得许可,只有在向用户提供健康或健身服务的情况下,才能将信息分享给第三方。
- 您不能将通过HealthKit获取的信息出售给广告平台,数据经纪人或信息转销商。
- 如果用户同意,您可以与第三方共享他或她的HealthKit数据以进行医学研究。
- 您必须向用户清楚地透露您和您的应用程序将如何使用他们的HealthKit数据。
您还必须为使用HealthKit框架的任何应用程序提供隐私政策。您可以在以下网站找到有关创建隐私政策的指导: - 个人健康记录模型(针对非HIPAA应用程序):http : //www.healthit.gov/policy-researchers-implementers/personal-health-record-phr-model-privacy-notice
- HIPAA模式(适用于HIPAA涵盖的应用程序):http : //www.hhs.gov/ocr/privacy/hipaa/modelnotices.html
由国家卫生信息技术协调员(ONC)开发的这些模型旨在通过使用简单的语言和平易近人的设计来解释如何收集和共享用户数据,从而改善用户体验和理解。这些模型并不是要取代基于网络的隐私政策,开发者应该咨询ONC指导哪些模型适合给定的应用程序。这些型号仅供您参考,Apple明确表示不承担使用此类型号的全部责任。
注意
了解苹果公司使用HealthKit和用户健康相关数据的要求至关重要。要了解这些要求,请参阅Apple Store Review Review指南中的HealthKit部分,该指南可从Apple的App Review支持页面获得。
有关处理敏感用户数据的其他技术信息,请参阅
iOS应用程序编程指南当您的应用程序进入后台时该怎么做。
使用HealthKit框架
HealthKit框架旨在以有意义的方式在应用程序之间共享数据。该框架将数据和单元的类型限制为预定义列表,确保所有应用程序都了解数据的含义以及如何使用它们。开发人员不能创建自定义数据类型或单位。相反,HealthKit提供了各种各样的数据类型和单位。
此外,框架使用大量的子类,产生类似类的深层次结构。这些类通常在它们之间有细微而重要的差别。例如,一个HKQuantity
对象用于存储具有数值的数据,而一个HKCategory对象用于存储从枚举中选择的值。
HealthKit也使用密切相关的类对。这些类必须正确配对。例如,HKObject和HKObject抽象类具有很大的并行的具体子类的层次结构。处理对象和对象类型时,必须使用匹配的子类。
HealthKit数据
HealthKit在HealthKit存储中心保存各种数据类型:
- 特征数据。这些记录表示通常不会更改的项目。这些数据包括用户的生日,血型,生物性别和皮肤类型。您可以直接从HealthKit存储读取这些数据,使用dataOfbirth(),bloodType(),biologicalSex(),fitzpatrickType()和方法。您的应用程序无法保存特征数据。用户必须使用健康应用程序输入或修改这些数据。
- 样本数据。用户的大部分健康数据都存储在样本中。这些样本代表特定时间点的数据。所有样本类都是类的子HKSample类,它是HKObject该类的子类。这些类在“对象和样本属性”中有更详细的描述。
- 源数据。每个样本存储关于其来源的信息。该HKSource`对象包含有关保存样本的应用程序或HKDevice设备的信息。该对象包含有关生成数据的硬件设备的信息。
- 删除的对象。一个HKDeletedObject实例用于临时存储已从HealthKit存储中删除的项目的UUID。当用户或其他应用程序删除对象时,可以使用已删除的对象进行响应。有关更多信息,请参阅HKAnchoredObjectQuery和HKDeleted。
对象和样本的属性
该HKObject班是所有HealthKit样品类型的超类。所有的HKObject子类都是不可变的。每个对象都有以下属性:
UUID。该特定条目的唯一标识符。
元数据。包含有关条目的其他信息的字典。元数据可以包含预定义键和自定义键。预定义的按键便于在应用程序之间共享数据。自定义键有助于扩展给定的HealthKit对象类型,将特定于应用程序的数据添加到条目中。
源修订。样本的来源。来源可以是直接将数据保存到HealthKit或应用程序的设备。将对象保存到HealthKit存储时,HealthKit会自动记录每个对象的源和版本。该属性仅适用于从商店检索的对象。
设备。生成存储在此示例中的数据的硬件设备。
该HKSample是HKObject的子类。示例对象表示特定时间点的数据。所有示例对象都是HKSample该类的子类。他们都有以下属性:类型。样本类型; 例如,睡眠分析样本,身高样本或步数样本。
开始日期。样本的开始时间。
结束日期。样本的结束时间。如果样本代表单个时间点,则结束时间应等于开始时间。如果样本代表一段时间内收集的数据,则结束时间应在开始时间之后进行。
样本进一步分为四个具体的子类:
类别样本。可以分类为有限类别的数据。查阅HKCategorySample
数量样本。可以作为数值存储的数据。数量样本是HealthKit中最常见的数据类型。这些包括用户的身高和体重,以及其他数据,如步数,用户的温度和脉搏率。看。HKQuantitySample
相关性。包含一个或多个样本的复合数据。在iOS 8.0中,HealthKit使用相关性来表示食物和血压。创建食物或血压数据时,应始终使用相关性。看
HKCorrelation
。锻炼。代表运动的数据,如跑步,游泳,甚至是玩耍。锻炼往往有类型,持续时间,距离和能源燃烧属性。您还可以将锻炼与许多细粒度的样本关联起来。与相关性不同,这些样本不包含在锻炼中 - 但是,他们可以使用锻炼查询。有关更多信息,请参阅HKWorkout。
设置HealthKit
1.在Xcode中,为您的应用程序启动HealthKit功能。
注意
当您在iOS应用上启用HealthKit功能时,Xcode会将HealthKit添加到所需设备功能的列表中。这可以防止用户在不支持HealthKit的设备上购买或安装应用程序。
如果HealthKit对于您的应用程序的正确操作不是必需的,则可以打开应用程序的Info.plist
文件并从Required device capabilities
阵列中删除条目healthkit
该healthkit
条目不被WatchKit扩展使用。
有关所需设备功能的详细信息,请参阅 关键信息属性列表键参考。
有关更多信息,请参阅添加HealthKit(iOS,WatchKit扩展)。
2.通过调用方法isAvailable()来确认用户设备上是否有HealthKit可用,如下所示。
if HKHealthStore.isHealthDataAvailable() {
// add code to use HealthKit here...
}
HealthKit在iPad上不可用。如果HealthKit不可用,则其他HealthKit方法将失败并显示错误。errorUnavailable
3.如果HealthKit已启用且可用,请为您的应用程序实例化一个对象,如下所示。HKHealthStore
let healthStore = HKHealthStore()
每个应用程序只需要一个HealthKit存储。创建一次后,保留引用,以便以后使用。
4.请求用户授权读取和共享HealthKit数据。
您必须先执行此操作,然后才能与商店执行任何任务。为了保护用户的隐私,HealthKit需要细致的授权。您必须申请权限才能读取和共享您的应用使用的每种数据类型。
无论何时您的应用程序请求新的权限,系统都会显示一个窗体,其中显示所有请求的数据类型。用户可以打开和关闭个人阅读和共享权限。要了解如何要求权限时提供出色的用户体验,看到HealthKit在iOS的人机界面指南。
图1显示了Fit应用程序的权限表。要下载示例代码,请参阅适合:存储和检索HealthKit数据。
** 注意**
用户为您的应用程序设置了权限后,可以随时使用“设置”或“运行状况”应用程序来更改它们。即使用户不允许读取或共享数据,您的应用程序也会出现在Health应用程序的Sources选项卡中。
5.提供自定义消息以显示在应用文件的权限表中。读取和写入HealthKit数据都需要自定义消息。设置密钥以自定义读取数据的消息。设置密钥以自定义写入数据的消息。欲了解更多信息,请参阅iOS的钥匙在信息属性列表键参考。
6.在尝试保存用户数据之前,请确保您的应用程序有权使用HealthKit方法共享数据。尝试在请求权限之前保存数据失败并出现错误errorinheritAuthorizationNotDetermined。尝试在权限被拒绝时保存数据失败并显示错误errorAuthorizationDenied
。
7.在用户授予共享数据类型的权限之后,您可以:
创建该类型的新样本并将其保存到HealthKit商店。有关创建示例的更多信息,请参阅将示例添加到HealthKit存储。
使用HealthKit存储查询数据。有关阅读HealthKit数据的更多信息,请参阅访问HealthKit数据。
有关如何设置和使用HealthKit的实际示例,请参阅Fit:存储和检索HealthKit数据。
将样品添加到HealthKit商店
您的应用程序可以创建新的样本并将其添加到HealthKit商店。所有样本类型的一般程序是相似的,尽管每种类型在这个主题上都有自己的变化。
- 1.在HealthKit常量中查找正确的类型标识符。
- 2.使用类型标识符实例化匹配子类的对象。有关便利方法的列表,请参阅。HKObjectTypeHKObjectType
- 3.HKSample使用对象类型实例化匹配子类的对象。
- 使用该方法将对象保存到HealthKit商店。save(_:withCompletion:)
每个HKSample子类都有自己的实例化对象的简便方法。这些方法修改上述过程。
对于数量样本,创建一个HKQuantity类的实例。数量单位必须与类型标识符文件中描述的允许单位一致。例如,height文档指出它使用长度单位。因此,您的数量必须使用厘米,米,英尺,英寸或其他兼容的单位。有关更多信息,请参阅。HKQuantitySample
对于类别样本,样本值必须与类型标识符文档中描述的枚举相对应。例如,sleepAnalysis文档指出它使用HKCategoryValueSleepAnalysis枚举。因此,创建此示例时,您必须传递此枚举的值。有关更多信息,请参阅。HKCategorySample
对于关联,您必须首先创建关联将包含的所有样本对象。关联的类型标识符描述了可以包含的对象的类型和数量。不要将包含的对象保存到HealthKit存储中。它们被存储为相关性的一部分。有关更多信息,请参阅HKCorrelation。
锻炼的行为与其他样本有所不同:
您不需要特定的类型标识符来创建实例。所有锻炼使用相同的类型标识符。HKWorkoutType
您必须为每次锻炼提供一个值。该值定义锻炼期间执行的活动的类型。HKWorkoutActivityType
- 锻炼保存到HealthKit商店后,您必须将其他样品与锻炼相关联(例如,活动燃烧卡路里或距离样品)。这些样本提供关于锻炼的细节细节。有关更多信息,请参阅HKWorkout。
锻炼样本可以为“活动”应用中的“移动”和“锻炼”环贡献力量。要做出贡献,您必须将一种或多种燃烧卡路里样本与锻炼联系起来。另外:
-
在watchOS中。使用锻炼会话来跟踪用户的活动。会话结束后,创建锻炼对象和关联的活动能量燃烧样本。有关更多信息,请参阅。HKWorkoutSession
系统根据活动能量烧录样本更新移动环。它根据手表传感器计算的锻炼期间用户实际施加的时间量来更新锻炼环。
在iOS 10或更高版本中。没有额外的工作是必要的。锻炼对象自动对“移动”和“锻炼”环都有贡献。锻炼环增加锻炼的总持续时间,移动环增加相关的活动燃烧的卡路里数。HealthKit还会将锻炼重叠的每个挂钟时间增加一小时。
在iOS 9中保存在iPhone上的锻炼对象不会影响活动环。
在设备上创建并保存最适合您的应用程序的锻炼。这通常是运行用户锻炼逻辑的设备。
平衡性能和细节
将数据保存到HealthKit存储区时,通常需要选择使用单个样本来表示数据,还是将数据分成多个较小的样本。从性能角度来看,单一的长样本更好。但是,多个较小的样本可以让用户更详细地了解数据如何随着时间而变化。理想情况下,您希望查找足够精细的样本大小,以向用户提供有用的历史数据。
记录锻炼时,可以使用高频数据(每个样本一分钟或更少)来提供强度图表,并分析锻炼过程中用户的表现。对于日常步骤计数较少的活动,一小时或更少的样本通常效果最好。这可以让你生成有意义的日常和小时图。
应用程序应避免保存24小时或更长的样本。
访问HealthKit数据
从HealthKit商店访问数据有三种主要方式:
直接方法调用。HealthKit商店提供了直接访问特征数据的方法。这些方法只能用于访问特征数据。有关更多信息,请参阅。HKHealthStore
-
查询。查询返回HealthKit存储中数据的当前快照。所有查询都在匿名后台队列上运行。查询完成后,它将在后台队列上执行结果处理程序。HealthKit提供了不同类型的查询,每个查询都设计为从HealthKit商店返回不同类型的数据。
示例查询。这是一个通用的查询。使用示例查询访问任何类型的示例数据。如果要对结果进行排序或限制返回的样本总数,示例查询尤其有用。有关更多信息,请参阅。HKSampleQuery
锚定对象查询。使用此查询搜索已添加到商店或从商店中删除的商品。第一次运行锚点查询时,它返回当前在商店中的所有匹配样本。在后续运行中,它仅返回自上次运行以来已添加或删除的项目。有关更多信息,请参阅。HKAnchoredObjectQuery
统计查询。使用此查询对匹配样本集进行统计计算。您可以使用统计查询来计算集合中的总和,最小值,最大值或平均值。有关更多信息,请参阅。HKStatisticQuery
统计收集查询。使用此查询在一系列固定长度的时间间隔内执行多个统计查询。创建图形时,您经常会使用这些查询。它们提供了一种简单的方法来计算事物,例如每天消耗的卡路里总数或每5分钟间隔所采取的步数。有关更多信息,请参阅。HKStatisticsCollectioQuery
相关查询。使用此查询来执行关联中包含的数据的复杂搜索。这些查询可以包含存储在关联中的每个样本类型的单独谓词。如果您只想匹配关联类型,请改为使用示例查询。有关更多信息,请参阅HKCorrelation。
* **源查询。**使用此查询搜索已将匹配样本保存到HealthKit商店的来源(应用程序和设备)。源查询列出了保存特定样本类型的所有来源。有关更多信息,请参阅。[HKSourceQuery](https://developer.apple.com/documentation/healthkit/hksourcequery)
活动摘要查询。使用此查询来搜索用户的活动摘要信息。每个活动摘要对象都包含给定日期的用户活动摘要。您可以查询一天或几天的数据。有关更多信息,请参阅HKActivitySummaryQuery
文档查询。使用此查询来搜索健康文档。有关更多信息,请参阅。HKDocumentQuery
-
**长时间运行的查询 **这些查询继续运行匿名后台队列,并在HealthKit存储更改时更新您的应用程序。另外,观察者查询可以注册后台交付。这使得HealthKit每当更新发生时都会在后台唤醒您的应用程序。
观察者查询。这个长时间运行的查询会监视HealthKit存储并提醒您对匹配样本进行的任何更改。当您想要收到有关商店更改的通知时,请使用观察者查询。您可以注册观察者查询以进行后台交付。有关更多信息,请参阅。HKObserverQuery
锚定对象查询。除了返回修改后数据的当前快照之外,锚定对象查询还可以充当长时间运行的查询。如果启用,它将继续在后台运行,随着匹配样本被添加到商店或从商店中删除提供更新。与观察者查询不同,这些更新包括已添加或删除的项目列表; 但是,锚定对象查询不能注册后台传送。有关更多信息,请参阅。HKAnchoredObjectQuery
统计收集查询。除了计算统计集合的当前快照之外,此查询还可以充当长时间运行的查询。如果将匹配样本添加到商店或从商店中删除,则此查询会重新计算统计信息收集,并更新您的应用。统计信息收集查询不能注册后台交付。有关更多信息,请参阅。HKStatisticsCollectionQuery
活动摘要查询。除了计算用户活动摘要的当前快照之外,此查询还可以充当长时间运行的查询。如果用户的活动摘要数据发生更改,则此查询将重新计算活动摘要,并更新您的应用程序。活动摘要查询无法注册后台交付。有关更多信息,请参阅。HKActivitySummaryQuery
单位和数量
该HKUnit类提供单个单位的表示形式。它支持广泛的公制和英制单位,以及简单和复杂的单位。一个简单的单位表示一个单一的测量,如米,磅或秒。一个复杂的单元,使用数学运算,如每平方英尺(磅/英尺每秒米(m / s)的或磅结合一个或多个简单单元)。
除了创建HealthKit支持的所有简单单元的便捷方法外,HKUnit还提供构建复杂单元所需的数学运算。您也可以使用格式正确的单位字符串直接创建复杂单位。
有关单位的更多信息,请参阅HKUnit。
在HKQuantity类存储用于给定的单元的值。然后,您可以请求任何兼容单元中的值,让您的应用程序轻松转换单位之间的值。
有关数量的更多信息,请参阅HKQuantity。
您可以使用本地化数量,如长度,质量和能量。对于其他数量,您需要执行转换并自己本地化数据。MeasurementFormatter
线程
HealthKit存储是线程安全的,大多数HealthKit对象是不可变的。通常,您可以在多线程环境中安全地使用HealthKit。
注意
所有HealthKit API的完成处理程序都在私有后台队列上执行。您通常希望在更新用户界面或修改应该仅由主线程触及的任何其他资源之前将此数据分派回主队列。
有关多线程和并发编程的更多信息,请参见并发编程指南。
添加数字签名
设备可以对他们创建的样本进行数字签名,让其他应用程序验证样本,并验证他们没有被改变。为了促进这一点,HealthKit提供了数字签名元数据密钥,HKMetadataKeyDigitalSignature。使用此键存储样本记录的数字签名副本。签名由设备生成(应该是防篡改的,因为它存储私人签名密钥)。这允许数据消费者使用该设备的已知公钥检查签名,以验证记录数据没有被改变。由于每条记录都是单独签名的,因此每个记录的存储开销大约为1 KB。因此,此元数据签名项目旨在用于采样率不超过每天几次的记录。较高的采样率将需要将签名应用于合并的样本组,这超出了本文档的范围。
通常,在制造时将私钥提供给防篡改测量设备。(任何私钥重置或证书更新的策略或机制都不在本文的范围之内)。相应的公钥将由设备制造商发布,例如,在他们的网页上。对于每个示例,设备都会将示例记录以及签名传递给iOS应用程序,这会将这两个项目都存储在HealthKit数据库中。请注意,私钥 - 公钥对用于数字签名以提供数据完整性,而不用于加密。数据记录中的实际值是明文。
用于数字签名的格式是IETF RFC 5652中规定的加密消息语法(Cryptographic Message Syntax,CMS)。签名使用带有区分编码规则(DER)的ASN.1进行编码。使用的消息摘要应该是SHA256,签名密码应该是FIPS PUB 186-4数字签名标准椭圆曲线P-256。这将确保力量和效率。另外,整个签名应该是base64编码,以便它可以存储在HealthKit NSString元数据对象中。
签名应该是ASN.1签名数据内容类型:
SignedData ::= SEQUENCE {
version CMSVersion,
digestAlgorithms DigestAlgorithmIdentifiers,
encapContentInfo EncasulatedContentInfo,
signerInfos SignerInfo }
其中SignerInfo类型是:
SignerInfo ::= SEQUENCE {
version CMSVersion,
sid SignerIdentifier,
digestAlgorithm DigestAlgorithmIdentifier,
signatureAlgorithem SignatureAlgorithmIdentifier,
signatureSignatureValue }
摘要和签名算法如上所述。可选项目已被省略。SignerIdentifier用于检索用于签名验证的正确公钥。
EncapsulatedContentInfo应该是设备生成的样本记录中相关项目的副本。该副本应使用ASN.1 DER进行编码,并应至少包含一个样本时间戳和样本值。记录数据被复制到签名中,以便有一个稳定的,明确定义的二进制编码(ASN.1 DER)的数据,这是产生可验证签名所必需的。对于大多数记录类型来说,ASN.1编码的plist结构(键值对)应该是足够的。(请参阅“使用ASN.1 DER编码plist结构”)。
采用HealthKit的好处
健康和健身应用程序从采用HealthKit中获得了几个具体的好处。具体来说,HealthKit:
分离数据收集,数据处理和社会化。创造现代健康和健身体验包括许多不同的方面,例如收集和分析数据,向用户提供可操作的信息和有用的可视化,以及培养社区。HealthKit允许您专注于仅实现您最感兴趣的方面,而将其他任务留给更专用的应用程序。
这种责任分离使用户可以通过选择自己喜欢的体重跟踪应用程序,步数计数应用程序和健康挑战应用程序,采用混合搭配的方式,每个应用程序都根据自己的需求进行了校准。但是,因为HealthKit应用程序可以自由交换数据(具有用户权限),所以组合套件提供比任何单个应用程序本身更好的体验。
例如,一群朋友可以决定加入每日步数挑战。每个人都可以使用自己喜欢的硬件设备或应用程序来跟踪这些步骤,但他们仍然可以使用相同的社交应用程序来应对挑战。
启用应用程序之间的自动数据共享。对于开发人员,您不再需要下载API并编写自定义代码以与每个应用程序共享。当新的HealthKit应用程序可用时,他们可以通过HealthKit存储自动开始共享。
用户不需要手动设置应用程序之间的连接或导入和导出数据。重要的是,用户仍然可以控制哪些应用程序可以读取和写入HealthKit存储数据以及每个应用程序有权访问哪些数据。但是,只要用户授予权限,应用程序就可以自由和无缝地访问彼此的数据。
提供更丰富的数据和更大的上下文感。通过访问更广泛的数据,每个应用程序都可以更全面地了解用户的健康和健身需求。在许多情况下,应用程序可以根据HealthKit商店的附加信息修改其指标或建议。例如,训练应用程序可以建议不仅基于燃烧的卡路里的数量而且还基于当天到目前为止已经吃过的食物的类型和数量来决定锻炼后的零食。
培育更大的生态系统。通过共享数据,应用程序成为更大的生态系统的一部分,增加了应用程序的可见性和实用性。更重要的是,HealthKit让您的应用程序与用户已经拥有和喜爱的其他应用程序进行协作。如果他们无法与您的应用共享数据,他们可能会决定在其他地方寻找解决方案。