在后台将BLE设备数据发送到服务器

时间:2019-04-07 18:26:32

标签: objective-c bluetooth-lowenergy mqtt core-bluetooth

我开发了一个从BLE设备读取数据并将其发送到MQTT代理(服务器)的应用程序。但是,当应用程序进入后台时,数据发送在3分钟后停止(我使用后台任务)。我这次如何增加。或者,也许有一种正式的机制,苹果会推广并且不会拒绝App Store上的确认步骤,以便从BLE中读取数据并在不受时间限制的后台将数据发送到服务器?

我的后台任务:

AYBackgroundTask.h

@interface AYBackgroundTask : NSObject

@property (assign) UIBackgroundTaskIdentifier identifier;
@property (strong, nonatomic) UIApplication *application;

+ (void)run:(void(^)(void))handler;

- (void)begin;
- (void)end;

@end

AYBackgroundTask.m

@implementation AYBackgroundTask

+ (void)run:(void(^)(void))handler {
  AYBackgroundTask *task = [[AYBackgroundTask alloc] init];
  [task begin];
  handler();
}

- (void)begin {
  self.identifier = [self.applicationn beginBackgroundTaskWithExpirationHandler:^{
    [self end];
  }];
}

- (void)end {
  if (self.identifier != UIBackgroundTaskInvalid) {
    [self.application.application endBackgroundTask:self.identifier];
  }
  self.identifier = UIBackgroundTaskInvalid;
}

@end

这里有谁面临这个问题? 最好的祝福, 安东。

1 个答案:

答案 0 :(得分:0)

总结一下,beginBackgroundTaskWithExpirationHandler不起作用-使用Core Bluetooth Background Processing for iOS Apps。仔细阅读它,因为如果您错过了一点,它可能不会出现错误-它会默默地失败。

您首先需要将其添加到Info.plist

<key>UIBackgroundModes</key>
<array>
    <string>bluetooth-central</string>
</array>

请特别注意标题为Use Background Execution Modes Wisely的部分,

  

应用唤醒后,大约有 10秒才能完成任务。理想情况下,它应尽快完成任务并允许其再次暂停。在后台执行的时间过长的应用可能会被系统限制或终止。

虽然MQTT很棒,但是您可能需要切换到NSURLSessionUploadTask,因为上传是在操作系统的其他位置异步进行的,因此时间不会占用您的10秒。