1. iOS APNS远程推送 测试全方案汇总
最近弄了下推送,在测试时遇到了些问题,在此整理汇总了些推送测试相关的方案,并添加了一些补充信息。下方链接是相关文章,感谢各位作者的分享。
debug包和build切换为release直接在手机上跑生成的device token都是开发token。release打包后注册生成的token是生产的。
向证书制作者要推送证书的 p12文件。 双击输入密码。在钥匙串中找到如下。
证书有下方密钥,没有的话证书不可用。
将p12上传的三方平台并填写密码即可。测试推送在这些推送平台填写 设备token等信息即可。
给中台p12文件和密码,协商好消息格式、提供对应环境的token,由中台触发即可。
注意证书分为三种。测试(sanbox)、生产、 测试和生产合并。
如果发送成功,核对 token、证书、中台链接苹果服务器息的地址。是否为统一环境。(苹果的推送服务器也是区分测试和生产的,域名不同,下方脚本中可以看到)
在Xcode11.4之后,模拟器也支持推送测试
具体格式根据你们的产品要求,接入极光或者个推的可以在控制台发一条推送打印出具体格式内容查看,将文件保存后缀为apns,待会要用到
a、查看已启动模拟器
会看到类似下面信息,如果没有请先启动模拟器
b、运行项目在模拟器上后执行相应命令simctl push <device> [<bundle identifier>] (<json file> | -)
示例如下
将第一步创建的json文件内容稍加修改,具体就是添加了"Simulator Target Bundle": "com.app.test"你项目的包名
然后直接拖动文件到模拟器上,出现绿色➕后松手,这样也可以进行推送测试
参考苹果官方文档
Sending Push Notifications Using Command-Line Tools
<u>https://links.jianshu.com/go?to=https%3A%2F%2Fdeveloper.apple.com%2Fdocumentation%2Fusernotifications%2Fsending_push_notifications_using_command-line_tools</u>
1、在终端新建 shell 文件,这里命名为 push-remote-notification
2、编辑 shell 脚本,这里需要 der 和 pem 证书,如果已经有了 p12 证书,可以通过 openssl 进行转换
运行 shell 脚本
真实脚本事例:
a、p12转der需要先转为pem格式,再从pem转到der格式
openssl pkcs12 -in disPush.p12 -out disPush.pem -nodes
b、pem转der
openssl x509 -outform der -in certificate.pem -out certificate.der
Smart push
git地址: https://github.com/shaojiankui/SmartPush
如果报错
SSL端点域名不能被设置 -25300
Keychain中不能找到证书 -25300
说明钥匙串中没有密钥,要新的p12文件并双击
不推荐,所以不例举,网站风险无法判断。
<u>https://www.jianshu.com/p/15d58b1ada5b</u> 证书转换
<u>https://blog.csdn.net/u013250412/article/details/78729828</u> 证书转换
<u>https://www.jianshu.com/p/9d7aece4a88d</u> 证书转换
<u>https://developer.apple.com/documentation/usernotifications/sending_push_notifications_using_command-line_tools</u>
<u>https://blog.csdn.net/berryreload/article/details/52205397</u>
<u>https://www.jianshu.com/p/87168eecc395</u> 脚本
<u>https://developer.aliyun.com/article/116088?spm=a2c6h.13813017.content3.2.6bc0590ePir0NF</u>
<u>https://www.jianshu.com/p/87168eecc395</u> 脚本
<u>https://www.jianshu.com/p/e8e4f4984fee</u> 模拟器
2. 怎样编写Apple Push Notification服务器
基本结构:
使用唯一的SSL许可证连接到APNS
循环通过你需要发送到消息
为各消息构建有效载荷
断开与 APNS的连接
远程通知数据的流程是单向的。提供者将包括客户程序设备令牌和有效载荷的数据打包,发送到APNS,然后APNS再将通知发送给最终设备。
限制:
有效载荷限制为256字节 – 它包括了消息主体以及你希望传送带其他属性。推送通知并不适于传送大量的数据。例如,我们仅仅传送一条短消息通知服务器监视的事件已经被触发了。
APNS并不提供消息发送成功与否的回馈状态。一个原因是如果一个设备无法联系那么发送给它的消息将被存于队列中,然而只有最新发送的消息被存于队列中 – 覆盖了先前发送但不成功的消息。
推送通知不适合用于发送紧急通知,因为消息仅在设备具有wifi或手机服务连接的情况下才能被发送,这也是为什么我们推荐与其它方法如email或SMS一起使用的原因。
用来与APNS通讯的SSL许可证(下面将讨论)是在程序层生成的。本教程涉及到实现方法仅适于单个iPhone程序,所以如果你有多个程序,那么你需要修改代码使之适合于使用多个许可证。
设备令牌:
每条推送消息都必须针对某特定设备。这是通过使用在你的iPhone程序中由APNS产生的唯一deviceToken(设备令牌)来实现的。一旦获取了此令牌,你需要将其存储于服务器而不是你的iPhone程序内。它看上去像这样:
c9d4c07c fbbc26d6 ef87a44d 53e16983 1096a5d5 fd825475 56659ddd f715defc
在我们的 Server Density iPhone 程序中,我们在程序启动时调用相应的令牌生成方法,然后通过 HTTP API 调用 传回给我们的服务器 。这将使得deviceToken存储于服务器的有关用户的数据库中,从而我们可以使用它与持有此设备的用户进行通讯。
反馈服务:
Apple 还提供了一个 反馈服务 ,你应该定期查询。它提供了一个以前使用过但不再有效的(例如用户卸载了你的iPhone程序)设备令牌列表。你可以从你的数据库中删除这些设备令牌。
许可证:
要进行推送服务的第一件事就是获取推送许可证。它用来对你通过SSL与APNS通讯进行识别。
在Mac上生成 Apple推送通知SSL许可证:
登录到 iPhone Developer Connection Portal 并点击 App IDs
创建一个不使用通配符的 App ID 。通配符 ID 不能用于推送通知服务。例如,我们的iPhone程序ID像这样: AB123346CD.com.serverdensity.iphone
点击App ID旁的“Configure”,然后按下按钮生产 推送通知许可证。根据“向导”指导的步骤生成一个签名并上传,最后下载生成的许可证。此步骤在 Apple文档中 也有谈到。
通过双击.cer文件将你的 aps_developer_identity.cer 引入Keychain中。
在Mac上启动 Keychain助手,然后在login keychain中选择 Certificates分类。你将看到一个可扩展选项“Apple Development Push Services”
扩展此选项然后右击“Apple Development Push Services” > Export “Apple Development Push Services ID123”。保存为 apns-dev-cert.p12 文件。
扩展“Apple Development Push Services” 对“Private Key”做同样操作,保存为 apns-dev-key.p12 文件。
需要通过终端命令将这些文件转换为PEM格式:
php">opensslpkcs12-clcerts-nokeys-outapns-dev-cert.pem-inapns-dev-cert.p12
opensslpkcs12-nocerts-outapns-dev-key.pem-inapns-dev-key.p12
如果你想要移除密码,要么在导出/转换时不要设定或者执行:
opensslrsa-inapns-dev-key.pem-outapns-dev-key-noenc.pem
最后,你需要将键和许可文件合成为apns-dev.pem文件,此文件在连接到APNS时需要使用:
catapns-dev-cert.pemapns-dev-key-noenc.pem>apns-dev.pem
将此文件保存为一个易记的名字,你有可能以后会用到它。上述步骤同样适合于生成产品许可证。
载荷内容:
载荷 格式化为遵循 RFC 4627标准的JSON格式。它由以下几部分组成:
提示 – 显示于设备上的文本串
标识 – 设备屏幕中程序图标上显示的整数
声音 – 显示消息在设备的同时发出的声音的文本名字
本教程仅处理发送简单提示文本串,但也可以发送包括诸如显示自定义按钮等在内的各种选项的字典集。
创建载荷:
使用 PHP 很容易根据数组并 转换成 JSON而创建载荷:
$payload['aps']=array('alert'=>'Thisisthealerttext','badge'=>1,'sound'=>'default');
$payload=json_encode($payload);
显示 $payload 的内容可以看到传送到APNS 的 JSON字符串:
{
"aps":{"alert":"Thisisthealerttext","badge":1,"sound":"default"}
}
这将使消息显示于设备上,触发提升声音并将“1”置于程序图标上。默认按钮“Close”和“View”同时会显示于弹出窗口上。
对于 Server Density iPhone程序而言,让用户按下“View”直接进入产生此提示的服务器是很重要的,所以我们增加了额外的自定义值:
$payload['aps']=array('alert'=>'Thisisthealerttext','badge'=>1,'sound'=>'default');
$payload['server']=array('serverId'=>$serverId,'name'=>$name);
$output=json_encode($payload);
当用户按下“View”后,自定义server值将被传递到设备中的程序。JSON 值如下:
{
"aps":{"alert":"Thisisthealerttext","badge":1,"sound":"default"},
"server":{"serverId":1,"name":"Servername")
}
256字节的限制适用于整个载荷,包括自定义字典集。
原生接口
在Server Density中,一旦产生了一条提示,将建立一个载荷并插入队列中。因此有必要时我们可以同时发送多个载荷。
Apple推荐使用这种方法,因为如果你在发送各载荷时频繁连接和断开,APNS有可能会封锁你的IP。
如Apple 描述:
原生接口使用原生socket,具有二进制内容,采用数据流技术,不产生回馈。
打开连接
打开连接的PHP 5代码如下:
$apnsHost='gateway.sandbox.push.apple.com';
$apnsPort=2195;
$apnsCert='apns-dev.pem';
$streamContext=stream_context_create();
stream_context_set_option($streamContext,'ssl','local_cert',$apnsCert);
$apns=stream_socket_client('ssl://'.$apnsHost.':'.$apnsPort,$error,$errorString,2,
STREAM_CLIENT_CONNECT,$streamContext);
如果发送错误,你可以参考$errorString。它也包括了SSL许可证不正确时的详细信息。
许可证文件处于执行的PHP代码的当前工作目录下,如果需要你可指定其绝对路径。
注意测试时应该使用开发许可证及sandbox。成品主机名为 gateway.push.apple.com ,而且你必须使用不同的产品许可证。
发送载荷
在此,我们循环整个载荷队列进行发送。构建发送到APNS的二进制内容简单示例如下:
$apnsMessage=chr(0).chr(0).chr(32).pack('H*',str_replace('','',$deviceToken)).chr(0).
chr(strlen($payload)).$payload;
fwrite($apns,$apnsMessage)
注意 $deviceToken 是从数据库中提取并去除空格得到的。我们还应该检查是否$payload超过256个字节。
$apnsMessage 包括了正确的二进制载荷,而fwrite 将载荷写入当前活动的数据流连接中。
完成后,应关闭连接:
socket_close($apns);
fclose($apns);
php-apns
有一个开源服务器库php-apns实现了以上所有功能,它依赖于memcached。我们不想使用任何第三方代码,所以完全自己编写了自己的服务器。我们使用自定义cron系统,几秒钟运行一次。
3. php 定时推送消息怎么做
这个要用到服务器系统的计划任务,如果是linux服务器 的cron。代码实现是非常消耗性能的,需要不停的循环执行。