首页 > 其他分享 >APNs苹果推送

APNs苹果推送

时间:2023-10-27 15:12:16浏览次数:29  
标签:ch jwt APNs 苹果 http2 curl 推送 payload

转载自:https://zhuanlan.zhihu.com/p/622475157

做App总少不了消息推送,公司的App为了开发敏捷方便都直接上的三方推送诸如某盟、某推、某光,安卓和苹果都一套代码,高效好维护,只要按时给推送vip付费就好了。最近心血来潮想手搓下苹果的消息推送,踩踩以前没踩过的坑。

看了下苹果官方文档感觉并不困难,文档详情戳这里

Sending Notification Requests to APNs | Apple Developer Documentation

恰逢chatGPT大火赶下时髦,直接问了ai代码怎么写

charGPT3.5的回答

ai回答得有模有样,我里面换上证书和相关参数尝试,然后发现死活不行,苹果那边没反应。

一查文档发现其实苹果这边服务器推送大致分了两种模式:

一种是基于ssl证书模式推送,另一种是根据p8证书生产jwt token授权来推送。

显然代码给的是第一种,然后看了苹果的官方文档2021年就已经废弃了第一种模式并且强行要求使用http2请求,看来chatGPT3.5的投喂数据截止于2021年所言非虚。

苹果官方强行要求http2

这里我踩了两个大坑:

第一个是苹果证书ssl模式下要pem证书,我拿到的是p12证书,只能先用OpenSSL转成pem公钥和私钥,后来发现要公钥和私钥放在一起合成一个pem第一张图的代码才能用。然后转为jwt授权模式后要的是p8证书,之前的pem证书生成的token死活过不了。

第二个是我这边的服务器环境curl并不支持http2,一直报错Unexpected HTTP/1.x request: POST /3/device/XXXX。后来我只好重新编译curl和php相关的扩展直接升级到了curl 8.1.0。参考连接

怎么让php curl发http2请求

怎么让curl支持http2

下面是推送和jwt生成demo

<?php
//jwt token模式下的苹果推送

$device_token = 'your_device_token';  //苹果给的设备推送token
$message = 'Hello, world!'; //要推送的消息

// Create the notification payload
$payload = array(
    'aps' => array(
        'alert' => $message,
        'sound' => 'default'
    )
);
$payload_json = json_encode($payload);

//正式环境推送地址
$url = 'https://api.push.apple.com:443/3/device/' . $device_token;

//沙盒推送地址
//$url = "https://api.sandbox.push.apple.com:443/3/device/".$device_token;

$headers = array(
    'Authorization: Bearer 你生成的jwt_token',
    'Content-Type: application/json'
);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload_json);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); //这里很关键,以http2发送请求,如果你的curl不支持http2则需要看前面的步骤
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

// Check the response
if ($http_code == 200) {
    echo 'Notification sent successfully.';
} else {
    echo 'Notification failed with error code: ' . $http_code;
}

生成 jwt_token

<?php
//jwt token生成代码
$key_id = 'your_key_id';
$team_id = 'your_team_id';
$pkey_file = 'AuthKey_your_key_id.p8'; //p8证书文件,我在这里填的绝对地址

// token过期时间
$expires = time() + 3600;

// Generate the JWT header
$header = array(
    'alg' => 'ES256',
    'kid' => $key_id
);
$jwt_header = base64_encode(json_encode($header));

// Generate the JWT payload
$payload = array(
    'iss' => $team_id,
    'iat' => time(),
    'exp' => $expires,
    'aud' => 'https://appleid.apple.com',
    'sub' => 'your_bundle_id' //这里填你的App包名
);
$jwt_payload = base64_encode(json_encode($payload));

//载入证书文件
$pkey_contents = file_get_contents($pkey_file);
$pkey = openssl_get_privatekey($pkey_contents);

//JWT 签名
$signature = '';
openssl_sign($jwt_header . '.' . $jwt_payload, $signature, $pkey, 'sha256');
$jwt_signature = base64_encode($signature);

// Generate the final JWT
$jwt = $jwt_header . '.' . $jwt_payload . '.' . $jwt_signature;

// Print the JWT
echo $jwt;

 

 

标签:ch,jwt,APNs,苹果,http2,curl,推送,payload
From: https://www.cnblogs.com/zinging/p/17792407.html

