IOS推送总结

2023-11-02

此文主要以证书生成配置为主,实现简单推送,部分截图与内容来自于互联网,若对大家有所帮助,还请给个赞O(∩_∩)O~~。如有误,请指出,一起探讨。

一、 推送原理


Provider是指某个iPhone软件的Push服务器。APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。上图可以分为三个阶段。
* 第一阶段:Push服务器应用程序把要发送的消息、目的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都需要通过证书进行连接的。

二、 证书的创建

1. 创建本地请求证书文件–CertificateSigningRequest
  • 钥匙串访问 –> 证书助理 –> 从证书颁发机构请求证书;
  • 填写邮箱和名称(可以随意填写) –> 存储到磁盘
  • 选择继续-保存至桌面即可(此文件可长期重复使用,只作为本机器的一个识别作用)
2. 进入苹果开发者网站,生成证书以及profiles

依次选择Member Center - Certificates, Identifiers &Profiles - Certificates
C95BD68F-E6FA-49F4-8ECB-C72902F41D4D.png
选择当前要设置通知的APP IDs
这里我以新建一个APP IDs为例,若公司已有项目APP IDs,则略过此步
选择右上角”+”号创建一个APPID
填写name以及Bundle ID
A93F9CAF-20CA-47B8-8DA2-B46AF441C089.png
Bundle ID需要与Xcode里项目Bundle ID一致
6F810F29-E7DF-4190-A069-457036873A10.png
勾选push notification 并完成提交
找到刚创建好的APP IDs,可以看到下面的通知选项处提示Configurable,表示证书还没配置,点击Edit进行编辑
这里看到推送证书分为2个版本,一个开发模式,一个生产模式,即我们在开发测试时使用开发模式证书,发布上线后采用生产模式证书,两个都要创建(本次只作开发模式演示,当然创建生产版证书的步骤也是一样的)
Choose File选择最开始创建在桌面的Request文件
1F5ABE01-3DD1-487D-B7D4-8470FE2FD686.png
创建证书OK后 下载到本地
86A5F026-7B97-41C4-A6BB-C3D7341D8A23.png
开发版和生产版证书都创建好后,此时这里已经都是启用状态了。
生成XCODE使用的provisioning文件,该文件用于真机调试:
0D1B1B3A-FAB6-47BD-A721-C391CC63F0F8.png
生成过程:
进入developer.apple.com,选择member center - Certificates, Identifiers & Profiles - Provisioning Profiles,然后选择创建Provisioning file,接着选择iOS App Development ,下一步选择AppId,选中之前建立的支持push的appid,接着下一步选择支持push的certificate,下一步勾选需要支持的device id,最后一步设置provisioning文件的文件名,这样provisioning文件就生成了。

3. 生成服务端使用的证书文件
  • 首先双击前面保存的cer文件,此时会打开“钥匙串访问”软件,里面会出现一个Apple Development IOS push services证书,一个公用密钥和一个专用秘钥,秘钥的名称与证书助理中填写的名称一致。
  • 选中证书,导出为 apns-dev-cert-development.p12 文件
  • 选中专有秘钥,导出为apns-dev-key-development.p12文件
  • 通过终端命令将这些文件转换为PEM格式:
  • 设置密码,建议所有都为一个密码

    openssl pkcs12 -clcerts -nokeys -out apns-dev-cert-development.pem -in apns-dev-cert-development.p12
    openssl pkcs12 -nocerts -out apns-dev-key-development.pem -in apns-dev-key-development.p12
  • 最后, 需要将两个pem文件合并成一个apns-dev.pem文件,此文件在连接到APNS时需要使用:
    “`
    cat apns-dev-cert-development.pem apns-dev-key-noenc-development.pem > apns-dev-development.pem

####4. 测试证书
执行下面命令:

telnet gateway.sandbox.push.apple.com 2195(apns的测试环境)
telnet gateway.push.apple.com 2195(apns的正式环境)

它将尝试发送一个规则的,不加密的连接到APNS。如果你看到下面的反馈,那说明你的MAC能够到达APNS。按下Ctrl+C关闭连接。如果得到一个错误信息,那么你需要确保你的防火墙允许2195端口,一般这里都不会出现什么问题。
![终端显示](http://upload-images.jianshu.io/upload_images/1085368-a72adc48d5be13db.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
下面我们使用生成的SSL证书和私钥来设置一个安全的链接去链接苹果服务器,执行命令如下:

openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert apns-dev-cert-development.pem -key apns-dev-key-development.pem
“`
执行之后需要输入密码,就是上面我们设置的密码即可。
如果链接是成功的,你可以随便输入一个字符,按下回车,服务器就会断开链接,如果建立连接时有问题,OpenSSL会给你返回一个错误信息。
输出结果如下,则说明是正确链接了,把上述合并的apns-dev-development.pem给服务端使用。
ECCD5164-A95C-4777-A7CF-EA60D6D73398.png

