APNS推送通知的流程

2023-11-03

http://www.cnblogs.com/chen1987lei/archive/2011/05/09/2041090.html

1. 将app注册notification里面, 并从APNS上获取测试机的deviceToken.    

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {        
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];  
        // other codes here.    
    return YES;
}
 
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSLog(@"deviceToken: %@", deviceToken);
}
 
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    NSLog(@"Error in registration. Error: %@", error);
}
 
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    
    NSLog(@" 收到推送消息 : %@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]);
    if ([[userInfo objectForKey:@"aps"] objectForKey:@"alert"]!=NULL) {
        UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"推送通知"
                                                        message:[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]
                                                       delegate:self
                                              cancelButtonTitle:@" 关闭"
                                              otherButtonTitles:@" 更新状态",nil];
        [alert show];
        [alert release];
    }
}


启动程序,将app注册到通知项后,在console里面找到打印的deviceToken:
deviceToken: <6974ac11 870e09fa 00e2238e 8cfafc7d 2052e342 182f5b57 fabca445 42b72e1b>

2. 生成app在服务端需要的许可证
1)进入Provisioning Portal, 下载Certificates在development下的证书。 
2) 找到需要测试的app id,然后enable它在development下的Apple Push Notification service: Development Push SSL Certificate。需要输入1)中的签名证书才可以生成一个aps_developer_identity.cer.
3) 双击aps_developer_identity.cer,会打开系统的key chain. 在My certificates下找到Apple Development Push Services。需要为certificate和它之下的private key各自export出一个.p12文件。(会出现设置密码过程)
4)需要将上面的2个.p12文件转成.pem格式:
  1. openssl pkcs12 -clcerts -nokeys -out cert.pem -in cert.p12

  1. openssl pkcs12 -nocerts -out key.pem -in key.p12

5)如果需要对 key不进行加密:
  
  1. openssl rsa -in key.pem -out key.unencrypted.pem

6)然后就可以 合并两个.pem文件, 这个ck.pem就是服务端需要的证书了。
  
  1. cat cert.pem key.unencrypted.pem > ck.pem


3. 服务端push通知到ANPS. 在cocoachina找到了两种方法:
  1)php驱动。需要将ck.pem和php脚本放到server 上。全部的php代码是:
   
<?php  
$deviceToken = '6974ac11 870e09fa 00e2238e 8cfafc7d 2052e342 182f5b57 fabca445 42b72e1b';  
$pass = '123456';   // Passphrase for the private key (ck.pem file)  

// Get the parameters from http get or from command line  
$message = $_GET['message'] or $message = $argv[1] or $message = 'A test message from worldcup';  
$badge = (int)$_GET['badge'] or $badge = (int)$argv[2];  
$sound = $_GET['sound'] or $sound = $argv[3];  

// Construct the notification payload  
$body = array();  
$body['aps'] = array('alert' => $message);  
if ($badge)  
$body['aps']['badge'] = $badge;  
if ($sound)  
$body['aps']['sound'] = $sound;  

/* End of Configurable Items */  
$ctx = stream_context_create();  
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');    
// assume the private key passphase was removed.  
stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);  

// connect to apns  
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);  
if (!$fp) {  
print "Failed to connect $err $errstr\n";  
return;  
}  
else {  
print "Connection OK\n<br/>";  
}  

// send message  
$payload = json_encode($body);  
//$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;  
$msg = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload;
print "Sending message :" . $payload . "\n";    
fwrite($fp, $msg);  
fclose($fp);  
?>  


请 求一次 http://127.0.0.1/apns/apns.php?message=A%20test%20message%20from%20localhost&badge=2&sound=received5.caf就 会向APNS进行一次推送。我的请求结果如下:
  1. Connection OK
  2. Sending message :{"aps":{"alert":"A test message from localhost","badge":2,"sound":"received5.caf"}}


  2)pushMeBaby 驱动。将aps_developer_identity.cer导入到project里面,改名为apns.cer。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

APNS推送通知的流程 的相关文章

