Как отправить push-уведомление с заголовком «apns-expiration», используя стандартный C # .NET? - PullRequest
1 голос
/ 15 марта 2019

Подобные примеры кода можно найти во многих местах в Интернете:

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 описывает здесь различные заголовки, которые можно указать, и я заинтересован в указании apns-expiration и apns-priority, но я просто не могу понять, куда и в какой код я могу вписаться здесь, чтобы достичь моей цели?

1 Ответ

0 голосов
/ 15 марта 2019

Я думаю, что когда вы подключаетесь к TCP-клиенту (не connectAsync), вы можете указать объект IPEndPoint и использовать его для установки заголовков.

TCP Client Connect: 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 для вашего запроса.

...