8

问题:我需要与 BLE 外围设备保持断开连接,但要尽可能频繁地将数据发送到服务器进行处理,因为它可能对时间很关键。换句话说,我想每隔一段时间连接一次并将同步的数据发送到 API,同时在所有其他时间保持断开连接以节省电池寿命。

尝试失败:UIBackgroundModes我的应用程序的 Info.plist 文件的字段设置为bluetooth-central仅在我连接时让我在后台执行。我想保持断开连接,但以预定义的时间间隔重新连接,以及从后台模式安排警报。

有可能:我注意到 FitBit Flex 应用程序的设置中有一个选项可以在后台启用同步。我不确定它在范围内时是否会与我的 Flex 断开连接,但从它如此小的——我会失去它的电池尺寸来看,我猜它不会保持连接状态。

4

3 回答 3

11

我知道我已经接受了这个答案(对不起!),但我找到了一个解决方案:

[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:60*5]; // Every 5 minutes, minimum

在:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

并添加fetchUIBackgroundModes,然后 iOS 调用:

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler

每 15-240 分钟一次(是的,变化很大,但总比没有好)。每次我被要求执行获取时,我都会连接到外围设备,同步并将其数据发送到服务器,然后断开连接。由于我将这些数据从 BLE 外围设备发送到服务器进行处理/存储,我假设这是对fetch.

CAVEAT: iOS 为应用建立用户使用模式之前不会被调用application:performFetchWithCompletionHandler:。换句话说,在调用该方法之前,您需要将应用程序保留(而不是删除)大约 24 小时左右。男孩,是否需要一段时间才能弄清楚!application:performFetch...

更新: Apple 已接受我使用此解决方案的应用程序(2014 年 5 月批准)。

于 2014-01-23T05:18:00.553 回答
1

https://developer.apple.com/hardwaredrivers/BluetoothDesignGuidelines.pdf

我很确定你们已经看到了,但以防万一。也许在 BLE 外设端,您可以通过增加连接间隔来节省电量(第 22 页)。

于 2013-11-13T17:30:30.780 回答
1

你不能。后台应用程序无法启动任何事务,它只能对传入请求(数据通知、连接事件......)做出反应sleep,否则会因为违反策略而完全终止。

您的应用程序可以存活一段时间的唯一情况是它使用beginBackgroundTaskWithName:expirationHandler:API 时。但即使在这种情况下,它也只有 10 分钟才能完成,否则它就会被杀死。

如果要在后台同步,则必须在外围设备端启动事务。最简单的方法是保持联系并每隔一段时间向中央发送通知。这将唤醒它,它可以继续读取它需要的特征。但是还有其他几种方法可以实现它。最终解决方案的设计必须能够最好地满足您的需求。如果您有具体的想法,请将其作为单独的问题提交。

于 2013-10-31T07:57:44.360 回答