如果有错误,请检查是否导出正确的推送证书。

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

IOS推送总结 的相关文章

  • UIViewControllerAnimatedTransitioning:旋转更改后黑屏片段

    我已经创建了一个视图控制器转换 只要我不更改设备方向 一切都正常 图 1 显示了应有的屏幕 然后我切换到下一个视图控制器 在其中更改方向 现在我回到第一个视图控制器并再次切换方向 然后我得到的结果如图 2 所示 出现黑色边框 请不要介意屏幕
  • 在 UIWebView 中播放 Facebook 视频

    有谁知道如何在 Facebook 上播放视频UIWebView 我的应用程序将视频上 传到 Facebook 并检索视频的网址 我想将此网址嵌入到UIWebView播放 我已经为 youtube 解决了这个问题 但没有为 Facebook
  • iOS:如何知道 reloadData() 已完成其任务?

    我想滚动到给定索引 self boldRowPath 但是当我调试时scrollToRow之前执行reloadData 如何知道reloadData已完成 func getAllTimeEvent self arrAllTimeEvent
  • 如何在 UICollectionView 中将行居中?

    我有一个UICollectionView与随机细胞 有什么方法可以让我将行居中吗 默认情况下它是这样的 x x x x x x x x x x x x x x 这是所需的布局 x x x x x x x x x x x x 我必须做这样的事
  • 像 TraceGL 一样分析 Objective C 中的代码路径?

    TraceGL 是一个非常简洁的项目 它允许 JS 程序员跟踪 Javascript 中的代码路径 它看起来像这样 我想为 Objective C 构建类似的东西 我知道运行时使跟踪方法调用变得相当容易 但是我如何跟踪控制流 例如 在上面的
  • 更改 NSMutableAttributedString 中链接的颜色

    我有以下代码 但我的链接始终是蓝色的 我如何改变它们的颜色 string addAttribute NSLinkAttributeName value tag range NSMakeRange position length string
  • 如何在 Swift 中“生成”闭包类型别名?

    为了使我的代码更易于阅读 我在 Swift 中对各种类型的闭包使用类型别名 我有以下基本的闭包集 public typealias FailureClosure error NSError gt Void public typealias
  • Swift - 我可能已经删除了 Apple Swift Packages 集合

    我对 swift 和 XCode 很陌生 昨天我正在开发一个项目 想尝试一下某人制作的自定义日期选择器 所以我转到 添加包 并粘贴 GitHub 链接并添加它 我已经在我的项目中添加了一个名为 KeychainAccess 的不同包 方式
  • iOS - UIBarButtonItem - 后退按钮标题垂直位置不调整

    我正在设置自定义字体UIBarButtonItem对象使用UIAppearance 这工作正常并正确设置字体 但是 我确实需要调整按钮标题的垂直位置以适应新字体的大小 UIBarButtonItem appearance setTitleT
  • 如何在气隙 Mac 上安装新的 Apple 全球开发者关系中级证书?

    您可能知道也可能不知道 现在使用新的中间证书生成新的签名证书 你可以在这里读到它 https developer apple com support wwdr intermediate certificate https developer
  • 如何在ios开发中从mp3文件中提取元数据

    我正在开发一个带有云存储的 ios 音乐播放器 我需要提取音乐信息 如标题 艺术家 艺术作品 我有一个名为 playit 的操作 可以播放和暂停 mp3 文件 它还应该使用与 mp3 文件关联的元数据来填充一些 UILables 和 UII
  • 为什么我需要 2 个或更多核心数据模型?

    我很想知道谁使用多个核心数据模型以及为什么 有什么好处 我正在开发一个应用程序 我认为我可以从多个模型中受益 但我不确定其他好处 我即将推出的应用程序将适用于 iPad 和 iPhone 的另一个版本 iPad 有 3 个主要内容 iPho
  • HttpClient setReachabilityStatusChangedBlock 声明没有接口

    尝试使用 AFNetworkings ReachabilityStatusChanged 但得到 HTTPCLIENT 没有可见的 interface 声明选择器 setReachabilityStatusChangeBlock 但Http
  • 强制本地化图像或图像资产

    正如在这个问题中 如何强制 NSLocalizedString 使用特定语言 https stackoverflow com questions 1669645 how to force nslocalizedstring to use a
  • UICollectionViewFlowLayout 使其布局无效后重绘单元格

    当您使布局无效时UICollectionViewFlowLayout它为每个单元格创建了一堆新的布局属性 然而 它不会告诉您的单元格重新绘制 这会导致任何图层绘图变形 我不想告诉我的集合重新加载其数据 因为这会删除流属性之间的任何良好转换
  • Swift 字典映射 - 闭包中的 init

    我有 Swift 字典 private var params String AnyObject 这包含查询项目 例如 lat 40 lon 100 我想将这本词典映射到NSURLQueryItem大批 我想让它 迅速 params map
  • 在 Swift 中计算两个 CLLocation 点之间的方位角 [重复]

    这个问题在这里已经有答案了 我正在尝试计算仅 swift 代码中两个 CLLocation 点之间的方位 我遇到了一些困难 并假设这是一个非常简单的函数 堆栈溢出似乎没有列出任何内容 func d2r degrees Double gt D
  • iOS 版 Google 地图 sdk 中折线的轮廓

    我的要求是在地图上显示一条绿色折线 但当地图切换到卫星视图时 绿色折线变得不清楚 我无法改变折线的颜色 因此 为了将折线与背景 地图的卫星视图 区分开来 我需要为折线绘制白色轮廓 我浏览了 GMSPolyline 类的文档 但找不到任何可以
  • 如何从 App Store Connect 中删除自动创建的 macOS 应用程序

    I have an iOS app Recently macOS app automatically appeared in App Store Connect 我不打算在 macOS 上发布 iOS 应用程序 我怎样才能摆脱它 我打开了
  • Xcode 中的 Prefix.pch 文件是什么?

    许多开发人员正在向其中添加各种方便的宏Prefix pch 但我的问题是那是什么Prefix pch file 如果我删除它Prefix pch来自我的文件Xcode 那么我的应用程序会运行吗 或者会显示什么错误吗 或者它会在构建过程中崩溃

