问题:我需要保持与BLE外设的断开连接,但是将数据的数据发送到服务器以便尽可能频繁地进行处理,因为它可能对时间要求很高。换句话说,我想经常连接并将同步的数据发送到API,同时在所有其他时间保持断开连接以节省电池寿命。
尝试失败:将我应用的Info.plist文件的UIBackgroundModes
字段设置为bluetooth-central
只会让我在连接时执行后台操作。我想保持断开状态,但是以预定义的间隔重新连接,以及从后台模式安排警报。
可能:我注意到FitBit Flex应用程序在设置中有一个选项可以在后台启用同步。我不确定它是否会在我的Flex范围内断开连接,但是判断它的电池尺寸如此之小 - 我估计它没有保持连接。
答案 0 :(得分:10)
我知道我已经接受了这个答案(对不起!),但我找到了解决方案:
[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:60*5]; // Every 5 minutes, minimum
在:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
并将fetch
添加到UIBackgroundModes
,然后iOS调用:
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler
每15-240分钟(是的,它会改变很多,但它总比没有好)。每次调用我执行提取时,我都会连接到外设,同步并将其数据发送到服务器,然后断开连接。由于我将这些数据从BLE外设发送到服务器进行处理/存储,我假设这是fetch
的合法(AppStore值得)使用。
CAVEAT: application:performFetchWithCompletionHandler:
将不调用,直到iOS为应用程序建立用户使用模式。换句话说,在调用application:performFetch...
方法之前,您需要将应用程序保留约24小时左右(而不是删除它)。男孩,这需要一段时间来解决这个问题!
更新:Apple已接受使用此解决方案的应用程序(2014年5月批准)。
答案 1 :(得分:1)
你不能。后台应用程序无法启动任何事务,它只能响应传入的请求(数据通知,连接事件......)在后台,应用程序实际上没有运行,即使在BLE事件的情况下,它只有8秒钟返回睡觉,否则因违反政策而完全终止。
当您的应用可以保持活跃一段时间的唯一情况是它使用beginBackgroundTaskWithName:expirationHandler:
API。但即使在这种情况下,它只需要10分钟即可完成或被杀死。
如果要在后台同步,则必须在外围设备上启动事务。最简单的方法是保持联系并每隔一段时间向中心发送一个通知。这将唤醒它,它可以继续阅读它所需的特性。但是还有其他几种方法可以实现它。最终的解决方案必须旨在最好地满足您的需求。如果您有一个具体的想法,请将其作为一个单独的问题提交。
答案 2 :(得分:1)
https://developer.apple.com/hardwaredrivers/BluetoothDesignGuidelines.pdf
我很确定你们已经看过这个,但万一你还没有。也许在BLE外设端,您可以通过增加连接间隔来节省电量(第22页)。