PhoneGap中文网

 找回密码
 立即注册
查看: 37829|回复: 4
打印 上一主题 下一主题

phonegap Ionic 集成 jpush(极光)推送之 IOS 篇

[复制链接]

52

主题

528

帖子

1652

积分

金牌会员

Rank: 6Rank: 6

积分
1652
跳转到指定楼层
楼主
发表于 2015-8-6 20:34:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
极光推送官方版的 phonegap 插件在这里。由于官方版插件 ios 版暂时没有打开通知的方法,所以在官方基础上修改了下,修改后的插件放在了这里,下面说明以修改后的插件为准。(感谢极光官方大神viper耐心帮助,同时也参考了下@lanceli大神的cnodejs-ionic项目)
极光账户设置部分可以参考小和尚的这篇分享。
下面主要说明项目代码部分修改。


新建一个 ionic项目

$ ionic start --id com.ionichina.ionicjpush ionic_jpush tabs

注:修改 id 为自己应用的 Bundle identifier

添加 IOS 平台

$ cd ionic_jpush

$ ionic platform add ios

安装插件

$ ionic plugin add https://github.com/DongHongfei/jpush-phonegap-plugin.git

等待时间比较长,你也可以像小和尚文章里介绍的先下载下来,再安装,但这个过程是跑不了的

(接下来,蛋疼的事情开始了)

修改配置

    修改: ionic_jpush\plugins\cn.jpush.phonegap.JPushPlugin\src\ios\PushConfig.plist 修改对应的APP_KEY和CHANNEL(渠道)

注意

确保有如下代码,不然后面 Xcode 运行会警告:


  1. <key>APS_FOR_PRODUCTION</key>
  2. <string>0</string>
复制代码



在 js 中添加通知实现

    在 app.js 最后添加一个 push 工厂(参考了@lanceli 大神的Ccnodejs-ionic项目)


  1.   .factory('Push', function() {
  2.     var push;
  3.     return {
  4.       setBadge: function(badge) {
  5.         if (push) {
  6.           console.log('jpush: set badge', badge);
  7.           plugins.jPushPlugin.setBadge(badge);
  8.         }
  9.       },
  10.       setAlias: function(alias) {
  11.         if (push) {
  12.           console.log('jpush: set alias', alias);
  13.           plugins.jPushPlugin.setAlias(alias);
  14.         }
  15.       },
  16.       check: function() {
  17.         if (window.jpush && push) {
  18.           plugins.jPushPlugin.receiveNotificationIniOSCallback(window.jpush);
  19.           window.jpush = null;
  20.         }
  21.       },
  22.       init: function(notificationCallback) {
  23.         console.log('jpush: start init-----------------------');
  24.         push = window.plugins && window.plugins.jPushPlugin;
  25.         if (push) {
  26.           console.log('jpush: init');
  27.           plugins.jPushPlugin.init();
  28.           plugins.jPushPlugin.setDebugMode(true);
  29.           plugins.jPushPlugin.openNotificationInAndroidCallback = notificationCallback;
  30.           plugins.jPushPlugin.receiveNotificationIniOSCallback = notificationCallback;
  31.         }
  32.       }
  33.     };
  34.   });
复制代码


在 app.js 的 run 函数里定义通知回调函数

记得在 run 函数里引用 Push 先

  // push notification callback
  var notificationCallback = function(data) {
    console.log('received data :' + data);
    var notification = angular.fromJson(data);
    //app 是否处于正在运行状态
    var isActive = notification.notification;

    // here add your code


    //ios
    if (ionic.Platform.isIOS()) {
      window.alert(notification);

    } else {
    //非 ios(android)
    }
  };

在  $ionicPlatform.ready 里进行初始化


  1. //初始化
  2. Push.init(notificationCallback);
  3. //设置别名
  4. Push.setAlias("12345678");
复制代码



编译 IOS 项目


  1. $ ionic build ios
复制代码


