本机脚本:当应用程序进入后台时继续执行代码

时间:2018-10-05 17:27:31

标签: ios angular nativescript

(已编辑以提供更新的信息)

我有一个本机脚本应用程序,可以执行各种任务,如果手机进入后台模式或被锁定,我将继续执行这些任务。

专注于iOS,带有Nativescript Angular。在Nativescript中使用obj C代码也是我的新手。

举一个简单的例子,假设我想在用户按下按钮后每5秒打印一次到控制台,所以我的ts文件中有以下代码:

coolComponent.ts:

@Component({...})

Export class coolComponent {
...
whenButtonClicked(){
   setInterval(function(){ 
    console.log('button has been clicked. show every 5 seconds!'); 
  }, 5000);
}

没有更多代码,当用户按下按钮时,它将每5秒钟打印一次到控制台,但是当应用程序在后台或手机被锁定时会停止。我如何获得即使应用程序处于后台或锁定状态也能继续执行的功能?

看到不同的来源,例如here (NS docs on background execution)here (docs on app delegate)时,第一步似乎是创建一个自定义应用程序委托,使其生效,然后在信息中标识后台任务.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> 

编辑:创建参考。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

通过此操作,应用程序可以正确读取“在后台模式下!”当应用程序进入后台时。因此,custom-app-delegate是起作用的。

但是,在线示例假定custom-app-delegate中的代码独立于应用程序的其余部分,因此它们假定当应用程序进入后台模式时有新任务要做。

情况并非如此。我有一个正在通过coolComponent函数执行的任务,当应用程序进入后台或被锁定时,我希望它继续

这可能需要coolComponent.ts与custom-app-delegate进行通信,但是我不知道该怎么做。

仅在两个文件中重复执行代码-将setInterval函数同时出现在coolComponent.ts和custom-app-delegate中都不会起作用,因为这不会导致custom-app-delegate继续在同一文件上在用户按下按钮后从coolComponent.ts开始的计时。

那么在应用程序进入后台模式后,如何才能在coolComponent.ts中启动代码并继续

2 个答案:

答案 0 :(得分:0)

从技术上讲,当用户不再希望应用程序处于活动状态时(锁定手机/最小化该应用程序),您不能强制其处于活动状态。如果您想在后台运行任何内容,则必须在iOS中使用background fetch

答案 1 :(得分:0)

iOS允许您仅在某些情况下在后台运行代码。例如(但不限于):

  • 背景位置更新。
  • 音频和视频播放(iPad中为PiP)
  • 远程推送通知处理
  • 还有其他...

如果您的应用不符合任何可用类别,则您最好采取request to iOS more time to run in the background(默认为10秒)的操作。这样您可以再运行3分钟。只需保持无限循环运行任务,并在授予的180秒之前优雅地终止您的应用即可。

关于后台抓取,该机制允许应用程序在后台更新其内容。 iOS将每天至少执行一次声明后台获取的应用程序,因此您在委托中可以从服务器执行更新。这种机制不适合您的需求。