ionic2实战-极光推送

作者: 昵称已被使用_ | 来源:发表于2017-05-09 10:39 被阅读4201次

传送门

极光官网
极光开发者控制台
jpush-phonegap-plugin
jpush 通用API
jpush Android API
jpush Ios API

准备


  • 生成AppKey
    AppKey一会用来安装插件


  • 推送设置
    android设置,填写应用包名点击提交.(包名是app根目录下congfig.xml中的id值)
    ios设置本文后面会讲


安装插件

1.使用命令安装

cordova plugin add jpush-phonegap-plugin --variable APP_KEY=你的AppKey

命令安装插件过程如下图,会安装jpush-phonegap-plugincordova-plugin-jcore两个插件,这两个插件大概有19M,如果网络慢就使用本地安装

2.本地安装

插件安装完成,依次执行下面命令,build app看插件是否报错

 cordova platform rm android
 cordova platform add android
 ionic cordova build android

项目中集成推送功能

  • 如下图,创建一个类并添加初始化极光推送代码.我创建的类名叫Helper.ts你随意
  • Helper.ts完整代码

最新代码可参考Helper.ts

/**
 * Created by yanxiaojun617@163.com on 05-09.
 */
import {Injectable} from '@angular/core';
import {NativeService} from "./NativeService";

/**
 * Helper类存放和业务有关的公共方法
 * @description
 */
@Injectable()
export class Helper {

  constructor(private nativeService: NativeService) {
  }

  initJpush() {
    if (!this.nativeService.isMobile()) {
      return;
    }
    window['plugins'].jPushPlugin.init();
    if (this.nativeService.isIos()) {
      window['plugins'].jPushPlugin.setDebugModeFromIos();
      window['plugins'].jPushPlugin.setApplicationIconBadgeNumber(0);
    } else {
      window['plugins'].jPushPlugin.setDebugMode(true);
      window['plugins'].jPushPlugin.setStatisticsOpen(true);
    }
    this.jPushAddEventListener();
  }

  private jPushAddEventListener() {
    //判断系统设置中是否允许当前应用推送
    window['plugins'].jPushPlugin.getUserNotificationSettings(result => {
      if (result == 0) {
        console.log('系统设置中已关闭应用推送');
      } else if (result > 0) {
        console.log('系统设置中打开了应用推送');
      }
    });

    //点击通知进入应用程序时会触发的事件
    document.addEventListener("jpush.openNotification", event => {
      let content = this.nativeService.isIos() ? event['aps'].alert : event['alert'];
      console.log("jpush.openNotification" + content);
    }, false);

    //收到通知时会触发该事件
    document.addEventListener("jpush.receiveNotification", event => {
      let content = this.nativeService.isIos() ? event['aps'].alert : event['alert'];
      console.log("jpush.receiveNotification" + content);
    }, false);

    //收到自定义消息时触发这个事件
    document.addEventListener("jpush.receiveMessage", event => {
      let message = this.nativeService.isIos() ? event['content'] : event['message'];
      console.log("jpush.receiveMessage" + message);
    }, false);


    //设置标签/别名回调函数
    document.addEventListener("jpush.setTagsWithAlias", event => {
      console.log("onTagsWithAlias");
      let result = "result code:" + event['resultCode'] + " ";
      result += "tags:" + event['tags'] + " ";
      result += "alias:" + event['alias'] + " ";
      console.log(result);
    }, false);

  }

  //设置标签
  public setTags() {
    if (!this.nativeService.isMobile()) {
      return;
    }
    let tags = this.nativeService.isAndroid() ? ['android'] : ['ios'];
    console.log('设置setTags:' + tags);
    window['plugins'].jPushPlugin.setTags(tags);
  }

  //设置别名,一个用户只有一个别名
  public setAlias(userId) {
    if (!this.nativeService.isMobile()) {
      return;
    }
    console.log('设置setAlias:' + userId);
    //ios设置setAlias有bug,值必须为string类型,不能是number类型
    window['plugins'].jPushPlugin.setAlias('' + userId);
  }

}

在获取到用户信息或用户重新登录时.你可能需要调用设置别名方法.
this.helper.setAlias(userInfo.id);
别名只能设置一个,一般设置用户的唯一标识,如用户id或用户登录名.如我设置的是用户id,这样就可以根据用户id推送消息
别名不能是number类型,如设置别名为1,在ios设置失败.在android上可以的.所以最好统一设置.setAlias(String(1));.setAlias('' + 1);.这个bug可能以后会修复

点击推送跳转到指定页面

  • jpush.openNotification事件中发布事件
  • app.component.ts订阅事件.完整代码可参考app.component.ts中的jpushOpenNotification()

如果你可以跳转到指定页面,但是android返回按钮处理事件出现bug.请参考app.component.ts中的registerBackButtonAction()
  • 如果你的app没有分tab

测试

  • 安装了推送插件后,还没有执行过ionic platform rm androidionic platform add android,请执行
  • 然后执行ionic build android生成apk发送到手机上安装并打开app

如果推送了消息,但是app没启动,这时候是收不到消息的.当app启动会立即收到消息

关于ios推送

ios极光推送插件的安装和使用方式和android一样
如果android端推送功能已经ok,那推送插件和代码应该不用改动了.下面说说ios推送的注意事项
如果对ios证书和ios打包还不够了解,请先看这里

推送证书

ios推送需要申请推送证书,并把推送证书添加到Mac的钥匙串中,然后从钥匙串中导出证书并上传到极光推送设置中,过程如下

  • 苹果开发者官网申请推送证书


  • 把推送证书添加到钥匙串


  • 从钥匙串中导出推送证书并上传到极光推送ios设置中



ios打包

  • 依次执行下面命令
ionic platform rm ios
ionic platform add ios
ionic build ios
  • 注意ionic build ios会报一个i386错误,这个错误不用管,极光开发人员说是ios模拟器问题.

官网给的解决方法是执行ionic platform update ios,如下图


但是当又执行了ionic platform rm iosionic platform add ios,然后重新build的时候,还是会有这个错误.所以不用管它继续打包
  • 用xcode打开app,设置app的打包证书.打开推送功能


  • 剩下的就是熟练的打包流程

  • 测试方法和上面gif图演示的一样,只是要选择ios开发环境或ios生产环境


最后

  • 更完整代码在github
  • 推送消息一般是由后台代码推送.
    如后台检测用户几天未登录则推送一条消息;web端给使用app的工作人员安排了一个工单要推送一条消息
  • 所以要集成极光推送后台服务
    极光官方github搜索你的后台开发语言,我的是java,然后看文档集成到你的后台代码中.....

