关闭

APNs(Apple Push Notification server)服务器代码C#编写

标签: APNsios服务器servergithub
1630人阅读 评论(0) 收藏 举报
分类:

PushNotification

使用最简单的方式通过APNs发送通知, 本库使用C#写的服务器端代码,C/Objective-C客户端代码

原地址
Github地址

APNs 概述

Apple推送通知服务,是一个稳健性和高效率性的远程通知,具有中心化的特性。APNs可以传送通知消息到iOS,WatchOS, tvOS 和macOS的设备。 在应用初始化启动时,会创建一个受信任的和加密的IP链接到APNs服务器。APNs发送通知是使用一个持久连接的方式。如果一个通知到达了用户的设备,但是应用没有启动,那么设备暂存通知,直到在合适的时间里相应的应用去处理它。

另外,APNs和你的应用需要用通知来交互,所以你必须配置你自己的服务器(公司的服务器)作为原始发送的通知的服务器,叫做provider, 这个provider需要做到如下几条
* 接收设备的device token和发送相关的通知到APNs,APNs会把相应的通知发送给具体的设备的具体应用
* 何时发送远程通知到用户设备上
* 构建JSON字典,该字典就是通知的payload, 用来描述通知的具体显示
* 发送正确的payload和device token到APNs服务器
* 通过持久的和安全的通道发送请求到APNs,使用HTTP/2网络协议

这里写图片描述

这个库可以做什么?

  • 提供最简单的方式发送远程通知到用户的设备,并且是C#写的
  • 使用最简单的C#/Objective-C代码去编写,即时是新手也能很容易理解
  • 如果你是一名iOS开发者,那么这个库很方便与你的iOS测试
  • 如果你是一名ASP.NET/C#开发者,那么这个库很方便的让你编写APNs服务器端代码

更多详情,请看 这里.

简介

服务器端代码(C#)
- 以下是一个最简单的payload远程通知

{"aps":{"alert":"This is a message for testing APNs","badge":123,"sound":"default"}}

这些头文件需要被引用

using System;
using System.IO;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading;
  • 读取p12文件,从Apple Developer Website下载的,变量certFilePath是p12证书的完整路径,变量certPwd是证书密码,以下是调用代码:
X509Certificate2 cert = new X509Certificate2(certFilePath, certPwd);
X509CertificateCollection certificate = new X509CertificateCollection();
certificate.Add(cert);
  • 然后,传递主机地址和端口,创建一个SslStream实例,并且握手,代码如下:
//发布模式, 主机地址是 gateway.push.apple.com    
//开发模式, 主机地址是 gateway.sandbox.push.apple.com
TcpClient client = new TcpClient("gateway.push.apple.com", 2195);

SslStream sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ServerCertificateValidationCallback), null);

//方法AuthenticateAsClient()可能会引起异常,我们需要try..catch..起来
try
{
    //SslStream参考 
    //https://msdn.microsoft.com/en-us/library/system.net.security.sslstream(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

    sslStream.AuthenticateAsClient(_host, certificate, SslProtocols.Default, false);
}
catch (Exception e)
{
    Console.WriteLine("Exception Message: {0} ", e.Message);
    sslStream.Close();
}

//这是握手后的回调
bool ServerCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
    {
        Console.WriteLine("Specified Certificate is accepted.");
        return true;
    }
    Console.WriteLine("Certificate error : {0} ", sslPolicyErrors);
    return false;
}
  • 构建payload字符串,发送远程通知
//PushNotificationPayload是一个结构体的定义 
public struct PushNotificationPayload
{
    public string deviceToken;
    public string message;
    public string sound;
    public int badge;

    public string PushPayload()
    {
        return "{\"aps\":{\"alert\":\"" + message + "\",\"badge\":" + badge + ",\"sound\":\"" + sound + "\"}}";
    }
}

//把值赋给payload
PushNotificationPayload payload = new PushNotificationPayload();
payload.deviceToken = "dc67b56c eb5dd9f9 782c37fd cfdcca87 3b7bc77c 3b090ac4 c538e007 a2f23a24";
payload.badge = 56789;
payload.sound = "default";
payload.message = "This message was pushed by C# platform.";

