iOS推送(利用极光推送)

2023-11-11

本文主要是基于极光推送的SDK封装的一个快速集成极光推送的类的封装(不喜勿喷) (1)首先说一下推送的一些原理:Push的原理:Push 的工作机制可以简单的概括为下图图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider。 APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。上图可以分为三个阶段。第一阶段:.net应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。 第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。 从上图我们可以看到。 1、首先是应用程序注册消息推送。 2、 IOS跟APNS Server要deviceToken。应用程序接受deviceToken。 3、应用程序将deviceToken发送给PUSH服务端程序。 4、 服务端程序向APNS服务发送消息。 5、APNS服务将消息发送给iPhone应用程序。 无论是iPhone客户端跟APNS,还是Provider和APNS都需要通过证书进行连接的。下面我介绍一下几种用到的证书。 (2)关于基于极光推送SDK类的封装 2.1 创建一个继承于NSObject的类 ,暂时命名为 MyJPush吧 在.h文件中先添加几个方法: /** 注册JPush */ +(void)registerJPush:(NSDictionary *)launchOptions; /** 添加监听者 */ +(void)addJPushListener:(id)listener; /** 移除监听者 */ +(void)removeJPushListener:(id)listener; /** 注册alias、tags */ +(void)setTags:(NSSet *)tags alias:(NSString *)alias resBlock:(void(^)(BOOL res, NSSet *tags,NSString *alias))resBlock; .m文件的实现:  需要宏定义一些变量: #define JPushAppKey @"***********" //极光推送的APPKey #define JPushChannel @"AppStore" //指明应用程序包的下载渠道 #define JPushIsProduction NO //是否是生产环境 /** 注册JPush */ +(void)registerJPush:(NSDictionary *)launchOptions{ // Required //可以添加自定义categories [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil]; // Required //如需兼容旧版本的方式,请依旧使用[JPUSHService setupWithOption:launchOptions]方式初始化和同时使用pushConfig.plist文件声明appKey等配 置内容。 [JPUSHService setupWithOption:launchOptions appKey:JPushAppKey channel:JPushChannel apsForProduction:JPushIsProduction]; } /** 添加监听者 */ +(void)addJPushListener:(id)listener{ MyJPush *jpush = [MyJPush sharedCoreJPush]; if([jpush.listenerM containsObject:listener]) return; [jpush.listenerM addObject:listener];} /** 移除监听者 */ +(void)removeJPushListener:(id)listener{ MyJPush *jpush = [MyJPush sharedCoreJPush]; if(![jpush.listenerM containsObject:listener]) return; [jpush.listenerM removeObject:listener];} -(NSMutableArray *)listenerM{ if(_listenerM==nil){ _listenerM = [NSMutableArray array]; } return _listenerM;} -(void)didReceiveRemoteNotification:(NSDictionary *)userInfo{ [self handleBadge:[userInfo[@"aps"][@"badge"] integerValue]]; if(self.listenerM.count==0) return; [self.listenerM enumerateObjectsUsingBlock:^(id listener, NSUInteger idx, BOOL *stop) { if([listener respondsToSelector:@selector(didReceiveRemoteNotification:)]) [listener didReceiveRemoteNotification:userInfo]; }];} /** 处理badge */ -(void)handleBadge:(NSInteger)badge{ NSInteger now = badge-1; [[UIApplication sharedApplication] cancelAllLocalNotifications]; [UIApplication sharedApplication].applicationIconBadgeNumber=0; [UIApplication sharedApplication].applicationIconBadgeNumber=now; [JPUSHService setBadge:now];} +(void)setTags:(NSSet *)tags alias:(NSString *)alias resBlock:(void(^)(BOOL res, NSSet *tags,NSString *alias))resBlock{ MyJPush *jpush = [MyJPush sharedCoreJPush]; [JPUSHService setTags:tags alias:alias callbackSelector:@selector(tagsAliasCallback:tags:alias:) object:jpush]; jpush.ResBlock=resBlock;} -(void)tagsAliasCallback:(int)iResCode tags:(NSSet *)tags alias:(NSString *)alias{ if(self.ResBlock != nil) self.ResBlock(iResCode==0,tags,alias);}   2.2 其次创建一个基于APPDelegate的类别文件 暂时命名为 AppDelegate+JPush   实现下列几个方法: - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { // Required [JPUSHService registerDeviceToken:deviceToken];} - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { // Required,For systems with less than or equal to iOS6 [JPUSHService handleRemoteNotification:userInfo];} - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { // IOS 7 Support Required [JPUSHService handleRemoteNotification:userInfo]; completionHandler(UIBackgroundFetchResultNewData); CoreJPush *jpush = [CoreJPush sharedCoreJPush]; [jpush didReceiveRemoteNotification:userInfo];} 这两个文件可以直接拿到自己的项目中使用,然后在项目中添加以下需要依赖的库.CFNetwork.framework.CoreFoundation.framework.CoreTelephony.framework.SystemConfiguration.framework.Security.framework. libz.tbd 第二步进行项目配置:. (1) Search Paths 下的 User Header Search Paths 和 Library Search Paths为`$(PROJECT_DIR)/CoreJPush/CoreJPush/Lib`。. (2) 选中Project-Target-Capabilities-Background Modes,勾选Remote Notifications。. (3) 请修改CoreJPush框架内Common文件夹下PushConfig.plist的Appkey为您的Appkey。. (4) 如果你的工程需要支持小于7.0的iOS系统,请到Build Settings 关闭 bitCode 选项,否则将无法正常编译通过。. (5)允许XCode7支持Http传输方法 如果用的是Xcode7时,需要在App项目的plist手动加入以下key和值以支持http传输: NSAppTransportSecurity NSAllowsArbitraryLoads 最重要的一步: 1.注册JPush 请删除您的AppDelgate中所有有关推送的方法,因为CoreJPush内部已经封装。 #import "MyJPush.h" //注册JPush [MyJPush registerJPush:launchOptions]; 2.在您任意想得到推送数据的地方,三句代码搞定: //1.添加一个监听者:此监听者是遵循了CoreJPushProtocol协议 [MyJPush addJPushListener:self]; //2.你需要在合适的地方(比如dealloc),移除监听者 [MyJPush removeJPushListener:self]; //3.您已经遵循了MyJPushProtocol协议,直接在.m文件里面敲did ,Xcode会提示你如下方法: -(void)didReceiveRemoteNotification:(NSDictionary *)userInfo{ NSLog(@"ViewController: %@",userInfo); } #pragma mark - 在极光推送网站发送消息,带参数,手机接收到消息后进行一系列操作 //获取推送的信息(包括推送时添加的key和value,通过key获取value的值) -(void)didReceiveRemoteNotification:(NSDictionary *)userInfo{ NSLog(@"controller: %@",userInfo); if ([userInfo.allKeys containsObject :@"key"]) { //这里的key是自己在极光推送的平台上发送通知时自己创建的key和value NSLog(@"发送通知成功,开始跳转"); WebViewController *webVc = [[WebViewController alloc]init]; webVc.UrlString = userInfo[@"key"]; [self.navigationController pushViewController:webVc animated:YES]; }} 别的一些操作查看极光推送的文档就可以了,封装两个文件是为了以后配置和使用的时候更加方便,还有比较简单的证书的配置啊什么的就不再多说了,网上以及极光推送官网的文档中有很明确的说明,此处需要使用的是极光推送 jpush-ios-2.1.5以后的版本 有需要或者指正的小伙伴可以给我留言哦!如需源码,可留言单独赠送
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS推送(利用极光推送) 的相关文章

  • 如何向标准 UIButton 添加徽章? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否可以在标准中添加看起来标准的徽章UIButton 如果不支持半原生 那么实现此目的最简单的方法是什么 示例图片 这是 Sascha
  • 访问目标 c 中的类方法。使用 self 还是类名?

    我正在学习 iOS 编程 并且对以下有关关键字 self 的使用的代码感到困惑 据我了解 self就像Java的this 它指的是当前实例 当我想调用类方法时 通常的方式应该是这样 PlayingCard validSuits 但是侵入实例
  • 如何在代码中编辑约束

    我有一个以 100 开始宽度限制的网页 当用户单击按钮时 我想将约束更改为 200 我试过这个 NSLayoutConstraint constrain NSLayoutConstraint constraintWithItem self
  • TableViewController 的 viewDidLoad 未触发

    我一直在关注这个tutorial http www appcoda com ios programming sidebar navigation menu 有一个滑出式菜单 我添加了一个 TableViewController 它将显示文章
  • 使用 MapKit 的地形和卫星视图

    我是 Mapkit View 的新手 当我给出没有目的地的纬度和经度时 我想显示 MapKit中是否可以通过地形 卫星视图来显示地图 有教程链接吗 我看过一些访问 Google 地图 API html 文件 的示例 有必要吗 或者您可以通过
  • 是否可以跨 2 个不同的 iOS 应用程序访问数据?

    假设我在 App1 中存储了一些 ID 数据 并希望在同一设备上的 App2 中访问它 平台上可以这样吗 如果没有的话有什么解决方法吗 您可以使用iOS 钥匙扣 http developer apple com library ios do
  • iOS - UIBarButtonItem - 后退按钮标题垂直位置不调整

    我正在设置自定义字体UIBarButtonItem对象使用UIAppearance 这工作正常并正确设置字体 但是 我确实需要调整按钮标题的垂直位置以适应新字体的大小 UIBarButtonItem appearance setTitleT
  • ios如何搜索目录

    我想知道如何检查我的应用程序中是否存在目录 例如 如果我想搜索我的应用程序文档中是否存在文件夹 以及如何在其中创建新文件夹 此致 检查文件是否存在 BOOL fileExistsAtAbsolutePath NSString filenam
  • 如何在气隙 Mac 上安装新的 Apple 全球开发者关系中级证书?

    您可能知道也可能不知道 现在使用新的中间证书生成新的签名证书 你可以在这里读到它 https developer apple com support wwdr intermediate certificate https developer
  • HttpClient setReachabilityStatusChangedBlock 声明没有接口

    尝试使用 AFNetworkings ReachabilityStatusChanged 但得到 HTTPCLIENT 没有可见的 interface 声明选择器 setReachabilityStatusChangeBlock 但Http
  • UICollectionViewFlowLayout 使其布局无效后重绘单元格

    当您使布局无效时UICollectionViewFlowLayout它为每个单元格创建了一堆新的布局属性 然而 它不会告诉您的单元格重新绘制 这会导致任何图层绘图变形 我不想告诉我的集合重新加载其数据 因为这会删除流属性之间的任何良好转换
  • 尽早检测有问题的 XIB 视图

    我的笔尖名称有一个拼写错误 当我推向导航控制器时 它在代码中被破坏了 弄清楚它并没有花太长时间 但我认为最好尽早断言格式良好 以便更容易弄清楚 问题是它不是零 它只是无法从笔尖正确地形成自己 在 initWithNib 之后是否有更好的断言
  • ios GPUImage,小尺寸图像处理效果不好?

    我正在尝试为 OCR 准备图像 我使用 GPUImage 来完成 代码工作正常 直到我裁剪图像 裁剪后我得到了糟糕的结果 作物面积 https www dropbox com s e3mlp25sl6m55yk IMG 0709 PNG h
  • 从应用程序打开/关闭 iPhone 的 Wifi

    我需要打开或关闭 iPhone 中的 wifi 有什么方法可以做到吗 还是被禁止了 私有框架 所有使用公共 SDK 编写的应用程序都经过沙箱处理 他们只能访问苹果认为可以在该沙箱中使用的属性和数据 恐怕 Wi fi 不在列表中 请看一下这个
  • -[_SwiftValueencodeWithCoder:]:无法识别的选择器发送到实例

    尝试使用 NSCoder 时出现错误 玩家 swift class Player NSObject NSCoding private var playerName String private var playerScore Int pri
  • FIRApp 链接器错误 [“_OBJC_CLASS_$_FIRApp”]

    我已经搜索过 SO 和 Google 但找不到有效的答案 我已经在多个项目中使用了新的 Firebase Cocoapod 但是现在 当将其添加到不同的项目时 我收到以下错误 我正在使用 Xcode 7 3 1 和 cocoapods 1
  • 辅助功能标识符在 iOS 模拟器的辅助功能检查器中不可见

    我想使用辅助功能检查器来验证在模拟器 iOS 9 2 中运行的应用程序中的所有辅助功能标识符 辅助功能检查器能够返回多个辅助功能字段 但不能返回标识符 知道为什么以及如何我能看到它们吗 实际上有一种方法 克里斯 普林斯 Chris Prin
  • iOS 版 Google 地图 sdk 中折线的轮廓

    我的要求是在地图上显示一条绿色折线 但当地图切换到卫星视图时 绿色折线变得不清楚 我无法改变折线的颜色 因此 为了将折线与背景 地图的卫星视图 区分开来 我需要为折线绘制白色轮廓 我浏览了 GMSPolyline 类的文档 但找不到任何可以
  • iOS 上的推送通知渐进式 Web 应用程序

    我需要开发一个集成了推送通知的渐进式网络应用程序 在网上搜索我发现了关于这个主题的不同意见 如果我理解正确的话 目前我们无法在移动版 safari 中推送通知 但仅限桌面版 这样对吗 你有什么建议来获得相同的结果吗 我不是iOS专家 我想知
  • Objective-C 中 NSURL 为 null 而 NSString 是正确的

    我有一个NSString包含一个 url 以及当我分配时NSURL与NSString NSURL 输出 空 这是因为url中有一些非法字符 导致NSURL不编码就无法读取NSString包含网址 NSString u incomingUrl

