c# - 如何在 C# 中实现基于苹果 token 的推送通知(使用 p8 文件)?

标签 c# apple-push-notifications

对于具有某种基于聊天功能的应用程序,我想添加推送通知支持以接收新消息。 我想做的是使用 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 上会发生什么。

您必须做三件事:

  1. 解析您获得的私钥。目前这是一个 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/

    相关文章:

    c# - 如何使用 Google API ver 2 for .NET 以编程方式从 Google Apps Mail 中删除邮件

    c# - 将 MvcHtmlString 与 jQuery 模板一起使用 - 正确的 razor 语法是什么?

    c# - 在 C# 中将 Dictionary<string,string> 转换为分号分隔的字符串

    c# - Windows Phone 8.1 C# 应用程序 : critical crash (ExecutionEngineException) only on real device in release mode

    ios - 在 iOS 7 推送通知中正确使用 "content-available"

    c# - System.Web.HttpUtility.HtmlDecode 给出不同的结果

    php - iOS 应用程序推送通知

    flutter - 如何构建 FCM 推送通知以在 Flutter 中的默认系统 Web 浏览器应用程序中打开指定的 URL(Android 和 iOS)

    php - iOS - 使用相同的消息和有效负载同时从同一服务器向多个应用程序发送推送通知的正确方法

    php - 苹果推送通知与PHP脚本