用C#完成Swift远程推送通知

IOS的信送简单就是在开开发者管理门户中创建推送证书,然后生成服务器推送证书(服务端代码可以是任意的,我们采用C#来写),App中嵌入推送代码,App安装后允许推送后就可以收到服务端的推送消息了,关于更进一步的原理说明,可以查看官方文档。

前提是你已经开通购买了apple的开发者帐户,并且已经有开发证书,能正常创建运行项目到你的iphone上了,如果以前条件不具备,请先参完成以上步骤。

导出证书

打开Mac系统的“钥匙串访问”-“证书助理”-“从证书颁发机构请求证书”

输入邮箱和名称,选择“存储到磁盘”

在弹出框中***的名字为“RemotePush_CertificateSigningRequest.certSigningRequest”,请注意,这记住这个名字和保存路径,马上在创建App ID时会用到。

添加App ID

登录apple的开发者门户,进入到“MemberCenter”-“Certificates,Identifiers&Profiles”-IOSApps下的“Certificates”-“Identifiers”-“AppIDs”

这时,还有没在xcode下创建自己的项目,所以App IDs下还无法添加对应的App ID,现在先在xcode下创建一个项目,名字叫RemotePushDemo

现在添加一个App ID

然后提交

提交成功后,在App IDs中选择刚添加的RemotePush,点击Edit

找到Push Notifications节点,点击CreateCertificate(如果是发布,就先Production SSL Certificate下的Create Certificate)

选择继续,直到选择上传证书页面,点击选择证书

这是找到文章开始先择导出的证书RemotePush_CertificateSigningRequest.certSigningRequest,然后点击Generate生成证书

这时,就可以下载生成的证书了,下载完成后双击安装证书。

安装完成后可以“钥匙串访问的“登录”下,类型为“证书”下看到安装的证书了。

选中这张证书,右键,选择导出证书选项,然后在弹出框中输入证书名称,要使用.p12格式,同时,需要输入证书密码,这时一定要记住自己设定的证书密码,这个证书和密码将要在服务端使用。在最后,导出证书时需要系统登录密码,以作验证。

配置Provisioning Profiles,选择Development添加,选择IOS App Development

要选择自己创建的App ID,然后保存下载,双击安装即可(安装后会自动打开xcode,可以在项目的Build Settings中搜Provisioning Profile的选项目中查看是否安装成功)。

同时,在设置项目的Capabilities开启Remotenotifications

接下来就开始写swift在app中的代码了,打开项目的AppDelegate活加如下代码:

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        
        UIApplication.sharedApplication().applicationIconBadgeNumber=0;
        
        application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: [UIUserNotificationType.Alert,UIUserNotificationType.Sound,UIUserNotificationType.Badge], categories: nil));
        
        return true
    }
    
    // 8.0 
之后 收到远程推送通知
    func application(application: UIApplication , didReceiveRemoteNotification userInfo: [ NSObject : AnyObject ], fetchCompletionHandler completionHandler: ( UIBackgroundFetchResult ) -> Void ) {
   
    }
    func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
     
    }
    // 注册通知 alert 、 sound 、 badge ( 8.0 之后,必须要添加下面这段代码,否则注册失败)
    func application(application: UIApplication , didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings ) {
        application.registerForRemoteNotifications();
    }    
    
    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
 
         print(deviceToken);//在输入窗口中查看此值
    }
    func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
    
    }

注意认识印的倒数第二个方法的deviceToken,这个值要作为服务端推送的设备值使用,每个设备,每次安装后都有一个唯一的值,同样设备卸载再次安装,此值会变化。

接下来是用C#写服务端了:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                pushMessage(Console.ReadLine());
            }
        }
        public static void pushMessage(string content)
        {         
            string deviceID = "deviceToken替换掉这里";
            int port = 2195;
            var hostname = "gateway.sandbox.push.apple.com";
 
             var certificatePath = @"还记得.p12的证书文件吗?替换这里";
        
            X509Certificate2 clientCertificate = new X509Certificate2(System.IO.File.ReadAllBytes(certificatePath), "还记得证书密码吗?你设定的,替换这里");
 
            X509Certificate2Collection certificatesCollection = new X509Certificate2Collection(clientCertificate);
 
            TcpClient client = new TcpClient(hostname, port);
            SslStream sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
 
            try
            {
                sslStream.AuthenticateAsClient(hostname, certificatesCollection, SslProtocols.Tls, false);
                MemoryStream memoryStream = new MemoryStream();
                BinaryWriter writer = new BinaryWriter(memoryStream);
                writer.Write((byte)0);
                writer.Write((byte)0);
                writer.Write((byte)32);
 
                writer.Write(HexStringToByteArray(deviceID.ToUpper()));
  
                String payload = "{\"aps\":{\"alert\":\"" + content + "\",\"badge\":10,\"sound\":\"default\"}}";
                var payloadlength = System.Text.Encoding.UTF8.GetBytes(payload).Length;
                writer.Write((byte)0);
                //writer.Write((byte)payload.Length);
                writer.Write((byte)payloadlength);
                byte[] b1 = System.Text.Encoding.UTF8.GetBytes(payload);
                writer.Write(b1);
                writer.Flush();
                byte[] array = memoryStream.ToArray();
                sslStream.Write(array);
                sslStream.Flush();
                client.Close();
            }
            catch (System.Security.Authentication.AuthenticationException ex)
            {
                client.Close();
            }
            catch (Exception e)
            {
                client.Close();
            }
        }
 
        private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {     
            Console.WriteLine(certificate.Subject);         
            return true;
        }
 
        public 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();
        }
 
    }
}
时间: 2024-08-07 00:54:01

