(已编辑以提供更新的信息)
我有一个本机脚本应用程序,可以执行各种任务,如果手机进入后台模式或被锁定,我将继续执行这些任务。
专注于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中启动代码并继续?
答案 0 :(得分:0)
从技术上讲,当用户不再希望应用程序处于活动状态时(锁定手机/最小化该应用程序),您不能强制其处于活动状态。如果您想在后台运行任何内容,则必须在iOS中使用background fetch。
答案 1 :(得分:0)
iOS允许您仅在某些情况下在后台运行代码。例如(但不限于):
如果您的应用不符合任何可用类别,则您最好采取request to iOS more time to run in the background(默认为10秒)的操作。这样您可以再运行3分钟。只需保持无限循环运行任务,并在授予的180秒之前优雅地终止您的应用即可。
关于后台抓取,该机制允许应用程序在后台更新其内容。 iOS将每天至少执行一次声明后台获取的应用程序,因此您在委托中可以从服务器执行更新。这种机制不适合您的需求。