繁体   English   中英

当您的应用程序在后台时,离子如何通过摇动打开您的应用程序?

[英]Ionic how to open your app with shake when you app is in the background?

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

我正在使用cordova-background-mode和cordovashake,一切正常,

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

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

这是我的代码

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);

  }

即使后台模式处于活动状态,在后台播放媒体或跟踪 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); 

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

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

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

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

下面的链接显示了如何为 ios 和 android 实现自定义插件。
如何在离子电容器自定义插件上嵌入第三方框架?
如何将 Android 库(AAR 文件)嵌入到电容器插件中?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM