推送通知iOS客户端编写实现及推送服务器端编写

iOS实现服务器原生推送 iOS原生实现推送 一、iOS推送机制 Provider是给你手机应用发出推送消息的服务器,而APNS(Apple Push Notification Service)则是苹果消息推送服务器。你本地的服务器当需要给应用推送一条消息的时候,先要将消息发出到苹果推送服务器,然后再由苹果推送服务器将消息发到安装了该应用的手机。 接下来再看一张解释图: 根据上图 阅读详情

1、iOS客户端编程

推送通知技术在Mac OS X和iOS系统上都可以运行,我们本章主要介绍iOS客户端编程,推送通知的编程比较简单,编程的关键是获得令牌,这是从APNS返回的,然后还有把提交给内容提供商。下面我们看看开发之前的一些准备工作。

 

配置Xcode工程

编写iOS推送应用需要在Xcode工程中进行一些配置,这些配置是主要是设置代码签名标识,代码签名标识的前提要有配置概要文件(Provisioning Profiles)。

有了配置概要文件即可以设置代码签名标识了,需要下载概要文件到本地,代码签名标识需要选择这个配置概要文件。选择TAGETS→MyNotes→Code Signing Identity,选择你自己的代码签名标识。

20

设置完成之后可以开始编码工作了。

代码实现

推送通知的代码实现主要分为两个步骤,第一步注册接收通知,第二步接收注册结果。这些工作都是在应用程序委托对象AppDelegate中实现的。

我们先看看注册部分的代码:

  1. - (BOOL)application:(UIApplication *)application  
  2.   
  3. didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  
  4.   
  5. {  
  6.   
  7. //注册接收通知类型  
  8.   
  9. [[UIApplication sharedApplication] registerForRemoteNotificationTypes:  
  10.   
  11. (UIRemoteNotificationTypeBadge  
  12.   
  13. | UIRemoteNotificationTypeSound  
  14.   
  15. | UIRemoteNotificationTypeAlert)];  
  16.   
  17. //设置图标标记  
  18.   
  19. application.applicationIconBadgeNumber = 1;  
  20.   
  21. return YES;  
  22.   
  23. }  


 

注册过程比较长,它通过APNS从苹果公司返回,注册结束后的回调方法代码:

  1. - (void)application:(UIApplication*)application  
  2.   
  3. didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken  
  4.   
  5. {  
  6.   
  7. NSLog(@”设备令牌: %@”, deviceToken); ①  
  8.   
  9. NSString *tokeStr = [NSString stringWithFormat:@"%@",deviceToken];  ②  
  10.   
  11. if ([tokeStr length] == 0) {  
  12.   
  13. return;  
  14.   
  15. }  
  16.   
  17. NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"\<\>"];  
  18.   
  19. tokeStr = [tokeStr stringByTrimmingCharactersInSet:set];  ③  
  20.   
  21. tokeStr = [tokeStr stringByReplacingOccurrencesOfString:@" " withString:@""];  ④  
  22.   
  23. NSString *strURL = @”http://192.168.1.103/push_chat_service.php”; ⑤  
  24.   
  25. NSURL *url = [NSURL URLWithString:strURL];  
  26.   
  27. ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];  
  28.   
  29. [request setPostValue:tokeStr forKey:@"token"];  
  30.   
  31. [request setPostValue:@"98Z3R5XU29.com.51work6.PushChat" forKey:@"appid" ];  
  32.   
  33. [request setDelegate:self];  
  34.   
  35. NSLog(@”发送给服务器”);  
  36.   
  37. [request startAsynchronous];  ⑥  
  38.   
  39. }  
  40.   
  41.    
  42.   
  43. - (void)application:(UIApplication*)application  
  44.   
  45. didFailToRegisterForRemoteNotificationsWithError:(NSError*)error  
  46.   
  47. {  
  48.   
  49. NSLog(@”获得令牌失败: %@”, error);  
  50.   
  51. }  


2、推送服务端编程

内容提供者接收到设备的令牌并保存起来,在有新的内容需要推送的时候,他们将启动一个服务程序逐个设备推送他们的内容。在推送具体的过程中并非直接 由内容提供者,直接发送给用户设备,而是服务程序与APNS通讯建立信任连接,然后把数据推送给APNS,再由APNS利用安全通道推送给用户设备。

如果要编写内容提供者的推送服务程序,我们需要进行SSL认证编程,以及构建APNS数据包,数据包分为3个主要部分:Command(命令)、deviceToken(令牌)和Payload(载荷)。载荷不能超过256字节,是JSON格式,例如:

  1. {“aps” : {  
  2.   
  3. “alert” : ”You got your emails.”,  
  4.   
  5. “badge” : 9,  
  6.   
  7. “sound” : ”bingbong.aiff”  
  8.   
  9. }  
  10.   
  11. }  


作为推出服务程序可以使用很多计算机语言实现,如果从便于管理角度看,使用PHP、Java和.NET,甚至是Note.js都是可以选择的。本书重点介绍PHP和Java编写推送服务程序。

使用PHP实现推送服务

PHP是非常不错的服务器端脚本,这么多年来没有被JavaEE和.NET蚕食掉,说明它有过人之处。PHP编程简单很多人原意使用,实现本章推送服务也很简单。下面代码是实现了推送的PHP代码:

  1. <?php  
  2.   
  3.    
  4.   
  5. $deviceToken= ’1634899aef6c71ed5c0667d6658677a914c5ec3b545887e8173854970dee24db’;  
  6.   
  7. //推送方式,包含内容和声音  
  8.   
  9. $body = array(“aps” => array(“alert” => ’新年好. from PHP’,”badge” => 11,”sound”=>’default’)); ①  
  10.   
  11. //创建数据流上下文对象  
  12.   
  13. $ctx = stream_context_create();  
  14.   
  15. //设置pem格式文件  
  16.   
  17. $pem = ”apns-dev.pem”; ②  
  18.   
  19. //设置数据流上下文的本地认证证书  
  20.   
  21. stream_context_set_option($ctx,”ssl”,”local_cert”, $pem); ③  
  22.   
  23. $pass = ”51work6.com”;  
  24.   
  25. //设置数据流上下文的密码  
  26.   
  27. stream_context_set_option($ctx, ’ssl’, ’passphrase’, $pass);  ④  
  28.   
  29. //产品发布APNS服务器,gateway.push.apple.com  
  30.   
  31. //测试APNS服务器,gateway.sandbox.push.apple.com  
  32.   
  33. //socket通讯  
  34.   
  35. $fp = stream_socket_client(“ssl://gateway.sandbox.push.apple.com:2195″, $err, $errstr, 60,  
  36.   
  37. STREAM_CLIENT_CONNECT, $ctx); ⑤  
  38.   
  39. if (!$fp) {  
  40.   
  41. echo ”连接失败.”;  
  42.   
  43. return;  
  44.   
  45. }  
  46.   
  47. print ”连接OK\n”;  
  48.   
  49. //载荷信息,JSON编码  
  50.   
  51. $payload = json_encode($body); ⑥  
  52.   
  53. //构建发送的二进制信息  
  54.   
  55. $msg = chr(0) . pack(“n”,32) . pack(“H*”, str_replace(‘ ’, ”, $deviceToken))  
  56.   
  57. . ack(“n”,strlen($payload)) . $payload; ⑦  
  58.   
  59. echo ”发送消息:” . $payload .”\n”;  
  60.   
  61. fwrite($fp, $msg);  
  62.   
  63. fclose($fp);  
  64.   
  65.    
  66.   
  67. ?>  


打开终端窗口执行如下命令:

  1. $ openssl pkcs12 -in 证书.p12 -out apns-dev.pem -nodes   
  2.   
  3. Enter Import Password:  
  4.   
  5. MAC verified OK  


回车后需要输入密码,这个密码是导出“证书.p12”时候设置的密码。

PHP代码编写完成可以运行PHP了,有两种方法可以运行,一种是把这个文件放到Apache HTTP服务器目录下,并保证Apache下安装和 PHP,然后用浏览器运行,在浏览器中输入http://localhost/phpPNs/Pusher.php,这个URL是我自己 Apache HTTP服务器上的PHP文件。

21

另外一种方法,简单的多,我们不需要安装Apache HTTP服务器,只需要安装了PHP解释器就可以了,我们在终端中运行下面的指令:

$ php -f Pusher.php

连接OK

发送消息:{“aps”:{“alert”:”\u65b0\u5e74\u597d. from PHP”,”badge”:11,”sound”:”default”}}

这样就可以推送通知了,如果一切正常推送成功,用户的设备就可以接收到通知了。

使用Java推送服务

上面我们介绍了PHP实现的推送服务程序,使用其它语言编写基本的过程也一样的,这一节我们就介绍Java推送服务程序。由于具体的流程与PHP一 样,这里我们就不再自己编写Java的实现代码,而是使用别人已经封装好的javapns(http://code.google.com/p /javapns/)类库,它封装了socket实现细节问题,开发起来变的比较简单了。

下面代码是实现了推送的Java代码:

  1. package com._51work6;  
  2.   
  3.    
  4.   
  5. import javapns.Push;  
  6.   
  7. import javapns.notification.PushNotificationPayload;  
  8.   
  9.    
  10.   
  11. public class Pusher {  
  12.   
  13.    
  14.   
  15. public static void main(String[] args) {  
  16.   
  17. try {  
  18.   
  19. PushNotificationPayload payload = new PushNotificationPayload(); ①  
  20.   
  21. payload.addCustomAlertBody(“新年好!from Java”); ②  
  22.   
  23. payload.addBadge(11);  ③  
  24.   
  25. payload.addSound(“default”); ④  
  26.   
  27.    
  28.   
  29. Push.payload(payload, ”ssl/证书.p12″, ”51work6.com”, false,  
  30.   
  31. “1634899aef6c71ed5c0667d6658677a914c5ec3b545887e8173854970dee24db”); ⑤  
  32.   
  33.    
  34.   
  35. } catch (Exception e) {  
  36.   
  37. e.printStackTrace();  
  38.   
  39. }  
  40.   
  41. }  
  42.   
  43. }  


上面的代码还依赖与下面的类库:bcprov-jdk15-146.jar、JavaPNS_2.2.jar和log4j-1.2.15.jar。 其中bcprov-jdk15-146.jar和JavaPNS_2.2.jar可以在http://code.google.com/p /javapns/下载到。log4j-1.2.15.jar到http://logging.apache.org/log4j/1.2 /download.html下载。

这个Java程序的运行我们就不再介绍了,它是一个Java Application可以在有jre环境运行,我们可以把它做成JavaWeb程序,这样就可以在浏览器中发送通知了。


推送的秘钥存放位置为:

MacOS:eclipse\Eclipse.app\Contents\MacOS/

win:  tomcat/bin


2023,程序员的出路在哪里? 可是似乎从30岁开始这工资就没涨过,前面跳槽几次涨的薪水在30岁以后跳槽已经不管用了、定格了,这几年由于市场环境不景气,程序员竞争越来越激烈,36岁跟30拿的工资一模一样,不仅工资拿的一样,反而事情还越来越多了,这些都意味着什么?处理故障需要的通常不仅仅是写代码的能力,还需要对一个系统的全貌要有一定的掌握。虽然目前不少大型互联网企业都在进行结构性调整,但是从互联网行业发展的基本面来看,未来在产业互联网发展的过程中,IT行业和传统行业将会释放出大量的就业岗位,所以未来程序员的发展空间还是非常值得期待的。 阅读详情

相关推荐

华为IPD实战:从概念到发布的完整流程拆解(附各阶段关键文档模板)

本文深入拆解华为IPD(集成产品开发)从概念到发布的完整实战流程,涵盖概念、计划、开发验证及发布生命周期四大阶段。详细解析了各阶段的核心活动、关键产出与决策评审点,并提供了如《初始业务计划书》等关键文档模板框架,旨在帮助企业将IPD理论转化为可执行的操作指南,提升研发效率与产品成功率。

weixin_29212429的博客 525

java 通知 客户端_Java工程服务端实现给客户端推送消息

最近给目前做的项目添加了一个新的功能,给客户端推送消息贴上我稍微改造了一下的服务器端推送工具类/*** android单播* @param messageCenter* @param userBean* @return*/public static boolean singleAndroidPush(MessageCenter messageCenter,UserBean userBean) {b...

weixin_33171058的博客 714

避坑指南:Xilinx SelectIO IP核官方例程里那些容易忽略的细节(复位、时钟与数据回环)

本文深入解析Xilinx SelectIO IP核设计中复位策略、时钟域交互和数据回环验证三大关键领域的实战避坑技巧。针对官方例程中易被忽视的细节,如复位同步链深度、时钟相位约束和数据对齐机制,提供经过项目验证的优化方案,帮助工程师节省80%以上的调试时间。特别适用于FPGA开发中高速接口设计场景。

weixin_42561476的博客 447

系统通知功能实现

转载地址:https://github.com/lenve/vhr/wiki/33.%E7%B3%BB%E7%BB%9F%E9%80%9A%E7%9F%A5%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0 msgcontent表用来保存每一条系统通知,sysmsg表则用来记录每一个用户和每一条通知的关系,比如该用户是否阅读了该条通知。 系统通知的整个处理流程是这样的...

zhangshengqiang168的博客 4857

ESP32-P4 GPIO双域架构:HP/LP分离、寄存器级控制与低功耗工程实践

GPIO(通用输入输出)是嵌入式系统中最基础且高频使用的硬件接口,其性能、灵活性与功耗特性直接影响产品实时性与续航能力。现代高性能MCU如ESP32-P4通过HP/LP双电源域分离、可编程IO复用(IO MUX)、信号交换矩阵及硬件自动化机制(如ETM事件、Sigma-Delta调制),将传统GPIO升级为兼具模拟能力、亚微秒响应与微安级待机的智能外设子系统。其核心价值在于实现引脚功能动态重构、中断零延迟处理、Deep-sleep期间自主唤醒与多核安全操作。典型应用场景涵盖工业PLC信号采集、电池供电传感器

weixin_35949153的博客 95

动态规划法:n*m方格前进问题

在一个n*m的方格中,m为奇数,放置有n*m个数,方格中间的下方有一人,此人可按照正前方相临的五个方向(方格)前进但不能越出方格。人每走过一个方格必须取此方格中的数。要求找到一条从底到顶的路径,使其数相加之和为最大。输出和的最大值。 算法设计: 可以使用动态规划方法,从顶部开始,将第二排的每个数加上顶部第一排的最优解,将6排的问题缩小为5排的问题,然后重复该操作,直到底部最后一排,此时

Winifred_1997的博客 4675

ios 消息服务器,关于IOS APNS推送消息(iphone端+服务端)

这两天,项目要求做个推送功能,研究了一天,在此跟各位分享下。因为之前做了一年的php,所以服务端我自己写的,php语言。1:请求证书,APPID各种繁琐的操作,我就不多话了,我也是看网上例子的。http://luoyl.info/blog/2012/02/apple_push_notification_guide/iphone端的代码:#define push_server @"http://1...

weixin_39788131的博客 331

abaqus wcm插件下载_Abaqus随机短纤维增强复合材料建模插件

文末附Abaqus随机短纤维增强复合材料建模插件下载链接前言短纤维增强复合材料相对于长纤维增强复合材料来说更容易制备,且短纤维的填充性能略有改善,可制造复杂产品,广泛应用于车辆、航空航天、建筑等行业,对短纤维增强复合材料进行细观力学分析,可对其宏观力学性能进行预测、分析破坏机理等。接下来对随机短纤维增强复合材料建模插件进行介绍。NO.1 【算法简介】难点一:此插件核心在于判断生成的纤维是...

weixin_39974882的博客 2832

iOS:推送通知iOS客户端编写实现及推送服务器端编写

APNS的推送机制 首先我们看一下苹果官方给出的对ios推送机制的解释。如下图 Provider就是我们自己程序的后台服务器,APNS是Apple Push Notification Service的缩写,也就是苹果的推送服务器。 上图可以分为三个阶段: 第一阶段:应用程序的服务器端把要发送的消息、目的iPhone的标识打包,发给APNS。 第二阶段:APNS在自身...

GSNICE 760

Loki 分布式日志中心服务

分布式日志中心 Loki + Promtail + Grafana

原名又逢乱世。不要放下学习的脚步,毕竟比天天打牌、钓鱼、打游戏更能从内在充实自己。 2351

[网络安全提高篇] 一二〇.恶意软件动态分析经典沙箱Cape批量提取动态API特征

这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文详细介绍动态分析沙箱Cape的安装过程,其是一个开源的自动恶意软件分析系统,通过自动运行和分析恶意软件,全面分析和提取恶意软件的关键特征。然而,当样本数量增加时,单个样本分析会降低效率。这篇文章将讲解如何实现Cape沙箱的批量分析,通过调用Python脚本文件来实施批量处理,并将分析结果存储在指定位置,最后补充submit.py的参数及Python调用方式。基础性文章,希望对您有帮助!

杨秀璋的专栏 4120

配置iOS推送通知与推送通知iOS客户端编写实现及推送服务器端编写

1)先配置iOS推送通知:配置推送通知比较麻烦,需要iOS开发者帐号,然后配置一个Apple ID、配置概要文件和SSL证书。1 证书签名请求首先需要证书签名请求,这需要在Mac OS X系统中完成,通过在系统中选择“实用工具”→“钥匙串访问”,然后在打开菜单“钥匙串访问”→“证书助理”→“从证书颁发机构请求证书…”。选择“从证书颁发机构请求证书”菜单后会弹出证书助手对话框,...

weixin_34290352的博客 194

ADAMS软件二次开发:ADAMS软件API接口详解

API(Application Programming Interface,应用程序编程接口)是一种允许不同软件应用程序之间进行交互的接口。在ADAMS软件中,API提供了与软件内部功能直接交互的能力,使用户能够通过编写自定义代码来扩展软件的功能,实现自动化操作或集成到其他系统中。ADAMS软件的API主要基于C++和Python,允许用户通过这些编程语言来访问和控制ADAMS的模型、仿真和分析功能。API接口的使用,需要对编程语言有一定的了解,同时也需要熟悉ADAMS软件的基本操作和模型结构。

kkchenjj的博客 1861
上一篇: HelloWorld
下一篇: iOS 消息推送原理及实现总结
focusjava
博客等级 码龄14年 127粉丝 528原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值