随机推荐

  • 【深度学习】_amax() got an unexpected keyword argument ‘dim‘ 解决方案

    在定义一个点云数据pc后 想使用pc max dim 0 然后出现了 amax got an unexpected keyword argument dim 这个是因为对于tensor类型的数据和ndarray类型的数据都有一个max mi
  • 彻底搞懂字符编码ASCII,GB2312,UNICODE,UTF-8

    文章目录 基础 什么是字符编码 正文 ASCII ASCII扩展码 GB2312 GBK DBCS UNICODE UTF 8 UTF 16 USC 2 UTF 32 USC 4 编程语言对字符编码的支持 阅读了一篇关于编码的博客 点击打开
  • Matlab实现PSO算法(附上10个完整仿真源码)

    PSO Particle Swarm Optimization 是一种优化算法 它模拟了鸟群或鱼群等动物的集体行为 通过群体智能的方式来解决优化问题 PSO算法最初由Kennedy和Eberhart在1995年提出 近年来得到了广泛的应用
  • 区块链上的订阅

    为分散式应用程式 以太坊 实施订阅模型 Luca Bravo在Unsplash上拍摄的背景照片 以太坊徽标 火种金标志 介绍 您可能已经听说过 去中心化的应用程序将成为互联网的未来 为了使这个分散的生态系统蓬勃发展并可持续发展 我们将需要许
  • 人工智能数学基础---定积分2:定积分的性质

    一 引言 在 人工智能数学基础 定积分1 定积分的概念以及近似计算 介绍了定积分的概念 几何意义 用定义来求定积分的案例以及使用矩形法 梯形法和抛物线法求定积分近似值的方法和案例等基础知识 根据上文的介绍 结合相关知识补充如下2条规则 可以
  • #pragma once 与#ifndef 的区别解析

    原文地址 http blog csdn net hkx1n article details 4313303 作用 为了避免同一个文件被include多次 C C 中有两种方式 一种是 ifndef方式 一种是 pragma once方式 在
  • linux 查看文件的inode使用情况

    linux 查看文件的inode使用情况 查看文件的空间使用情况 root racdb01 df h Filesystem Size Used Avail Use Mounted on dev mapper vg lgoracle lv r
  • Hutool工具BeanUtil.copyProperties实现自定义类型转换器之字符串转时间格式化

    hutool工具BeanUtil copyProperties在字符串转LocalDateTime时默认用的格式为yyyy MM ddTHH mm ss 所以需要自定义转换器才行 在转换时会优先使用自定义的 在项目启动时执行一次此段代码即可
  • Vue-cli 与Vite 环境搭建与项目构建

    Vue cli 与Vite 环境搭建与项目构建 在之前的语法演示中 我们直接使用 script 引入 Vue 3 从而在浏览器里实现了所有调试功能 但是在实际的项目中 我们会使用专门的调试工具 在项目上线之前 代码也需要打包压缩 并且考虑到
  • $.extend插件的开发与代码的编写

    extend插件的开发与代码的编写 extend item 该方法是将item合并到Jquery的全局对象中去 相当于为Jquery全局对象添加了一个静态方法 extend SayHello function value alert hel
  • Golang(Go语言)内置函数之append

    append主要用于给某个切片 slice 追加元素 如果该切片存储空间 cap 足够 就直接追加 长度 len 变长 如果空间不足 就会重新开辟内存 并将之前的元素和新的元素一同拷贝进去 第一个参数为切片 后面是该切片存储元素类型的可变参
  • TCP超时编程

    2018 2 12http blog csdn net NK test article details 49050379 这个是超时相关的设置 不过比较麻烦的就是 还有很多错误的设置比较难 C的却是太底层的底层的东西 http blog c
  • gcc 编译小笔记

    最近在测试编译个程序的时候发现无论如何都没法正常编译 命令行是这样的 gcc I include L lib lVU lfftw3f lvsip lfftw lfftw3f lrfftw conv1dEx c 一直报链接错误 但是库文件名字
  • python数据库框架_Python六大框架对比,Web2py略胜一筹

    Python是一门动态 面向对象语言 其最初就是作为一门面向对象语言设计的 并且在后期又加入了一些更高级的特性 除了语言本身的设计目的之外 Python标准库也是值得大家称赞的 Python甚至还自带服务器 其它方面 Python拥有足够多
  • Windows平台实现Unity下窗体

    技术背景 随着Unity3D的应用范围越来越广 越来越多的行业开始基于Unity3D开发产品 如传统行业中虚拟仿真教育 航空工业 室内设计 城市规划 工业仿真等领域 基于此 好多开发者苦于在Unity环境下 没有低延迟的推拉流解决方案 前几
  • md5 collision(md5碰撞)

    题目来源 南京邮电大学网络攻防训练平台 Web题 md5 collision 解题过程 点开题目标题 呈现在眼前的是一段php代码 代码如下 md51 md5 QNKCDZO a GET a md52 md5 a if isset a if
  • 医学院校计算机专业课程设计题目

    1 医院药库管理系统的设计与实现 2 医院用小型药品不良反应监测系统 3 中医院门诊预约系统的设计与实现 4 网上预约挂号系统的设计 5 医院药房管理系统的设计 6 医院病房管理系统的设计与实现 7 医院门诊划价收费系统 8 医院交流平台的
  • oracle PL/SQL小结

    PL SQL 代码块 DECLARE optional BEGIN required EXCEPTION optional END required 若使用dbms output输出时 先要设置 set serveroutput on 显示
  • SQL-labs的第27a关——union和select被屏蔽 延时盲注(Get)

    注意 该关无法返回错误 所以不适合报错注入 一 判断闭合方式 输入语句 id 1 26 26 1 2 00 返回页面如下 输入语句 id 1 26 26 1 1 00 返回页面如下 将双引号作为闭合方式 各个语句反应正常 可以确定双引号就是
  • APNS推送通知的流程

    http www cnblogs com chen1987lei archive 2011 05 09 2041090 html 1 将app注册notification里面 并从APNS上获取测试机的deviceToken BOOL ap