(отредактировано для предоставления обновленной информации)
У меня есть приложение nativescript, которое выполняет различные задачи, которые я хотел бы продолжить, если телефон переходит в фоновый режим или заблокирован.
Сосредоточена на iOS, с Nativescript Angular.Я также новичок в использовании obj C-кода в Nativescript.
В качестве простого примера, скажем, я хочу печатать на консоли каждые 5 секунд после нажатия пользователем кнопки, поэтому у меня есть следующий код в моемФайл компонента ts:
coolComponent.ts:
@Component({...})
Export class coolComponent {
...
whenButtonClicked(){
setInterval(function(){
console.log('button has been clicked. show every 5 seconds!');
}, 5000);
}
Без дополнительного кода, когда пользователь нажимает кнопку, он печатает на консоли каждые 5 секунд, но затем останавливается, когда приложениев фоновом режиме или телефон заблокирован.Как заставить функцию продолжать выполняться, даже если приложение находится в фоновом режиме или заблокировано?
При просмотре различных источников, например здесь (NS-документы по фоновому выполнению) и здесь(документы по делегату приложения) , похоже, что первый шаг - создать пользовательский делегат приложения, заставить его работать, а затем определить фоновую задачу в info.plist.
У меня естьПолучил вещи, как правило, чтобы быть функциональным, как это:
app / custom-app-Delegate.ts:
import { ios, run as applicationRun } from "tns-core-modules/application";
export class CustomAppDelegate extends UIResponder implements
UIApplicationDelegate {
public static ObjCProtocols = [UIApplicationDelegate];
public applicationDidEnterBackground(application: UIApplication) {
console.log('in background mode!')
}
}
main.ts:
import { platformNativeScriptDynamic } from "nativescript-angular/platform";
import { AppModule } from "./app.module";
import * as application from "tns-core-modules/application";
import { CustomAppDelegate } from "./custom-app-delegate";
application.ios.delegate = CustomAppDelegate;
platformNativeScriptDynamic().bootstrapModule(AppModule);
app /app.module.ts:
import { CustomAppDelegate } from "./custom-app-delegate";
app / App_Resources / iOS / info.plist:
...
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
</array>
edit: создать reference.d.ts:
/// <reference path="./node_modules/tns-platform-declarations/ios.d.ts" />
/// <reference path="./node_modules/tns-platform-declarations/android.d.ts" />
Редактировать: к вашему сведению, чтобы заставить работать пользовательское приложение-делегат, мне также пришлось загрузить «tns-platform-declerations» с помощью команды:
$ npm i tns-platform-declarations --save-dev
При этом приложение правильно читает"в фоновом режиме!"когда приложение уходит в фон.Таким образом, пользовательское приложение-делегат работает.
Однако в онлайн-примерах предполагается, что код пользовательского приложения-делегата не зависит от остальной части приложения, поэтому они предполагают, что есть новые задачи, которые необходимо выполнить, когда приложение переходит в фоновый режим.
Это не тот случай, здесь.У меня есть задача, которая выполняется из функции coolComponent, и когда приложение переходит в фоновый режим или заблокировано, я хочу, чтобы продолжалось .
Это, вероятно, требует, чтобы coolComponent.ts связывался с custom-app-делегатом, но я не знаю, как это сделать.
Просто повторяю код в обоих файлах - имея setIntervalфункция появляется как в coolComponent.ts, так и в custom-app-делегате - не работает, потому что это не приведет к тому, что custom-app-делегат продолжит работу в то же время, которое началось в coolComponent.ts после того, как пользователь нажал кнопку.
Так как мне запустить код в coolComponent.ts и продолжить 1053 * после того, как приложение находится в фоновом режиме?