用C#完成Swift远程推送通知的相关文章

远程推送通知

什么是远程推送通知 就是从远程服务器推送给客户端的通知 此操作需要联网 远程推送服务 又称为APNs (Apple Push Notification Services) 为什么需要远程推送通知? 传统获取数据的局限性: 通过上图可以看到,张三如果想要发送消息给李四 首先需要向服务器发送一条消息,然后由服务器将消息推送给李四 反之一样 但是有一个问题就是:如果张三要给李四发送消息必须先发送给服务器 服务器再推送给李四 也就是说李四要正确收到张三发送的消息 就必须和服务器建立一个长连接,但是假如李

APNS 远程推送通知 PUSH deviceToken

服务器向客户端推送消息: 当应用程序推到后台,或者根本就没有运行(我们的代码无能为力)      如果这种情况之下,应用程序想和用户交互(传统的做法 不可能) 推送 APNS:Apple Push Notification Service deviceToken:标示某一台iPhone上的某一个应用程序 1.(用户必须确认需要收到推送消息)注册远程通知中心向APNS获取64位的字符串deviceToken 注册远程通知中心 [[UIApplication sharedApplication] r

iOS 远程推送通知 详解

1: ios本地通知和远程通知 http://wangjun.easymorse.com/?p=1482 2: 苹果远程通知服务申请激活例图 (外国佬写的.) http://mobiforge.com/developing/story/programming-apple-push-notification-services 3:书籍参考:iPhone 开发秘籍 第16章 推送通知. 好了,进入正文: 首先是申请证书的网址 https://developer.apple.com/ios/manag

Swift 本地推送通知UILocalNotification

Notification是智能手机应用开发中常用的信息传递机制,它不用消耗更多资源去不停的检查信息状态,可以非常好的节省资源. 在iOS中分为两种通知:本地.远程.本地的UILocalNotification由全局的NotificationManager统一管理,我们只需要将本地通知对象添加到系统的Notification队列中就可以了,系统会在指定的时间激发本地通知. 本地推送通知:UILocalNotification 如果要使用推送通知,必须先在苹果的推送通知服务里注册你要使用哪几种类型的

控制 打开和关闭远程推送通知

首先初始化一个switch,如下: 我是在cell里面创建的, 然后实现switch的方法: 这里的话,通过判断switch的状态,yes或是no来控制关闭的,因为app首次运行的话,是有一个注册通知的提示框,点击好以后,就可以接受到apns的推送服务了,如果用户点击不允许的话,是不能接收到推送的!切记! 注意这里面的状态判断:1,声明一个bool变量,根据key值取出来,进行关联,注意这样的话,有一个问题,就是switch默认的状态是no,所以如果就直接这样写的话,用户首次运行,apns的服务

推送通知(二)远程通知

远程通知 从远程服务器推送给客户端的通知(需要联网),远程推送服务,又称为APNs(Apple Push Notification Services) 为什么需要远程推送通知? 1. 传统获取数据的局限性:只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的数据内容. 2. 远程推送通知可以解决以上问题:不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通,所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接.  长连接作用:时间校准.系统升级.查找我

iOS开发 - ANPs推送通知 标签: 推送通知ANPs远程推送、本地推送

iOS开发 - ANPs推送通知 标签: 推送通知ANPs远程推送本地推送 2015-05-03 14:12 3510人阅读 评论(0) 收藏 举报 本文章已收录于:  iOS知识库  分类: [IOS -事件响应者链](3)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 推送通知 注意:这里说的推送通知跟NSNotification有所区别 NSNotification是抽象的,不可见的 推送通知是可见的(能用肉眼看到) iOS中提供了2种推送通知 本地推送通知(L

IOS之推送通知(本地推送和远程推送)

推送通知和NSNotification是有区别的: NSNotification:是看不到的 推送通知:是可以看到的 IOS中提供了两种推送通知 本地推送通知:(Local Notification):手机应用本身的通知,比如:闹铃 远程推送通知:(Remote Notification)从服务器发送过来的通知 推送通知的作用:让不在前台运行的App,告知用户App内部发生了什么事情.比如我们正在聊微信,突然界面上面出现了黑色半透明横幅(QQ好友给你发送的消息)这就是一个推送通知. 推送通知的呈

iOS开发中的远程推送实现(最新,支持iOS9)

我的个人项目<丁丁印记>中加入了远程推送功能,按照操作说明去做还是比较容易实现的,但是学的不够不系统,因此这篇文章希望总结一下最新的iOS推送功能,因为iOS8之后的推送和致之前的版本是有所不同的,也希望想能帮助到需要的朋友.这篇文章将从零开始,向大家介绍远程推送功能的原理和使用. 什么是远程推送通知 顾名思义,就是从远程服务器推送给客户端的通知(需要联网)远程推送服务,又称为APNs(Apple Push Notification Services). 为什么程序中需要远程推送功能 1.传统