相关文章

  • ionic2实战-极光推送

    传送门 极光官网极光开发者控制台jpush-phonegap-pluginjpush 通用APIjpush And...

  • ionic2/3极光推送

    极光官网注册得到APP_KEY 全局安装cordova,已安装可忽略 将项目文件platform 中已存在的and...

  • ionic2 极光推送 (iOS)

    首先需要申请极光开发者账号 并且创建一个app应用,创建之后需要上传.p12格式的证书,拿到APP_KEY 通过 ...

  • ionic2/ionic3 Jpush极光推送无法setAlia

    此文章针对于2017年10月份后,部分ionic2 ionic3开发者极光推送无法setAlias() setTa...

  • 极光推送实战总结

    http://blog.csdn.net/openglnewbee/article/details/5092164...

  • 极光推送

    极光推送视频地址,非常详细的极光推送视频 极光推送

  • 极光推送

    极光推送 tagprivate void initJpush() {//TODO 极光推送// JPushInte...

  • 极光推送进行远程推送

    借阅:极光推送进行远程推送 怎么使用极光推送进行远程推送 在极光官网注册极光推送创建一个应用在应用配置中导入两个证...

  • Ionic2 使用JMessage进行即时聊天功能的开发

    在ionic2中使用极光提供的jmessage进行即时聊天,由于极光官方没有像jpush那样提供cordova插件...

  • ios极光推送

    第一次使用极光推送,在这里把极光推送的步骤说一下,省的以后再次用到极光推送的时候,给忘了,其实,极光推送不难...

网友评论

  • 海货:"@jiguang-ionic/jpush": "^1.0.2",
    这个插件的安装步骤没有写是吧?
  • 海货:我安装了jpush-phonegap-plugin插件,cordova-plugin-jcore插件没安装
    昵称已被使用_:@海货 nodejs升级得到8.x,重新安装node_modules。
    海货:@小军617
    我的第一次运行ionic cordova build android 报错:

    Error: Missing binding /Users/yonghu1/Desktop/demo-project/demo/node_modules/node-sass/vendor/darwin-x64-48/binding.node
    Node Sass could not find a binding for your current environment: OS X 64-bit with Node.js 6.x

    Found bindings for the following environments:
    - OS X 64-bit with Node.js 8.x

    This usually happens because your environment has changed since running `npm install`.
    Run `npm rebuild node-sass --force` to build the binding for your current environment.
    at module.exports (/Users/yonghu1/Desktop/demo-project/demo/node_modules/node-sass/lib/binding.js:15:13)
    at Object.<anonymous> (/Users/yonghu1/Desktop/demo-project/demo/node_modules/node-sass/lib/index.js:14:35)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.require (module.js:497:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (/Users/yonghu1/Desktop/demo-project/demo/node_modules/@ionic/app-scripts/dist/core/bundle-components.js:6:16)
    昵称已被使用_:安装了jpush-phonegap-plugin,第一次build时会自动安装cordova-plugin-jcore
  • 8354ced201b5:军哥,我想问个问题 我打完包安装真机测试,极光推送第一次进入APP获取不到RegistrationID,就是第一次获取不到这个RegistrationID
    platform.ready().then(() => {
    // Okay, so the platform is ready and our plugins are available.
    // Here you can do any higher level native things you might need.

    //极光推送
    jpush.init().then(() => {
    jpush.setDebugMode(true);
    jpush.getRegistrationID().then(regid=>{
    this.storage.set('jpush_regid',regid);
    console.log('jpush_regid_'+regid);})
    .catch(err=>{
    console.log('jpush_regid_'+err);
    });
    }).catch(err =>{
    console.log('registrationId获取失败');
    });
    statusBar.styleDefault();
    splashScreen.hide();
    });
    }
  • de12d80639ce:大佬,这个ionic能实现视频直播吗😊
    KroYo:ios i386 那个问题可以解决吗 build failed 看起来怪怪的 心里不爽
    昵称已被使用_:@爱吃猫De鱼_534c 可以,没弄过
  • bf9710eb5572:请问我的点击极光推送信息,注销后再登录,事件订阅会执行的次数和注销的次数一样多
    bf9710eb5572:@小军617 而且我在tab页销毁的时候,取消了极光推送的订阅,但就这个取消订阅没有生效,其他的取消订阅有效
    bf9710eb5572:@小军617 但是登录成功之后我才知道这个账号里的字段,它该不该开启推送
    昵称已被使用_:@bf9710eb5572 app启动成功的时候初始化极光推送,而不是每次登录成功初始化极光推送
  • Swallow096:我在真机上测试 登录之后 调用this.jPushPlugin.getRegistrationID() 报没有找到jPushPlugin
  • ac9106fe70d4:根据楼主这样写,我发现我在设置tags的时候就挂啦,没有发出去,ios真机控制台会报错,设置tag和别名没有回调成功
    昵称已被使用_:@潘娇气 极光推送最新插件,设置方法和回调都变了和本问有出入,可以参考这里https://github.com/yanxiaojun617/ionic2_tabs/blob/master/src/providers/Helper.ts
  • bf9710eb5572:请问点击后怎么去指定页面,并且在指定页面显示推送内容
    昵称已被使用_:@bf9710eb5572 ....双向数据绑定.数据改变页面就跟着改变
    bf9710eb5572:@小军617 好的,谢谢。还有请问什么方法可以刷新单独的页面
    昵称已被使用_:本文已经说明,请搜索:点击推送跳转到指定页面
  • 忘了我是谁_ef95:document.addEventListener("jpush.openNotification", event => {
    let content = this.nativeService.isIos() ? event['aps'].alert : event['alert'];
    alert("jpush.openNotification" + content);
    }, false);

    请问下博主,这个回调我收到了,但是怎么在回调函数里把数据存储起来并调用其他函数做其他动作呢,这个作用域貌似不支持this,掉不到js的其他函数
  • LastSeries:大佬,现在Github中typings中jpush模块,是怎么实现的?还有没有其他的替代方案?
    LastSeries:@小军617 谢谢老铁,问题已经解决了,当时是想知道typing,是不是得自己将官网的js封装成ts,极光推送没有像其他Ionic native 原生插件提供对应 npm install @ionic-native/jpush,后来网上找到的ionic3-jpush通过npm 安装之后,一调用就白屏,后来没办法,只能通过window解决,真希望早点有位大神将对应的封装的好一点:blush:
    昵称已被使用_:@LastSeries 可以不写typing.直接调用jpush的方法;window.plugins.jPushPlugin.方法名()
  • HELLO_浪:小军,关于ios极光推送角标问题,当我收到两条信息时,我的app的信息角标为2,可是当我点击信息查看后,我的角标不会改变,也不会消失,你知道这是为什么吗?
  • bb4e613de457:军哥,请问怎么控制通知的提示音开启和关闭以及震动的开启和关闭???或者说怎么接受通知信息但是不通知出来只是APP获取到了通知的内容
    bb4e613de457:@小军617 只是有点傻这个方法
    bb4e613de457:@小军617 好吧,我现在弄出了message自定义通知的
    昵称已被使用_:@殇踎 不会哦
  • ceido:小军哥,为什么我点击发送后会有这样的错误。群发,别名都是这样:
    没有满足条件的推送目标
    如果是群发:则此应用还没有一个客户端用户注册。请检查 SDK 集成是否正常。
    如果是推送给某别名或者标签:则此别名或者标签还没有在任何客户端SDK提交设置成功。
    如果是根据 Registration ID 推送:则此 Registration ID 不存在。
    昵称已被使用_:@神奇的小卷毛 :sweat: ...
    ceido:@小军617 调试了一下,不是别名的问题。RegistrationID为空,应该是没有注册到 JPush 服务器。报了一些这样的错误:
    Failed to load resource: net::ERR_FILE_NOT_FOUND
    vendor.js:111389 Ionic Native: deviceready event fired after 7861 ms
    index.html:1 GET file:///android_asset/www/assets/fonts/roboto-medium.woff net::ERR_FILE_NOT_FOUND
    小军哥你看能解决不?
    昵称已被使用_:比如你按别名发,如果出现这个错误,说明setAlias方法没有调用成功.请真机调试设置别名回调
    //设置标签/别名回调函数
    document.addEventListener("jpush.setTagsWithAlias", event => {
    console.log("onTagsWithAlias");
    let result = "result code:" + event['resultCode'] + " ";
    result += "tags:" + event['tags'] + " ";
    result += "alias:" + event['alias'] + " ";
    console.log(result);
    }, false);
    setAlias方法请以极光推送官网为准.新旧版本有变话,我目前使用的是旧版本
    https://github.com/jpush/jpush-phonegap-plugin/blob/master/doc/Common_detail_api.md#setalias
  • _latty:博主 请问下nativeService里面的代码是怎么写的
    昵称已被使用_:@Latty_8f35 自己写的.慢慢完善的....
  • HELLO_浪:小军,请问为什么我现在在设置别名的时候失败了,我用的方法是window.plugins.jPushPlugin.setAlias(this.username);
    我通过广播推送消息,app能够接受到,使用别名就发送不了
    HELLO_浪:@小军617 真机调试后的错是:JPush Callback Error: Parameters error.
    HELLO_浪:@小军617 我目前用的是android测试没成功
    昵称已被使用_: //ios设置setAlias有bug,值必须为string类型,不能是number类型
    window['plugins'].jPushPlugin.setAlias('' + userId);
    如果你还接受不到,那你就真机调试
  • Arthur_h:APP运行在后台一段时间后就会被系统杀死,这样就收不到消息推送。请问楼主知道这个怎么解决吗?
    昵称已被使用_:这个问题没有解决
  • wang1992:按照你写的极光推送,iOS端 那个设置别名的方法没起作用(设置的是字符串),安卓端可以!这是为啥
    wang1992:我找到原因了 和安卓不一样,他需要传一个json数据,里面包含sequence 和 alias字段
    昵称已被使用_:ios设置setAlias有bug,值必须为string类型,不能是number类型
  • 李白不喝酒:大神,我按照你的可以获取到推送的消息,现在不知道怎么获取推送消息的详细内容,就是几个监听事件的具体处理
    李白不喝酒:@小军617 多谢
    昵称已被使用_:@李白不喝酒 在监听事件中就可以获得推送内容,详情内容看api文档,或者真机调试打断点看http://www.jianshu.com/p/e23cb7d720fd.
  • 谢炳南:我这边给所有人通知时可以的,可是设置tags和alias不行,都没有监听到
    昵称已被使用_:@谢炳南
    真机调试,给这个回调函数打断点肯设置别名是否成功.
    //设置标签/别名回调函数
    document.addEventListener("jpush.setTagsWithAlias", event => {}, false);
  • 程自舟:博主我集成推送本地安装插件说找不到model的绝对路径
  • 会飞的tiger:你好!你的推送代码文档和很详细,完美的解决了我的问题,但是有一点,我想问下你是怎么解决的,我的app安装后默认通知权限是关闭的,并且使用激光推送后,app也没有提示需要使用到通知权限,想问下有没有什么办法默认打开通知权限,或者弹出一个提示用户开启权限
    昵称已被使用_:@会飞的tiger 你尝试过用diagnostic.requestRuntimePermissions()这个方法获取权限吗http://ionicframework.com/docs/native/diagnostic/
    会飞的tiger:@小军617没注意你回的那么快!今天才看到,我试了还是不行,包括官网上的请求权限的插件也无效,这一周试了很多方法都不行,有点绝望了。。。。。,另外我下载你的项目打包出来的app也通知权限也是默认关闭的(测试android6.0和5.0的手机),不知道你那边是不是这样!
    昵称已被使用_:这么文章最后有关于权限的说明http://www.jianshu.com/p/85aceaee3b35#mwrz9
  • coffice:根据推送内容跳转到指定页面有什么方案咩
  • 92d876578f8b:楼主,Uncaught Error: Can't resolve all parameters for Helper: (?, [object Object]).
    main.js:111794 Ionic Native: deviceready event fired after 183 ms

    这个错误是什么原因,模拟器上调试的时候报这个错。
  • 李白不喝酒: 楼主 我一直安装不上插件,几种安装方式都试了,一直出现这样的错误:Cannot find plugin.xml for plugin "yargs",请问有什么方法解决么?
  • CK110:对于极光插件,我需要不要所有返回是promise的接口都放到jpush.init()的成功回调方法中,jpush.init(),是不是必要的?看有些封装的native ts插件,说不要init
    李白不喝酒:楼主 我一直安装不上插件,几种安装方式都试了,一直出现这样的错误:Cannot find plugin.xml for plugin "yargs",请问有什么方法解决么?
    昵称已被使用_:@CK怪我咯 不需要
  • 24826d2a1e74:非常好用,,但是为什么设置标签设不上啊求帮助
    昵称已被使用_:@StanLz 点击消息触发到点击事件,跳转到相关页面的方法去看ionic api和极光推送没关系了
    24826d2a1e74:@小军617 后来我看了是我把tag设成字符串了。。还有一个新问题就是点击推送的消息不能进入消息的相关页面 怎么解决啊。。
    昵称已被使用_:@StanLz ios设置setAlias有bug,值必须为string类型,不能是number类型
  • mysticIon:谢谢博主分享,关于iOS设置别名这个,你说ios设置setAlias有bug,值必须为string类型,不能是number,所以iOS设置别名会失败么
  • 23a18862452a:我这边能正常推送,就是监听事件一直没作用,我设置的是
    let content = this.nativeService.isIos() ? event['aps'].alert : event['alert'];
    alert("jpush.openNotification" + content);
    当时一直不出来提示框
    23a18862452a:@小军617 //点击通知进入应用程序时会触发的事件
    document.addEventListener("jpush.openNotification", event => {
    let content = this.nativeService.isIos() ? event['aps'].alert : event['alert'];
    alert("jpush.openNotification" + content);
    }, false);

    //收到通知时会触发该事件
    document.addEventListener("jpush.receiveNotification", event => {
    let content = this.nativeService.isIos() ? event['aps'].alert : event['alert'];
    alert("jpush.receiveNotification" + content);
    }, false);

    //收到自定义消息时触发这个事件
    document.addEventListener("jpush.receiveMessage", event => {
    let message = this.nativeService.isIos() ? event['content'] : event['message'];
    alert("jpush.receiveMessage" + message);
    }, false);
    三个都弄了alert,接收到推送就是不提示,照着抄的
    昵称已被使用_:@小潘_e940 你看是不是进入了jpush.receiveNotification这个事件.
    23a18862452a:尝试了网上的5个插件了,写法都是
    document.addEventListener("jpush.receiveMessage", event => {}, false);
    但是在里面写提示框,一直不出来
  • lixiaohao:我这里有个ionic-native的插件[基于ionic3 和 ionic-native3 的极光推送封装](https://github.com/lh4111/ionic-jpush)可以看看
    lixiaohao:@小军617 👌那可以打个Npm包了, 之前我没测试放在其他目录的情况
    昵称已被使用_:@lixiaohao 我的app已经加上了,没有在@ionic-native/下创建目录.https://github.com/yanxiaojun617/ionic2_tabs/tree/master/typings/modules/jpush
    昵称已被使用_:@lixiaohao 好的.改天试用一下.不过我不建议放到node_modules/@ionic-native/下.因为node_modules会经常删除更新.而且多人开发时node_modules不会提交到svn
  • 3f3a33c2df60:slider的zoom也就是双指缩放,框架自带的不起作用,怎么解决,还是说用什么插件替代
    昵称已被使用_:没弄过,你要自己研究了
  • 胡哈哈胡:大神,demo哪里下载,apk,不是github源码
    昵称已被使用_: @胡玉军 也在github
  • 1ea17a9d695a:请问您桌面安卓图标上的那个提示 “1” 是如何做到的
    1ea17a9d695a:@小军617 多谢大神回复,,我昨天手机设置不小心把系统的消息给屏蔽了
    昵称已被使用_: @张涛_8498这是安卓系统自动加的,你推送的时候手机界面不要停在app上,按home停在系统桌面上看
  • 编码的哲哲:赞,感谢作者
    昵称已被使用_:@蒋佳李_c358 * 更完整代码在[github](https://github.com/yanxiaojun617/ionic2_tabs/)
    蒋佳李_c358:NativeService 你的这个服务去那里了???既然集成了,为什么不帖出来嘛!
    昵称已被使用_:@编码的哲哲 :relaxed:
  • Kathy丶Andy:能给你的登录注册这块详细的解答下么,前台怎么发请求,怎么用接口获取数据,谢谢
    昵称已被使用_:@Summer666 你看我的LoginService.ts文件,把注释的那段代码的url换成你的接口地址.然后慢慢调
    Kathy丶Andy:@小军617 好吧 那你能将后台的加入到你的代码里面么,真的很想学习 不知道从哪里入手,公司让写个登录 只给了个接口,看着你的代码写不下来,很尴尬。
    昵称已被使用_:我这个app还没有真正的后台.其他的代码你可以在这里找到https://github.com/yanxiaojun617/ionic2_tabs/

本文标题:ionic2实战-极光推送

本文链接:https://www.haomeiwen.com/subject/wlxvtxtx.html