В настоящее время я разрабатываю приложение для iOS с экспо SDK-версия 32. Мне приходится периодически вызывать службу REST из моего приложения. Для этого я попытался использовать новый API BackgroundFetch.
Вот мой код:
const BACKGROUND_LOCATION_SENDING_TASK = "BACKGROUND_LOCATION_SENDING_TASK";
async function initBackgroundLocationSending() {
console.info("initBackgroundLocationSending()");
TaskManager.defineTask(BACKGROUND_LOCATION_SENDING_TASK, () => {
// this console.info does never get called ...
console.info("BACKGROUND_LOCATION_SENDING_TASK");
// i will implement real fetch logic here when i found out how to get this function called.
return BackgroundFetch.Result.NewData;
});
console.info("is task registered ... ");
let isRegistered = await TaskManager.isTaskRegisteredAsync(BACKGROUND_LOCATION_SENDING_TASK);
console.info("isRegistered: ", isRegistered);
if (isRegistered) {
console.info("unregister task ...");
await BackgroundFetch.unregisterTaskAsync(BACKGROUND_LOCATION_SENDING_TASK);
console.info("Done");
}
console.info("is task registered ... ");
isRegistered = await TaskManager.isTaskRegisteredAsync(BACKGROUND_LOCATION_SENDING_TASK);
console.info("isRegistered: ", isRegistered);
console.info("register task ...");
await BackgroundFetch.registerTaskAsync(BACKGROUND_LOCATION_SENDING_TASK);
console.info("OK");
console.info("is task registered ... ");
isRegistered = await TaskManager.isTaskRegisteredAsync(BACKGROUND_LOCATION_SENDING_TASK);
console.info("isRegistered: ", isRegistered);
console.info("set minimum interval ...");
await BackgroundFetch.setMinimumIntervalAsync(60);
console.info("OK");
console.info("get status ... ");
const status = await BackgroundFetch.getStatusAsync();
console.info("status: ", status);
}
Вывод консоли при вызове функции из App.js:
: initBackgroundLocationSending()
: is task registered ...
: isRegistered: true
: unregister task ...
: OK
: is task registered ...
: isRegistered: false
: register task ...
: OK
: is task registered ...
: isRegistered: true
: set minimum interval ...
: OK
: get status ...
: status: 3
Из фоновая документация выставки expo я понимаю, что статус: 3 означает BackgroundFetch.Status.Available.
раздел iOS из моего app.json:
...
"ios": {
"supportsTablet": true,
"bundleIdentifier": "xxx-yyy-zzz",
"infoPlist": {
"UIBackgroundModes": [
"location",
"fetch"
],
"NSLocationWhenInUseUsageDescription": "... (replaced)",
"NSLocationAlwaysAndWhenInUseUsageDescription": "... (replaced)",
"NSLocationAlwaysUsageDescription": "... (replaced)"
}
},
...
Мое тестовое устройство — IPhone 6s с iOS 12.1.3.
Что мне не хватает? Почему он вообще не запускает задачу даже через несколько минут?
кстати: я использую Фоновая локация выставки без проблем
у меня такая же проблема, открыл на github тему по этому поводу github.com/expo/expo/issues/3582
Вот более свежая незакрытая версия проблемы github.com/expo/expo/issues/9900 с MVCE.
Чего вам не хватает, так это пользовательской сборки клиента Expo IOS expo client:ios НО даже с этим я все еще не могу заставить его работать правильно.





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