相关文章

  • 苹果发布 iOS 17 正式版
    苹果今天凌晨正式推送iOS17正式版更新,其内部版本号和上周RC版本相同,均为21A329。在全新的iOS17系统中,苹果加入了待机显示功能,为充电时将iPhone横屏放置带来了焕然一新的全屏体验,不用靠近,信息也能一目了然。此外用户可以为通讯录用户设置海报,显示图像、名字等信息。iOS......
  • macOS Sonoma 14.1正式版(23B74)发布(可下载黑白苹果镜像)
    系统介绍黑果魏叔苹果今天为macOSSonoma推出了14.1版本更新,魏叔发现,本更新主要改善了AppleMusic 界面,设置中新增保修状态,并修复了多项错误内容。根据苹果的新说明,这次的Mac更新不仅提供了一系列的改善,也解决了多项问题,并强化了系统安全性。以下是一些主要的更新内容:「音......
  • 开发苹果软件的教程和重点!
    随着智能手机的普及,移动应用开发已经成为了一个热门行业,苹果公司作为移动市场的领导者之一,其软件生态系统iOS拥有庞大的用户群体和丰富的应用场景,本文将为你提供一份全面的开发苹果软件的教程和重点,帮助你掌握这一技能。一、开发环境搭建在开始开发苹果软件之前,你需要准备一些必要......
  • APP移动出海必备神器,MobPush提供海外消息智能推送一站式解决方案
    随着国内移动应用市场的趋于饱和,海外新兴市场成为越来越多移动应用开发者的进一步提升APP市场占有率的不二之选。据统计,中国应用开发者中有79.1%计划出海。但如何利用消息推送实现与用户的深度绑定仍然存在较为一定问题。在国外,应用开发者面临着截然不同的网络环境和语言文化背景,如......
  • 推送内容有误怎么办?MobPush撤回/取消推送为您排忧解难
    消息推送已成为深度连接APP和用户的利器,对推送内容的准确性和时效性的要求也更为严格,倘若推送的内容出现错误,或推送的内容已经失去了时效性,此时又该怎么办呢?别急,近日MobPush全新上线了取消推送和撤回推送新功能,下面,就让看看怎么应用这些新功能吧。  1、取消推送教程 接口地址:htt......
  • 数智化推送助力用户精准分层,MobPush是如何实现用户价值变现的
    随着移动设备普及,移动应用市场日益趋于饱和,传统的拉新促活、提升APP用户数,利用庞大的用户流量带来的广告收入、第三方合作等方式实现价值变现的路径已越来越窄,拉新促活成本的高企不下进一步限制了这种价值增长方式的可行性。因此,如何通过精准的用户分层,识别潜在的高价值、高粘度、......
  • Git无法正常推送到远程仓库
    问题:git推送代码报错:fatal:Thecurrentbranchmasterhasnoupstreambranch.原因:在默认情况下,gitpush时一般会上传到origin下的master分支上,当repository和branch过多,又没有设置关联时,git就会产生疑问,因为它无法判断你的push目标。解决方法参考于:https://www.cnblogs......
  • 苹果上架所需准备资料有哪些?
    大家好,我是咕噜-凯撒,移动应用已经成为我们日常生活的重要组成部分。对于开发者来说,将自己的应用上架到苹果的AppStore无疑是一个重要的里程碑。但是这个过程可能会因为缺乏必要的准备和了解而变得很复杂很困难。我们都知道苹果上架是指你将自己做的应用程序提交到苹果公司的AppS......
  • 【HMS Core】推送热门合集3
    【问题描述1】如何判定当前设备是否可以使用华为推送通道? 【解决方案】判断系统版本请参考:https://blog.csdn.net/chenzhengfeng/article/details/119868210只要安装了HMSCore的设备,都是支持华为推送的。 【问题描述2】根据华为的消息分类标准和本地通知频次及分类管控......
  • 苹果端安装fiddler证书打开代理后无法上网的解决办法
    1.删除电脑与手机上的fiddler证书2.下载fiddler官方插件‘FiddlerCertMaker.exe’ 工具重新生成证书,下载之后双击运行,运行成功后,重新启动fiddler3.生成新的证书安装到苹果端4.打开苹果端代理进行抓包 安卓端出现同样问题也可使用此方法解决......