【问题标题】:Nativescript: Continue code execution when app goes to backgroundNativescript:当应用程序进入后台时继续执行代码
【发布时间】:2019-03-11 06:11:48
【问题描述】:

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

我有一个 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) ,第一步似乎是创建一个自定义应用程序委托,让它工作,然后在 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" />

编辑:仅供参考,为了让 custom-app-delegate 工作,我还必须使用以下命令下载“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中启动并在应用程序处于后台模式后继续

【问题讨论】:

  • 您好,我也有同样的问题,您找到解决方案了吗?如果你这样做了,那么你能告诉我如何处理它。
  • 我不知道如何使用应用委托执行后台任务。相反,我所做的是尝试找到其他解决方案(其他人已经弄清楚了)。例如,我使用 nativescript 本地通知插件来安排并显示用户通知,即使应用程序在后台。

标签: ios angular nativescript


【解决方案1】:

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

  • 后台位置更新。
  • 音频和视频播放(iPad 中的画中画)
  • 远程推送通知处理
  • 等等……

如果您的应用程序不符合任何可用类别,您可以做的最好的事情是request to iOS more time to run in the background(默认为 10 秒)。这将使您多跑 3 分钟。只需在无限循环中继续运行任务,并在允许的 180 秒之前优雅地终止您的应用程序。

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

【讨论】:

    【解决方案2】:

    从技术上讲,您不能在用户不再希望您的应用处于活动状态时强制它处于活动状态(通过锁定手机/最小化应用)。如果你想在后台运行任何东西,你必须在 iOS 中使用background fetch

    【讨论】:

    • 这不是“用户不希望应用处于活动状态”的情况。这个想法是,即使用户把它放在口袋里,应用程序也可以运行(他们锁定它以避免意外按下按钮)。 iPhone 的基本应用程序具有此功能:地图、音乐、时钟和播客都以这种方式工作。对于在后台运行的倒数计时器来说,“获取”是正确的方法吗?
    • 有不同类型的后台模式,包括定位、获取数据等,您应该选择适合您要求的一种。但在高层次上是这样的想法,一旦将其发送到后台,您就无法保持正常的应用程序代码运行。
    • 我一直在研究后台执行。我已经在 info.plist 中添加了 fetch 背景模式,但它似乎也可以让它工作,你首先需要添加一个 custom-app-delegate,然后通过安装 tns-platform-declarations 之类的东西让它工作。我已经这样做了,并且能够让自定义应用程序委托发挥作用——它可以在应用程序进入后台模式时注册。但是...
    • 应用程序进入后台后,如何“继续”我的 main.ts 文件中的代码?我看到的示例假设当应用程序处于后台模式时需要采取不同的操作。在我的情况下(像大多数人一样?)应用程序正在执行一项任务——比如 main.ts 文件中的计时器——然后我希望这段代码在应用程序进入后台时继续执行。这可能涉及我的 main.ts 文件和 custom-app-delegate 之间的通信,但我正在努力解决这个问题。是否有关于在主 ts 文件中发生操作,然后在后台模式后继续执行的示例代码?
    • Apple 希望开发人员遵循某些规则,因此您最好共享代码。将所有逻辑写在一个单独的文件中,然后在应用程序中调用它,并在后台执行同样的操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    相关资源
    最近更新 更多