Отправка данных устройства BLE на сервер в фоновом режиме - PullRequest
0 голосов
/ 07 апреля 2019

Я разрабатываю приложение, которое считывает данные с устройства BLE и отправляет эти данные на брокер MQTT (сервер). Но при входе приложения в фоновый режим отправка данных прекращалась через 3 минуты (я использую фоновые задачи). Как я могу увеличить это время. Или, может быть, существует официальный механизм, который Apple продвигает и не будет отклонять на этапе подтверждения в 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 голосов
/ 07 апреля 2019

Подводя итог, beginBackgroundTaskWithExpirationHandler не будет работать - используйте Базовая обработка фона Bluetooth для приложений iOS .Прочтите его внимательно, так как вы, скорее всего, не получите ошибок, если пропустите немного - он молча провалится.

Вам нужно будет начать с добавления этого в ваш Info.plist:

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

Обратите особое внимание на раздел, озаглавленный Мудро используйте фоновые режимы исполнения , в частности:

После пробуждения приложение имеет около 10 секунд выполнить задачу.В идеале, он должен завершить задачу как можно быстрее и позволить себе снова приостановиться.Приложения, которые проводят слишком много времени в фоновом режиме, могут быть заблокированы системой или убиты.

Несмотря на то, что MQTT фантастический, вам может потребоваться переключиться на NSURLSessionUploadTask какзагрузка происходит асинхронно в других местах ОС, поэтому время не будет учитываться в ваших 10 секундах.

...