(接下来,更蛋疼的事情开始了)
修改配置 IOS 项目(不要问我为啥)

  

  1.   修改 AppDelegate.m, 添加

  2. #import "APService.h"
  3. #import "JPushPlugin.h"  //viper

  4. didFinishLaunchingWithOptions函数中添加


  5.     // Required
  6. #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1
  7.     if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
  8.         //可以添加自定义categories
  9.         [APService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
  10.                                                        UIUserNotificationTypeSound |
  11.                                                        UIUserNotificationTypeAlert)
  12.                                            categories:nil];
  13.     } else {
  14.         //categories 必须为nil
  15.         [APService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
  16.                                                        UIRemoteNotificationTypeSound |
  17.                                                        UIRemoteNotificationTypeAlert)
  18.                                            categories:nil];
  19.     }
  20. #else
  21.     //categories 必须为nil
  22.     [APService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
  23.                                                    UIRemoteNotificationTypeSound |
  24.                                                    UIRemoteNotificationTypeAlert)
  25.                                        categories:nil];
  26. #endif
  27.     // Required
  28.     [APService setupWithOption:launchOptions];

  29. didRegisterForRemoteNotificationsWithDeviceToken中添加

  30. // Required
  31. [APService registerDeviceToken:deviceToken];
  32. [APService setDebugMode];

  33. 添加函数

  34. - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
  35.     // Required
  36.     [APService handleRemoteNotification:userInfo];
  37.     BOOL isActive;
  38.     if (application.applicationState == UIApplicationStateActive) {
  39.         isActive = TRUE;
  40.     } else {
  41.         isActive = FALSE;
  42.     }
  43.     NSDictionary *dict=[[NSMutableDictionary alloc] initWithDictionary:userInfo];
  44.    
  45.     [dict setValue: [[NSNumber alloc] initWithBool:isActive] forKey:@"isActive" ];
  46.    
  47.     [[NSNotificationCenter defaultCenter] postNotificationName:kJPushPlugReceiveNotificaiton
  48.                                                         object:dict] ;//viper
  49.    
  50.    
  51. }
复制代码

OC 代码算是完事儿,然后就是配置

    修改项目 Capabilities,打开 Background Modes,勾选最后一项Remote notications
    设置证书,这个就不教了,网上一大堆
    Xcode 这边就算配置完了


接下就是设置一些Xcode常规操作,编译运行,从极光官方控制台发送一条通知,然后查看Xcode控制台,应该就会有推送的通知数据打印了。
下面的事儿你自己应该搞的定。



实例代码放在这里了

百度网盘 下载地址:
http://yun.baidu.com/s/1gduG68V


github下载地址:
https://github.com/DongHongfei/ionic_jpush



回复

使用道具 举报

0

主题

3

帖子

14

积分

新手上路

Rank: 1

积分
14
沙发
发表于 2015-12-16 14:49:29 | 只看该作者
使用plugins.jPushPlugin.setApplicationIconBadgeNumber(0)无法消除icon上的badge,怎么解决?
回复 支持 反对

使用道具 举报

27

主题

172

帖子

597

积分

高级会员

Rank: 4

积分
597
板凳
发表于 2015-12-16 16:44:46 | 只看该作者
消息推送的时候极光后台有个参数可以设置
回复 支持 反对

使用道具 举报

0

主题

3

帖子

14

积分

新手上路

Rank: 1

积分
14
地板
发表于 2015-12-16 17:54:39 | 只看该作者
跨平台移动开发 发表于 2015-12-16 16:44
消息推送的时候极光后台有个参数可以设置

用的是+1,希望的效果是点击应用图标之后就把badge清掉,运行环境是ios平台
回复 支持 反对

使用道具 举报

0

主题

3

帖子

14

积分

新手上路

Rank: 1

积分
14
5#
发表于 2015-12-16 18:02:01 | 只看该作者
跨平台移动开发 发表于 2015-12-16 16:44
消息推送的时候极光后台有个参数可以设置

官方的插件,是可以清除的。
帖子中贴出的插件没有plugins.jPushPlugin.setApplicationIconBadgeNumber(0)这个方法,我自己在JPushPlugin.m和JPushPlugin.js中添加的方法。
目前的情况是:虽然点击了应用后,badge清除了,但是再收到推送后,badge还是累计增加。比如说badge是2,点了应用之后,图标上没有角标显示了,再收到推送后,角标会显示为3
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

ionic4视频教程

Archiver|手机版|小黑屋| PhoneGap中文网 ( 京ICP备13027796号-1 )  

GMT+8, 2024-4-20 12:05 , Processed in 0.044769 second(s), 32 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表