![](/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.