.NET5 向 Apple 设备发送推送通知

问题描述

目前我正在 .NET5 中为 Apple Wallet 编写 REST 服务。现在一切正常,注册,注销,手动更新卡。问题是推送通知,我知道有很多代码内容,如何实现 .NET Apple 推送通知服务,但对我来说没有任何作用。我读到,我必须使用 Pass Type ID 证书和推送令牌,这是在 Apple 设备上注册新钱包卡时获得的。这是我的推送通知代码

    [HttpGet]
    [Route("passes/{passtypeIdentifier}/{serialNumber}/sendpushnotification")]
    public async Task<IActionResult> SendPushNotificationToAppleAsync(string passtypeIdentifier,string serialNumber)
    {
        var devices = await _context.GetApplePassDevicesAsync(serialNumber,passtypeIdentifier).ConfigureAwait(false);

        if (!devices.Any()) {
            return NotFound();
        }

        try {
            foreach (var device in devices) {
                await SendEmptyApplePushNotificationAsync(device.PushToken).ConfigureAwait(false);
                await _context.SaveApplePushNotificationAsync(device.DeviceLibraryIdentifier,device.PushToken).ConfigureAwait(false);
            }

            return Ok();
        } catch (Exception ex) {
            _logger.LogError($"SendPushNotification error: [{ex.Message}]");
            return NotFound();
        }
    }

    private async Task SendEmptyApplePushNotificationAsync(string pushToken)
    {
        _logger.LogDebug("Trying to send push notification.");

        const string server = "api.sandBox.push.apple.com"; // Develop

        using var tcpClient = new TcpClient(server,443);
        await using var sslStream = new SslStream(
            tcpClient.GetStream(),false,ValidateServerCertificate,null);

        try {
            var certs = new X509Certificate2Collection();
            X509Certificate cert = await GetAppleServerCertificateAsync().ConfigureAwait(false);
            certs.Add(cert);
            await sslStream.AuthenticateAsClientAsync(server,certs,SslProtocols.Tls12,true).ConfigureAwait(false);
        } catch (AuthenticationException exp) {
            throw new AuthenticationException(exp.Message);
        } catch (IOException exp) {
            throw new IOException(exp.Message);
        }

        var memoryStream = new MemoryStream();
        var writer = new BinaryWriter(memoryStream);
        writer.Write((byte) 0);
        writer.Write((byte) 0);
        writer.Write((byte) 32);
        writer.Write(HexStringToByteArray(pushToken.toupper()));

        var payload = new JObject { new JProperty("aps") };
        var json = JsonConvert.SerializeObject(payload);
        writer.Write((byte) 0);
        writer.Write((byte) json.Length);
        var b1 = Encoding.UTF8.GetBytes(json);
        writer.Write(b1);
        writer.Flush();

        var array = memoryStream.ToArray();
        await sslStream.WriteAsync(array.AsMemory()).ConfigureAwait(false);
        await sslStream.FlushAsync().ConfigureAwait(false);
    }

    private static byte[] HexStringToByteArray(string hex)
    {
        return Enumerable.Range(0,hex.Length)
            .Where(x => x % 2 == 0)
            .Select(x => Convert.ToByte(hex.Substring(x,2),16))
            .ToArray();
    }

有没有人给我提示,怎么了?我也测试了2197端口,不行。

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...