//然后调用Push()方法
public void Push(PushNotificationPayload payload)
{
    string payloadStr = payload.PushPayload();
    string deviceToken = payload.deviceToken;

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

    writer.Write((byte)0); //The command
    writer.Write((byte)0); //deviceId长度的第一个字节,大头字节序第一个字节
    writer.Write((byte)32); //deviceId长度,大头字节序第二个字节

    //方法DataWithDeviceToken() , [具体看源码](https://github.com/Victor-Studio/PushNotification)
    byte[] deviceTokenBytes = DataWithDeviceToken(deviceToken.ToUpper());
    writer.Write(deviceTokenBytes);

    writer.Write((byte)0); //payload的长度的第一个字节,大头字节序的第一个字节
    writer.Write((byte)payloadStr.Length); //payload的长度,大头字节序的第二个字节

    byte[] bytes = Encoding.UTF8.GetBytes(payloadStr);
    writer.Write(bytes);
    writer.Flush();

    _sslStream.Write(memoryStream.ToArray());
    _sslStream.Flush();

    Thread.Sleep(3000);

    //方法ReadMessage() , 具体看[本库的源码](https://github.com/Victor-Studio/PushNotification)
    string result = ReadMessage(_sslStream);
    Console.WriteLine("server said: " + result);

    _sslStream.Close();
}

好了,就是这么简单,如果有疑问,欢迎在github上提问。
高手请略过

0
0
查看评论

iOS 远程消息推送 APNS推送原理和一步一步开发详解篇

前言:现在第三方推送也很多 ,比如极光,融云,信鸽,其原理也是相同利用APNS推送机制 ,前段公司让做自己的推送,1.避免device token被第三方泄露,保护手机设备信息,2.第三方部分开始收费,一些免费的以后谁又知道呢 ,不如自己创建,除了后台麻烦点,需要数据库来存储token相关字段(后台...
  • YUXIANG19876021
  • YUXIANG19876021
  • 2016-08-16 09:42
  • 12462

APNS详解

建议每次程序启动的时候都调用registerForRemoteNotificationTypes来重新获取设备相关的token,而不要缓存token. 这是因为,如果用户重装了iOS或者用户换了设备并且恢复程序备份到一个新的设备,都将导致这个token值不一样。 当iOS收到远程消息时,...
  • sxfcct
  • sxfcct
  • 2012-09-03 18:08
  • 30929

iOS开发——Push Notification(一)

写下来,作为记录。 一、简述苹果的推送原理:   过程就是: 1、 应用程序注册消息推送。(就是比较复杂的制作证书的过程)     2、 IOS跟APNS Server要deviceToken。应用程序接受deviceToken。(在Xcode中编码实...
  • naaaaq
  • naaaaq
  • 2016-01-11 14:19
  • 1555

iOS 进阶开发— 原生APNS配置以及server实现(c++版本)

本文转自:http://blog.csdn.net/o_surface_o/article/details/9271631 关于iOS APNS的server provider 一直没有看到关于c++版本的,不过现在的各种第三方APNS已经很成熟了,比如百度的云推送SDK等等,这里简单总结...
  • a19860903
  • a19860903
  • 2015-05-05 17:39
  • 2445

iOS实现服务器原生推送

iOS原生实现推送 一、iOS推送机制 Provider是给你手机应用发出推送消息的服务器,而APNS(Apple Push Notification Service)则是苹果消息推送服务器。你本地的服务器当需要给应用推送一条消息的时候,先要将消息发出到苹果推送服务器,然后再由苹果推送服务...
  • sinat_34380438
  • sinat_34380438
  • 2016-12-12 14:14
  • 2193

iOS消息推送机制详解,APNS服务器搭建基本思路

转载自:http://blog.csdn.net/pcyph/article/details/44631433?ref=myread iOS消息推送的工作机制可以简单的用下图来概括:   Provider是指某个iPhone软件的P...
  • wxs0124
  • wxs0124
  • 2015-03-28 00:15
  • 1079

【.NET向APNS苹果消息推送通知】

一.Apns简介: Apns是苹果推送通知服务, 二.原理: APNs会对用户进行物理连接认证,和设备令牌认证(简言之就是苹果的服务器检查设备里的证书以确定其为苹果设备); 然后,将服务器的信息接收并且保存在APNs当中,APNs从其中注册的列表中查找该IOS设备(设备可以为iPhone、iPad、...
  • heyangyi_19940703
  • heyangyi_19940703
  • 2016-06-22 16:59
  • 1342

Iphone 消息通知(APNS)的3种方式 -- C# 和 nodejs

Iphone 消息通知(APNS)的3种方式 -- C# 和 nodejs
  • csharp25
  • csharp25
  • 2017-06-24 14:31
  • 880

iOS APNS服务器搭建资料

转载自:http://blog.csdn.net/pcyph/article/details/44677797 http://www.easyapns.com/php-source#class_APNS https://developer.apple.com/librar...
  • wxs0124
  • wxs0124
  • 2015-03-28 00:18
  • 516

ios APNS推送服务器代码pushMe

  • 2014-04-17 16:48
  • 1KB
  • 下载
    个人资料
    • 访问:283784次
    • 积分:5323
    • 等级:
    • 排名:第6070名
    • 原创:262篇
    • 转载:42篇
    • 译文:0篇
    • 评论:33条
    文章分类
    最新评论