本地通知

本地通知:本地通知不依赖网络,无网络条件下依旧可以触发;可以定时发出通知。

Cordova 本地通知,可以用插件 cordova-plugin-local-notification 实现。


# Plugin Registry cordova plugin add de.appplant.cordova.plugin.local-notification # Github cordova plugin add https://github.com/katzer/cordova-plugin-local-notifications

cordova-plugin-local-notification 插件wiki

远程实时通知

远程通知:依赖网络,可以根据需要实时推送通知。

当在某种情况下,你需要向 APP 用户推送消息,而且该用户又没有打开 APP 的时候(后台运行)。你怎样才能够发出消息通知用户呢?

极光推送提供了一个 Cordova 通知插件 jpush-phonegap-plugin,即使 APP 在后台运行状态,也可以实现实时推送通知的功能。


Cordova 插件 jpush-phonegap-plugin 安装 (Android)

  • 先在极光推送官网注册一个账号,然后,在极光开发者服务创建一个应用 (因为,在安装插件的时候会用到 AppKey)。
    • 应用名称:填 Cordova 配置文件config.xml 中的 <name> 即可。

    • 应用包名(Android):填 Cordova 配置文件 config.xml 中的 <widget> 中的 id 即可。

  • Cordova 应用中添加插件:cordova-plugin-devicejpush-phonegap-plugin。要用到 cordova-plugin-device 插件。


# cordova-plugin-device cordova plugin add cordova-plugin-device # jpush-phonegap-plugin cordova plugin add jpush-phonegap-plugin --variable APP_KEY=AppKey # or github cordova plugin add https://github.com/jpush/jpush-phonegap-plugin.git --variable APP_KEY=AppKey

注意:AppKey 就是在极光开发者服务中创建应用之后,在应用信息中的 AppKey


Cordova 插件 jpush-phonegap-plugin 使用

jpush-phonegap-plugin 在需要在 cordova deviceready 的时候初始化才能够使用。初始化之后,正常情况下,会根据设备产生一个 registration ID(相对不同设备具有唯一性)。我们可以将这个 registration ID 保存到服务器端,通过这个 registration ID 对特定用户发送通知。也可以,通过设置 tag 等来实现。更多使用可以查看官方文档:JPush 官方文档

插件的一些常用 Cordova 监听事件,如:

  • jpush.receiveNotification:Cordova APP 在接收到 jpush 远程通知的时候触发事件。

  • jpush.openNotification:点击通知栏的 jpush 远程通知的时候触发事件。


