![](/img/trans.png)
[英]ionic 1 onesignal is there a way to know if there is a push notification when open app from background to foreground or launching app
[英]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.