无限期地在后台传输心率?

Stream heart rate in background indefinitely?

我有一个连接到我的应用程序的心率设备,担心在不同情况下会失去心率。

当应用程序在前台运行时,我正在流式传输心率并将它们存储在第 3 方数据库中。这是最简单的部分。

当用户正在锻炼等时应用程序进入后台并且心率仍在流动时,事情会变得复杂。文件系统变得加密,所以我无法写入数据库,所以我的想法是将心率附加到文本文件,然后在应用程序返回前台时将它们拉入数据库。

它仍然变得更加复杂,因为心率是每秒一次,所以在应用程序返回之前可能有数万次。我在考虑不是将它们附加到文本文件,而是创建指示心率数的文件名并从文件名和创建日期派生数据。这样,我永远不必打开文件。我只需要读取它的元数据并在读入数据库时​​删除文件。

看似简单的任务,其实更复杂。我必须处理 Core Bluetooth 并确保它保持连接打开,但我无法想象 iOS 会允许应用程序无限期地收听心率设备。该应用程序有时会终止,但心率流会发生什么变化?

是否有一种行之有效的方法可以无限期地在后台处理心率流?任何建议或经验将不胜感激!

蓝牙

iOS 在后台模式下支持 运行 某些类型的应用程序。在此模式下,蓝牙连接将保持不变。心率监测器是开发者文档中提到的应用程序类型之一:

This support is important for some types of accessories that deliver data at regular intervals, such as heart-rate monitors. You enable support for external accessory communication from the Background modes section of the Capabilities tab in your Xcode project. When you enable this mode, the external accessory framework does not close active sessions with accessories.

请参阅 iOS 编程指南中的 Background Execution 部分。

数据记录

将日志记录存储为单独的文件节点会导致性能不佳。理想情况下,当应用程序处于 运行 后台模式时,您应该能够写入数据库。

另一种选择是将示例附加到文本文件,然后逐行读取文件并将其导入数据库。使用单个文件进行日志记录比使用数千个单独的文件更有效。如果您担心文件的大小,拆分文件的一种简单方法是使用当前日期和时间作为文件名。例如:格式'year-month-day-hour-minutes'会每分钟创建一个新文件,每个文件都是唯一的。

如果多个进程写入文件(例如,如果文件在共享应用程序容器中),您可以使用 NSFileCoordinator 来防止竞争条件并确保文件的完整性。

如果您正在使用磁盘保护,您可能需要更改日志文件(或数据库)的文件保护模式以确保可以写入。将文件保护模式设置为 'none' 和 NSFileManager.defaultManager().setAttributes(:ofItemAtPath).

请参阅 iOS 编程指南的 Privacy Strategies 部分。