【问题标题】:Ionic how to open your app with shake when you app is in the background?当您的应用程序在后台时,离子如何通过摇晃打开您的应用程序?
【发布时间】:2020-01-28 15:54:16
【问题描述】:

我正在构建一个紧急应用程序,其中一个功能是在摇动时打开应用程序,现在我知道该应用程序必须在后台运行。

我正在使用 cordova-background-mode 和 cordova s​​hake 一切正常,

但是当手机在主屏幕上时(应用程序只是最小化)。 当我摇动时应用程序不会启动,但是当我通过点击其图标重新打开应用程序时,它确实显示发生了摇动事件并打开了另一个我用来测试的应用程序。

当应用在后台时,如何让它在摇动时打开应用?

这是我的代码

this.platform.ready().then((e) => {
      this.backgroundMode.enable();
      this.backgroundMode.setEnabled(true);

      this.statusBar.styleDefault();
      this.splashScreen.hide();

        this.shake.startWatch().subscribe(() => {
          console.log(`watching...${e}`);
          alert('shake');
          const options: AppLauncherOptions = {
          }

           if(this.platform.is('ios')) {
             options.uri = 'fb://'
           } else {
             options.packageName = 'com.facebook.katana'
           }

           this.appLauncher.canLaunch(options).then((launch:Boolean)=>{
             if(launch){
               this.appLauncher.launch(options).then(()=>{
                 alert('Launched')
               },
               (err)=>{
                alert(JSON.stringify(err))
               })
             }else{
               alert(JSON.stringify("unable to launch app"));
             }
           },(err)=>{
             alert(JSON.stringify(err));
           })  

          });

编辑

这是我的代码,它可以工作,但问题是,如果我打开另一个应用程序,即whatsapp,但它可以是任何应用程序,然后关闭它,然后如果我摇晃手机,它会打开我上一个应用程序使用而不是启动我的应用程序。


 startBackgroundMode(){          

    this.backgroundMode.enable();
    this.backgroundMode.overrideBackButton();           

    this.backgroundMode.on('activate').subscribe(value => {
        this.backgroundMode.disableWebViewOptimizations();  
        this.shakePhone();   
    });
}
shakePhone(){
  this.shake.startWatch().subscribe(() => {
    console.log(`watching...`);                      
    this.openApp();

    });
}
  openApp(){  

    const options: AppLauncherOptions = {
    }
    options.packageName = 'this is my app's package name'


  this.appLauncher.launch(options);

  }

【问题讨论】:

  • 你在使用 ionic 4 吗?
  • 是的,我使用 ionic 4 和 angular 8
  • 您可以集成离子电容器并构建一个插件来本地实现此资源。如果你愿意,我可以发布一个带有链接的答案,用我学到的一些知识制作你自己的插件
  • @igor 非常感谢
  • 我想指出,当应用程序在后台时,应用程序确实会观察抖动,我只是在努力在后台启动我的应用程序。如果我将 options.packageName 设置为我的应用程序的包名称,那么它会打开最近打开的应用程序,但是如果我将 options.package 名称设置为等于 com.facebook.katana ,那么它可以完美运行

标签: android angular ionic-framework shake


【解决方案1】:

在后台播放媒体或在后台跟踪 GPS 位置等各种 API 可能无法在后台运行,即使后台模式处于活动状态。为了解决此类问题,该插件提供了一种方法来禁用 Android/CrossWalk 完成的大多数优化。

cordova.plugins.backgroundMode.on('activate', function() {
   cordova.plugins.backgroundMode.disableWebViewOptimizations(); 
});

注意:调用该方法会导致资源和功耗增加。

还需要使用以下

插件在每次其状态发生变化时触发一个事件。这些事件是启用、禁用、激活、停用和失败。

还需要在后台激活模式下检查 this.shake.startWatch()

cordova.plugins.backgroundMode.on('EVENT', function);

移除事件监听器:

cordova.plugins.backgroundMode.un('EVENT', function); 

【讨论】:

    【解决方案2】:

    我相信这不是您尝试的正确方法。如果您可以使用 java 来开发您的应用程序,那么就可以使用SensorManager 来检测抖动。现在您正在使用 ionic 并且解决方案正在利用 device-motion 插件。

    注意,像 ionic 这样的解决方案不如主要开发环境(java 或 kotlin 与 android studio)强大,尽管它们在界面设计方面更强大,因为它们利用了优势基于浏览器的应用程序(网络工具包)。所以你也必须考虑browser restrictions,所以像devicemotion EventListener这样的使用可能不适用于所有操作系统。

    如果您正在开发一个重要的应用程序,请选择主要解决方案以避免限制。

    【讨论】:

      【解决方案3】:

      知道您使用的是 ionic 4,实现此结果的一种方法是开发一个自定义插件,但使用离子电容器而不是 cordova。 Capacitor 让您更轻松地构建您的自定义插件,并使尚未构建任何插件的人更容易访问本机代码。

      下面的链接显示了如何为 ios 和 android 实现自定义插件。
      How to embed third party framework on ionic capacitor custom plugin?
      How to embed an Android library (AAR file) into a capacitor plugin?

      我将此解决方案作为替代方案。我知道工作量会大得多,而且项目已经有很多cordova插件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-31
        • 1970-01-01
        相关资源
        最近更新 更多