如何使用标准 C#.NET 发送带有“apns-expiration”标头的推送通知?

Posted

技术标签:

【中文标题】如何使用标准 C#.NET 发送带有“apns-expiration”标头的推送通知?【英文标题】:How do I send Push Notification with "apns-expiration" header using standard C#.NET? 【发布时间】:2019-03-15 15:35:48 【问题描述】:

您可以在互联网上的许多地方找到类似的代码示例:

var apnsHost = "gateway.sandbox.push.apple.com";
var apnsPort = 2195;
var timeout = 3000;

using(TcpClient client = new TcpClient(AddressFamily.InterNetwork))

    await client.ConnectAsync(apnsHost, apnsPort);

    using (SslStream sslStream = new SslStream(client.GetStream(), false, _certificateValidationCallback, null))
    
        try
        
            sslStream.AuthenticateAsClient(apnsHost, _certificateCollection, System.Security.Authentication.SslProtocols.Tls, true);
         catch 
            throw;
        

        MemoryStream memoryStream = new MemoryStream();
        BinaryWriter writer = new BinaryWriter(memoryStream);

        byte[] binaryToken = StringToByteArray(deviceToken);
        writer.Write((byte)0); // The command
        writer.Write((byte)0); // The first byte of the deviceId length (bit-endian first byte)
        writer.Write((byte)32); // The deviceId length (big-endian second byte)
        writer.Write(binaryToken);

        byte[] bytesPayload = Encoding.UTF8.GetBytes(payload);
        writer.Write((byte)0);
        writer.Write((byte)bytesPayload.Length);
        writer.Write(bytesPayload);
        writer.Flush();

        byte[] array = memoryStream.ToArray();
        sslStream.Write(array);
        sslStream.Flush();
    

虽然我知道这段代码与 APNS 握手、建立 TLS 连接并编写适当的请求内容,但我真的不明白在这段代码中我可以在哪里指定额外的标头!

Apple 描述了 here 可以指定的各种标头,我对指定 apns-expirationapns-priority 很感兴趣,但我只是不知道我可以在哪里以及在这里使用哪种代码来实现我的目标?

【问题讨论】:

【参考方案1】:

我认为当你有 TCP 客户端连接(不是 connectAsync)时,你可以指定一个 IPEndPoint 对象并使用它来设置标头。

TCP 客户端连接:https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.tcpclient.connect?view=netframework-4.7.2#System_Net_Sockets_TcpClient_Connect_System_Net_IPEndPoint_

IPEndPoint:https://docs.microsoft.com/en-us/dotnet/api/system.net.ipendpoint?view=netframework-4.7.2

我从来没有尝试过发送这样的帖子,所以不确定你的请求的 JSON 是什么。

【讨论】:

以上是关于如何使用标准 C#.NET 发送带有“apns-expiration”标头的推送通知?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 System.NET.mail 发送带有附件但没有任何纯文本正文的电子邮件?

C#.net 对带有附件的电子邮件进行排队以进行发送的最佳方式

如何将带有附加数据的 FormData 文件发送到 asp.net web api ajax 调用

如何发送带有全局附件的邮件?

如何向桌面应用程序发送推送通知

如何在 ASPNET.Core Web 应用程序中发送带有 CORS 标头的 HTTP 4xx-5xx 响应?