Nativescript: продолжить выполнение кода, когда приложение переходит в фоновый режим - PullRequest
0 голосов
/ 05 октября 2018

(отредактировано для предоставления обновленной информации)

У меня есть приложение 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 * после того, как приложение находится в фоновом режиме?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

iOS позволяет запускать код в фоновом режиме только для определенных ситуаций.Например (но не ограничиваясь ими):

  • Фоновые обновления местоположения.
  • Воспроизведение аудио и видео (PiP в iPad)
  • Удаленная обработка push-уведомлений
  • среди других ...

Если ваше приложение не соответствует ни одной из доступных категорий, лучшее, что вы можете сделать, это запросить у iOS больше времени для запуска в фоновом режиме (по умолчанию 10 секунд).Это позволит вам бежать еще 3 минуты.Просто продолжайте выполнять задачу в бесконечном цикле и корректно завершите работу своего приложения до того, как будет предоставлено 180 секунд.

Что касается фоновой выборки, этот механизм позволяет приложениям обновлять его содержимое в фоновом режиме.iOS будет запускать приложения, которые объявляют фоновую выборку, по крайней мере, один раз в день, чтобы вы в своем делегате могли выполнять обновление с сервера.Этот механизм не подходит для того, что вы ищете.

0 голосов
/ 05 октября 2018

Технически вы не можете заставить свое приложение быть активным, когда пользователь больше не хочет, чтобы оно было (заблокировав телефон / свернув приложение).Если вам нравится запускать что-либо в фоновом режиме, вам придется использовать background fetch в iOS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...