随机推荐

  • 图形学光照

    图形学光照 一 概述 二 环境光照 三 漫反射光照 四 镜面光照 五 光照公式 六 Demo 一 概述 现实世界的光照是极其复杂的 而且会受到诸多因素的影响 这是我们有限的计算能力所无法模拟的 因此OpenGL的光照使用的是简化的模型 对现
  • MES系统 PHP常见技术

    1 刚开始接触Web需要练习以下知识 编辑表格 修改 删查 https www cnblogs com yuyu1993 p 5598797 html 流程审批 https www cnblogs com ping04 p 7927468
  • 【程序员面试金典】请编写一个方法,返回某集合的所有非空子集。

    题目描述 请编写一个方法 返回某集合的所有非空子集 给定一个int数组A和数组的大小int n 请返回A的所有非空子集 保证A的元素个数小于等于20 且元素互异 各子集内部从大到小排序 子集之间字典逆序排序 见样例 测试样例 123 456
  • 以太坊eip150和eip158

    以太坊网络将在区块号到达2463000时进行一次硬分叉 具体分叉时间将会在中国时间2016年10月18日晚8 9点 可以在 https fork codetract io 看到本次分叉的倒计时网页 作为一个用户 我需要做些什么 下载最新版本
  • 在visio中插入数学公式

    前提 安装 visio 2013 Mathtype 依次点击 插入 对象 弹出对话框 插入对象 在弹出的对话框内点击 Microsoft 公式 3 0 点击 确定 弹出 Mathtype 编辑界面 即可插入公式
  • C#基础知识

    主要用于只是巩固和新接触的人使用 一 什么是C C 是有C C 衍生出来的一种面向对象编程语言 是一种安全的 稳定的 简单的 优雅的一种语言 他是运行于 Net Franmework智商的高级程序设计语言 二 C 第一个程序 Hellow
  • Java复习:IO流

    File类的使用 IO流原理及流的分类 1 I O是Input Output的缩写 I O技术是非常实用的技术 用于 处理设备之间的数据传输 如读 写文件 网络通讯等 2 Java程序中 对于数据的输入 输出操作以 流 stream 的 方
  • FastDFS,Redis,Solr,ActiveMQ核心技术整合四

    02 商品分类选择 分析 前端js 03 商品分类选择 分析 数据库 JJTree渲染过程解析 parent id为0就是父节点 is parent为1说明下面有子节点 state1正常2删除 tree组件有ztree 异步控件树每个节点都
  • sklearn - 岭回归(Ridge)和套索回归(Lasso)

    一 拟合 一 过拟合与欠拟合 机器学习中一个重要的话题便是模型的泛化能力 泛化能力强的模型才是好模型 对于训练好的模型 若在训练集表现差 不必说在测试集表现同样会很差 这可能是欠拟合导致 若模型在训练集表现非常好 却在测试集上差强人意 则这
  • Qt常用控件、警告与问题总结

    Qt Creator 转 Visual Studio Qt Creator转Visual Studio 在pro文件所在文件夹 打开cmd qmake tp vc x Visual Studio转Qt Creator Qt VS Tools
  • Springboot @Lazy注解

    作者 小猿聊编程 更多资料 https www techlearn cn 作用 Lazy可以实现bean的延迟初始化 在spring容器启动时不初始化Bean 直到用到这个Bean的时候才去初始化 使用范围 任意类型 方法 构造器 参数 字
  • Unity 检测物体是否在屏幕内

  • sql查询无结果设置默认值

    笔记 最近SQL直挂图表数据显示无内容 看了下数据库发现表里没数据 三方图表默认显示文字 但是需求想显示结果0 所以要想办法把无结果得数据默认给一个默认值 查询字段通常分为 null两种 前提是有结果 但是字段可能没数据 用case whe
  • Eclipse Svn插件各个版本以及对应Svn Connector的下载地址

    Eclipse Svn插件各个版本以及对应Svn Connector的下载地址 http www polarion com products svn subversive download php 可供大家把包下载然后在Eclipse里面进
  • linux内核新版gpio配置

    新版gpio操作
  • 2019年第十届蓝桥杯真题解析

    难度 难 算法 二分法 问题描述 小明公司的办公区有一条长长的走廊 由 N 个方格区域组成 如下图所示 走廊内部署了 K 台扫地机器人 其中第 i 台在第 Ai 个方格区域中 已知扫地机器人每分钟可以移动到左右相邻的方格中 并将该区域清扫干
  • 一键清空朋友圈软件_微信清理朋友圈app下载-微信清理朋友圈下载v1.8.0 安卓版-西西软件下载...

    微信清理朋友圈app一款强大的微信清理工具 当你想要重置自己的微信号并删除所有的内容之时 又觉得一条条删太麻烦了 就可以用到这款神器工具 可以帮助你一键删除掉朋友圈内的所有内容 帮助你轻松的重置微信号 十分的方便 赶快下载微信清理朋友圈ap
  • CentOS系统性能工具 sar 示例!

    安装配置 Sysstat 安装 Sysstat 包 Ubuntu sudo apt get install sysstat CentOS yum install sysstat CentOS rpm ivh sysstat 10 0 0 1
  • 使用FFmpeg进行屏幕录像和录音

    有些时候我们需要对屏幕进行录制 比如制作视频教程 录制直播等 然而这方面的软件多是收费的 即使是免费试用版的还有水印 特别烦人 下面介绍使用FFmpeg进行屏幕录制的方法 Windows 先安装dshow软件 Screen Capturer
  • iOS推送(利用极光推送)

    本文主要是基于极光推送的SDK封装的一个快速集成极光推送的类的封装 不喜勿喷 1 首先说一下推送的一些原理 Push的原理 Push 的工作机制可以简单的概括为下图图中 Provider是指某个iPhone软件的Push服务器 这篇文章我将