我的iOS应用程序通过专有SDK(即非核心蓝牙框架)与BTLE设备进行通信。配对也通过此SDK(PnP代码)进行。 SDK服务有许多非标准的蓝牙服务。特性
一旦用户切换到另一个应用程序,即主应用程序在后台运行,我就无法再访问SDK服务。但是,即使我的应用程序在后台运行,我仍然不断从设备接收数据。
根据我的研究,Apple只允许几个背景模式,在此列出https://developer.apple.com/library/ios/documentation/general/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html(搜索页面" UIBackgroundModes"),例如音频,位置,voip,fetch,远程通知,报亭内容,外部附件,蓝牙中央,蓝牙外围设备
由于SDK使用自己的蓝牙框架和许多非标准蓝牙服务,即使应用程序在后台运行,我还必须允许我的应用程序连续按时间间隔启用服务?
我在考虑在后台使用位置服务。在那里我有一个疑问:
如果Apple认为位置服务在我的应用程序中很少或没有用,那么他们可能会拒绝它吗?
如果我的iPhone在计划表面上,那么它将不会调用didUpdateLocation方法&在这种情况下,我无法与SDK通信?
请建议,在后台运行我的应用程序的最佳方法是什么,这样我就不会遇到任何问题。
答案 0 :(得分:1)
在XCode中,转到您的项目 - >功能 - >背景模式,并将背景模式标记为开。 Mark还使用蓝牙LE配件:
答案 1 :(得分:1)
如果您的应用程序仅用于临时使用,那么您可以在后台播放音频并保持应用程序直播(这也会导致拒绝)
请注意,如果Apple使用CoreBluetooth框架,Apple会批准BTLE应用程序。 (https://developer.apple.com/library/ios/qa/qa1657/_index.html)
如果您正在寻找切换到Apple CoreBluetooth的简单方法, LGBluetooth是一款非常棒的轻量级解决方案,你可以去结帐https://github.com/l0gg3r/LGBluetooth 框架适用于CoreBluetooth,理想情况下适用于后台。
以下是使用LGBluetooth的绝佳示例(注意:偶数连接由框架处理)
阅读操作
[LGUtils readDataFromCharactUUID:@"f045" serviceUUID:@"5ec0" peripheral:peripheral completion:^(NSData *data, NSError *error) { NSLog(@"Data : %s Error : %@", (char *)[data bytes], error); }];
写入操作
int8_t dataToWrite = 0xFF; [LGUtils writeData:[NSData dataWithBytes:&dataToWrite length:sizeof(dataToWrite)] charactUUID:@"cef9" serviceUUID:@"5ec0" peripheral:peripheral completion:^(NSError *error) { NSLog(@"Error : %@", error); }];