(编辑以提供更新的信息)
我有一个使用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秒打印到控制台,但当应用程序在后台或手机被锁定时停止。如何使函数即使在应用程序在后台或锁定时也继续执行?
通过查看不同的来源,比如 这里(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>
编辑:创建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-declarations”命令:
$ npm i tns-platform-declarations --save-dev
通过这个方式,当应用程序进入后台时,该应用程序会正确地读取“在后台模式下!”因此,自定义应用程序代理是有效的。
然而,在线上的示例假设自定义应用程序代理中的代码与应用程序的其余部分无关,因此当应用程序进入后台模式时,它们假定有新的任务要完成。
但这在这里并不是这种情况。我有一个正在从coolComponent函数执行的任务,当应用程序进入后台或被锁定时,我想让它继续运行。
这可能需要coolComponent.ts与custom-app-delegate进行通信,但我不知道如何做到这一点。
仅在两个文件中重复代码--在coolComponent.ts和custom-app-delegate中均出现setInterval函数--不起作用,因为这不会导致自定义应用程序代理在用户按下按钮后以相同的时间继续运行。
那么,我怎样才能使代码从coolComponent.ts开始,并在应用程序处于后台模式时继续运行?