随机推荐

  • Android 大图显示优化方案-加载Gif 自定义解码器

    基于Glide做了图片显示的优化 尤其是加载Gif图的优化 原生Glide加载Gif图性能较低 在原生基础上做了自定义解码器的优化 提升Glide性能 Glide加载大图和Gif 尤其是列表存在gif时 会有明显卡顿 cpu和内存占用较高
  • JS中版本号的比较(AI)

    在 JavaScript 中 您可以使用字符串比较算法比较版本号 版本号通常采用 x y z 格式 其中 x y 和 z 均为数字 表示主版本号 次版本号和修订版本号 以下是比较版本号的一些示例代码 示例1 简单比较 AI 您可以使用比较运
  • 线性调频脉冲压缩

    线性调频脉冲压缩 LFM信号的数学表达式为 式中为f c载波频率 rect t T 为矩形信号 K B T是调频斜率 信号的顺势频率为f c Kt T 2 t T 2 典型线性调频信号如下图 在MATLAB中实验结果如下 在远场设置了一个目
  • 3. 自建DNS(bind9)

    3 自建DNS bind9 扩展关键词 web dns NamedManager 是一个基于Web的DNS管理系统 注意 下文操作是在172 10 10 11机器上处理的 关键配置注意对应 各主机ip 及其hostname的设置 一 bin
  • C++中class关键字

    在C 语言中class是定义类的关键字 C 中也可以使用struct定义类 两者区别是 用class定义的类 如果数据成员或成员函数没有说明则默认为private 私有 的 而用struct定义的 默认为public 公共 的 示例 inc
  • Vue-Vue列表渲染v-for

    v for 指令需要以 site in sites 形式的特殊语法 一 v for 循环数组 HTML代码 div ul li item li ul div JS代码 new Vue el app data list red green b
  • 数据结构中常见的树

    哈夫曼树 Huffman Tree 哈夫曼树 又被称为最优二叉树 属于带权值二叉树的一种 它的真实节点全部分布在叶子节点中 是各种可能的组合中 WPL 值最小的形式 组合形式可能不唯一 但 WPL 值一定为最小 介绍一下 WPL Weigh
  • c语言repeat语句的用法,关于Lua中的repeat...until循环语句的使用教程

    关于Lua中的repeat until循环语句的使用教程 这篇文章主要介绍了Lua中的repeat until循环语句使用教程 是Lua入门学习中的基础教程 需要的朋友可以参考下与for和while循环不同 在循环的顶部测试循环条件 Lua
  • 【JavaWeb】PowerDesigner的使用

    PowerDesigner 数据库设计的工具 01 PowerDesigner概述 02 数据模型 2 1 概念数据模型 2 1 1 PowerDesigner使用之概念数据模型 2 1 2 根据概念模型生成物理模型 2 2 物理数据模型
  • C# 参数中this 表示扩展扩展方法

    怎么使用 public static SlicedHull Slice this GameObject obj Vector3 position Vector3 direction Material crossSectionMaterial
  • IOTCS+Ekuiper搭建物联网边缘计算平台

    背景介绍 IOTCS 是专为物联网平台而设计的工业智能网关 自从 2020 年 10 月以来 我们从需求调研 设计 定型 研发 测试经过漫长的沉淀与孵化 最终顺利实现工业智能网关最初的设想 我们凭借创新设计理念 快捷的安装以及部署 易用的扩
  • pycharm+pyqt5:CreateProcess error=5,拒绝访问

    问题背景 使用pyqt5来做python的图形界面程序开发实验 提前安装并配置了相关环境 弄了一下午 终于弄好了 总体的安装教程就不多说了 说说我遇到的错误叭 问题分析 通过命令行下载好相关工具后 需要使用pycharm的external
  • ant利用正则表达式获取文件夹名

  • wait(),waitpid()函数

    首先我们来了解一下所谓的僵尸进程 僵尸进程就是两个进程 一个父进程 一个子进程 其子进程终止后 0 3G的用户内存被回收 而3 4G的部分内存被回收 但是3 4G内存中的PCB等待父进程回收 若PCB未被父进程回收 我们称这个进程为僵尸进程
  • css/wxss 用伪类实现竖线效果(图片+源码)before、after巧用

    源代码见本文末尾 本文的代码片段用HTML语言书写 适用于网页 微信原生小程序 框架uniapp等 小程序原生开发需要实现这样一个效果 用伪类啊 这个我熟 先讲讲思路 因为用before和after的效果是一样的 所以我们任选一个 选择be
  • 基于OVSDB协议在SDN控制器ONOS开发配置管理OVS API

    为了更好的分享体验 博客搬迁至极客驿站 欢迎查阅 基于OVSDB协议在SDN控制器ONOS开发配置管理OVS API 介绍 准备工作 开发步骤 问题排查 介绍 目前protocol 中ovsdb协议层面已经实现 但是基于ovsdb prot
  • uniapp 点击复制 并有弹窗提示

    click myCopy 要复制的值 uni setClipboardData data delivery id 要被复制的内容 success gt uni showToast title 复制成功
  • 砝码称重——不同算法解决

    1 问题 砝码称重问题 设有1g 2g 3g 5g 10g 20g的砝码各若干枚 其质量 lt 1000g 求出用他们能称出的质量的种类数 不包括质量为0的情况 2 枚举法 算法思路 1 枚举不同砝码的个数 计算总重量 并将总重量对应的标志
  • Java学习总结-IO流的概念理解

    一 Java io流 的概念 流存在的意义 1 数据的传输量很大 2 内存有限 3 带宽有限 而Stream可以1点1点地逐步传输所有数据 这就是Stream存在的根本意义 想想我们是怎样下载1个大文件的 下载软件 例如x雷 并不会占用你内
  • IOS推送总结

    此文主要以证书生成配置为主 实现简单推送 部分截图与内容来自于互联网 若对大家有所帮助 还请给个赞O O 如有误 请指出 一起探讨 一 推送原理 Provider是指某个iPhone软件的Push服务器 APNS 是Apple Push N