我的心率设备连接到我的应用程序,并担心在不同的情况下失去心率。
当应用程序位于前台时,我会将心率流式传输并存储在第三方数据库中。这很容易。
当应用程序进入后台而用户正在运行时,事情变得复杂,并且心率仍在流式传输。文件系统变得加密,因此我无法写入数据库,因此我的想法是将心率附加到文本文件,然后在应用程序返回到前台时将它们拉入数据库。它仍然变得更加复杂,因为心率是每秒一次,因此在应用程序恢复之前可能会有数万。我正在考虑而不是将它们附加到文本文件中,只是创建指示心率编号的文件名,并从文件名和创建日期派生数据。这样,我就不用打开文件了。我只需阅读它的元数据并在读入数据库时删除该文件。
对于这样一个看似简单的任务,它变得更加复杂。我必须处理核心蓝牙并确保它保持连接打开,但我无法想象iOS将允许该应用无限期地收听心率设备。在某些时候,应用程序将终止,但心率流会发生什么?
是否有经过验证的方法可以无限期地在后台处理流媒体心率?任何建议或经验将不胜感激!
答案 0 :(得分:2)
<强>蓝牙强>
iOS支持在后台模式下运行某些类型的应用。在此模式下,将保持蓝牙连接。心率监视器是开发人员文档中提到的应用程序类型之一:
这种支持对于某些类型的配件非常重要 定期数据,例如心率监视器。你启用 支持来自后台模式的外部附件通信 Xcode项目中Capabilities选项卡的一部分。当你 启用此模式后,外部附件框架不会关闭 与配件的积极会议。
请参阅iOS编程指南中的Background Execution部分。
数据记录
将日志记录存储为单个文件节点可能会导致性能下降。理想情况下,当应用程序在后台模式下运行时,您应该能够写入数据库。
另一种选择是将样本附加到文本文件,然后逐行读取文件并将其导入数据库。使用单个文件进行日志记录比数千个单独文件更有效。如果您担心文件的大小,分割文件的一种简单方法是使用当前日期和时间作为文件名。例如:格式'year-month-day-hour-minutes'将为每分钟创建一个新文件,每个文件都是唯一的。
如果多个进程写入文件(例如,如果文件位于共享应用程序容器中),则可以使用NSFileCoordinator
来防止竞争条件并确保文件的完整性。
如果使用磁盘保护,则可能需要更改日志文件(或数据库)的文件保护模式,以确保可以写入。使用NSFileManager.defaultManager().setAttributes(:ofItemAtPath)
将文件保护模式设置为“none”。
请参阅iOS编程指南的Privacy Strategies部分。