jQuery(function($) { var cordovaJS = { // Application constructor initialize: function() { document.addEventListener('devicerady', this.onDeviceReady.bind(this), false); document.addEventListener('jpush.openNotification', this.jPushOpenNotification.bind(this), false); }, // Application deviceready event onDeviceReady: function() { this.jPushInitEvent(); }, jPushInitEvent: function() { window.plugins.jPushPlugin.init(); // Setting the notification max showing number window.plugins.jPushPlugin.setLatesNotificationNum(5); }, // The event when user click notification jPushOpenNotification: function(receiveObj) { // When click notification, show the message with alert button // Requirement to install cordova plugin: cordova-plugin-dialogs navigator.notification.alert(receiveObj.alert); } }; cordovaJS.initialize(); // Get registration ID window.plugins.jPushPlugin.getRegistrationID(function(id) { // The var id is the registration ID // So you can do something to save it to server here. }); });

正常情况下,初始化完之后,我们就可以在极光推送后台创建的项目中手动发送通知了(发送通知的时候,通知内容一定要填,不然设备不会显示通知)。但是,这不是我们想要的。通常,我们需要在服务器后台根据一定的条件自动触发推送条件,并且推送到特定的用户设备上。插件官方提供了服务端 SDK,我们可以通过安装相应的 SDK,通过调用相关的接口来实现服务器端发送通知的功能。如,Python:

  • 安装 Python SDK

pip/pip3 install jpush
  • 通过安装的 jpush 模块编写发送通知功能, jpush_client.py

import jpush class JPushClient(object): """jPush client for Instrument Connect Requirements: the jpush module must be installed (pip/pip3 install jpush). More info: https://docs.jiguang.cn/jpush/server/3rd/python_sdk/ """ def __init__(self, app_key, master_secret, *args, **kwargs): # AppKey and Master Secret from jiguang project self.app_key = app_key self.master_secret = master_secret def push_notification(self, registration_id, content, *args, **kwargs): """Push notification to user via jPush client: :param registration_id: a list of registration id which binding the user phone :param content: the notification content that will be send to user :return: """ # Init a jPush object _jpush = jpush.JPush(self.app_key, self.master_secret) # Create a push notification push = _jpush.create_push() # Setting push audience push.audience = jpush.audience({ 'registration_id': registration_id }) # Setting push platform push.platform = jpush.all_ # Setting notification content push.notification = jpush.notification(alert=content) push.send()
  • 调用编写好的接口,发送通知:

from xxx.jpush_client import JPushClient # AppKey and Master Secret from your jiguang project app_key = 'your project AppKey' master_secret = 'your project Master Secret' # A list of registration id that you want to send the notification to registration_id = ['xxx', 'xxx'] content = 'hello' JPushClient(app_key, master_secret).push_notification(registration_id, content)

更多 Python SDK 的使用可以查看 ipush-api-python-client

我们运行 cordova build android 的时候,生成的是 debug APK,是没有签名的。没有签名的 APK 不能够在Android 市场上发布的,同时,也不能够进行无缝升级等。

APP 签名作用

  • APP 签名可以保证应用开发者的所有权,防止应用被恶意替换和篡改。

  • APP 必须用同一个证书(*.jks)进行签名,才能够无缝升级安装新的版本。

  • 应用的模块化设计和开发。

  • Android 允许同一个证书签名的应用共享代码和数据。

生成签名证书(*.jks)

使用的是 Android Studio 生成签名证书文件:

  1. 用 Android Studio 打开 Cordova 项目中的 Android 包(platform/android)。

  2. 点击 Android Studio 顶部菜单栏的 【Build】=>【Generate Signed APK…】,会弹出一个【Generate Signed APK】的提示框。

  3. 这个提示框是用来生成签名 APK 的,但是,我们现在还没有签名证书文件。所以,点击其中的【Create new..】选项,会弹出一个【New Key Store】的提示框,生成签名证书文件:

  • Key store path:保存签名证书文件的路径。

  • Password:这个是 Key store password,生成签名 APK 的时候要输入。

  • Key Alias:别名,也是签名文件的名称。

  • Key Password:这个是 Key Password,生成签名 APK 的时候要输入。

其它的一些选项可以根据个人信息填写。填写完之后,点击【OK】,就可以在 Key store path 看到生成了签名文件(*.jks)。

生成签名 APK

使用 Android Studio 生成签名 APK

同样,点击 Android Studio 顶部菜单栏的【Build】=>【Generat Signed APK】:

  • Key store path:这次是点击【Choose existing…】选择刚刚生成的签名证书路径,如 /home/lizs/cordova/lizs.jks

  • Key store password:该签名文件的 Key store password

  • Key alias:签名文件的 Key Alias

  • Key password:该签名文件的 Key Password

填写好之后, 点击【next】进行下一步:

  • APK Destination Folder:生成签名 APK 的保存路径。

  • Build Type:release

最后【Finish】,成功之后会在 APK Destination Folder 生成一个 android-release.apk 的签名 APK。

命令生成签名 APK

手动调用了 Android SDK 中的 apksigner 工具来将 debug APK 生成签名 APK。


zipalign -v -p 4 android-release-unsigned.apk android-release.apk apksigner verify android-release.apk
  • zipalignapksigner 都是 Android SDK 中的 build-tool,如果全局环境变量中没有,需要用全局路径,如 /opt/android-sdk-linux/build-tools/25.0.2/zipalign

  • android-release-unsigned.apk:debug APK

参考:Android Studio 中 Android 应用程序签名打包方法