我有一个心率设备连接到我的应用程序,并担心在不同的情况下失去心率。
当应用程序在前台时,我将流式传输心率并将其存储在第三方数据库中。这是简单的部分。
当应用程序进入后台,而用户正在锻炼等,事情变得复杂,心率仍在流。文件系统被加密了,所以我不能写入数据库,所以我的想法是将心率附加到文本文件中,然后在应用程序返回前台时将它们拉入数据库。
它仍然变得更加复杂,因为心率是每秒一次,所以在应用程序返回之前可能有数万次。我在想,而不是将它们附加到一个文本文件,只是为了创建文件名,表明心率数字,并从文件名和创建日期派生数据。这样我就不用打开文件了。我只需要读取它的元数据,并在读取到数据库时删除文件。
对于这样一个看似简单的任务,它变得更加复杂。我必须处理核心蓝牙并确保连接保持打开状态,但我无法想象iOS会允许应用程序无限期地监听心率设备。在某个时刻,应用程序将会终止,但心率流会发生什么呢?
是否有一种经过验证的方法可以无限期地处理后台的流心率?任何建议或经验将非常感激!
蓝牙
iOS支持在后台模式下运行某些类型的应用。在此模式下,蓝牙连接将保持。心率监测器是开发者文档中提到的一种应用:
此支持对于某些类型的交付附件非常重要如心率监测仪。启用支持来自后台模式的外部附件通信在Xcode项目的Capabilities选项卡中。当你启用此模式时,外部附件框架不会关闭带有配件的活动会话。
请参阅iOS编程指南中的后台执行章节。
数据记录
将日志记录存储为单独的文件节点可能会导致性能下降。理想情况下,你应该能够写数据库,而应用程序是在后台模式下运行。
另一个选项是将示例附加到文本文件中,然后逐行读取文件并将其导入数据库。使用单个文件进行日志记录比使用数千个单独的文件更有效。如果您担心文件的大小,分割文件的一个简单方法是使用当前日期和时间作为文件名。例如:格式"年-月-日-小时-分钟"将每分钟创建一个新文件,并且每个文件都是唯一的。
如果多个进程写入文件(例如,如果文件在共享的应用程序容器中),您可以使用NSFileCoordinator
来防止竞争条件并确保文件的完整性。
如果您正在使用磁盘保护,您可能需要更改日志文件(或数据库)的文件保护模式,以确保它可以被写入。使用NSFileManager.defaultManager().setAttributes(:ofItemAtPath)
设置文件保护模式为none
请参阅iOS编程指南中的隐私策略章节。