簡體   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