对于具有某种基于聊天功能的应用程序,我想添加推送通知支持以接收新消息。 我想做的是使用 Apple 的新的基于 token 的身份验证(.p8 文件),但我找不到有关服务器部分的太多信息。
我看到了以下帖子: How to use APNs Auth Key (.p8 file) in C#?
但是答案并不令人满意,因为没有太多关于如何执行以下操作的详细信息:
- 与 APN 建立连接
- 使用 p8 文件(某种编码除外)
- 将数据发送到 Apple 推送通知服务
最佳答案
目前您还无法在原始 .NET Framework 上执行此操作。新的基于 JWT 的 APNS 服务器仅使用 HTTP/2,.NET Framework 尚不支持。
但是,只要您满足以下先决条件,System.Net.Http
的 .NET Core 版本就可以:
- 在 Windows 上,您必须运行 Windows 10 周年纪念版 (v1607) 或更高版本,或者 Windows Server 2016 的同等版本(我认为)。
- 在 Linux 上,您必须拥有支持 HTTP/2 的
libcurl
版本。 - 在 macOS 上,您必须编译支持 HTTP/2 的
libcurl
,然后使用DYLD_INSERT_LIBRARIES
环境变量才能加载libcurl 的自定义版本
。
如果您确实需要,您应该能够在 .NET Framework 中使用 .NET Core 版本的 System.Net.Http
。
我不知道 Mono、Xamarin 或 UWP 上会发生什么。
您必须做三件事:
- 解析您获得的私钥。目前这是一个 ECDSA key ,您可以将其加载到
System.Security.Cryptography.ECDsa
对象中。
- 在 Windows 上,您可以使用 CNG API。解析 key 文件的 Base64 编码 DER 部分后,您可以使用
new ECDsaCng(CngKey.Import(data, CngKeyBlobFormat.Pkcs8PrivateBlob))
创建 key 。 - 在 macOS 或 Linux 上,没有受支持的 API,您必须自己解析 DER 结构,或使用第三方库。
- 创建 JSON Web token /承载 token 。如果您使用 NuGet 中的 System.IdentityModel.Tokens.Jwt 包,则这相当简单。您需要 Apple 提供的 key ID 和团队 ID。
public static string CreateToken(ECDsa key, string keyID, string teamID)
{
var securityKey = new ECDsaSecurityKey(key) { KeyId = keyID };
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.EcdsaSha256);
var descriptor = new SecurityTokenDescriptor
{
IssuedAt = DateTime.Now,
Issuer = teamID,
SigningCredentials = credentials
};
var handler = new JwtSecurityTokenHandler();
var encodedToken = handler.CreateEncodedJwt(descriptor);
return encodedToken;
}
- 发送 HTTP/2 请求。这是正常的,但您需要做两件额外的事情:
- 将
yourRequestMessage.Version
设置为new Version(2, 0)
,以便使用 HTTP/2 发出请求。 - 将
yourRequestMessage.Headers.Authorization
设置为new AuthenticationHeaderValue("bearer", token)
,以便为您的请求提供承载身份验证 token /JWT。
然后只需将 JSON 放入 HTTP 请求中并将其 POST 到正确的 URL。
关于c# - 如何在 C# 中实现基于苹果 token 的推送通知(使用 p8 文件)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43870237/