我开发了一个从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
这里有谁面临这个问题? 最好的祝福, 安东。
答案 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秒。