使用Azure notification hub推送消息到xamarin手机应用

原创 2016年06月09日 18:11:52

Xamarin.Forms相关文章

Azure notification hub是微软云提供的消息推送服务。

Xamarin是一个app开发框架,它使用C#来开发winphone,iOS,Android。目前是由微软收购并入自己的开发环境中,可以免费使用。

本文主要介绍Azure notification hub消息推送,Xamarin不作为本文重点。

移动应用程序很多情况下需要进行消息推送。在中国常用的是极光推送,可以进行多平台推送。本文介绍的Azure notification hub也是可以进行多平台消息推送的机制。由于google不在中国提供服务所以在写本文的当前Android还不能接收到google GCM的消息推送。

 

下图为Azure notification hub消息推送的流程:

1.客户端应用程序向PNS请求handle。PNS是消息推送平台(包括APNS,GCM,WNS,MPNS,ADM,Baidu),对于 GCM,它是一个RegistionID,对于 APNS,它是一个deviceToken。
2.客户端应用程序将此句柄传给应用后端,应用程序后端传给Notification Hub中以供将来使用。Notification Hub 和应用程序后端共同可以看做一个整体,对于GCM, WNS, Apple提供服务。
3.发送推送通知,应用后端通知Notification Hub,Notification Hub根据要推送的平台使用句柄联系相应的PNS,以定向到特定客户端应用程序的实例。PNS 将通知转发到句柄指定的设备。

iOS应用的消息推送配置大家可以参照下面两篇文章配置。

http://jingyan.baidu.com/article/c275f6ba25e94fe33d756719.html

http://my.oschina.net/u/2361492/blog/524021

在配置过程中有出现过一个问题,有些证书不能导出.p12文件。原因是这个证书没有 private key,解决方法可以尝试将这个证书放到login目录下面再查看该证书是否已经有了private key。

iOS消息推送配置中生成的.p12文件在之后Azure notification hub的配置中需要用到。

进入https://portal.azure.com

创建Azure notification hub。

配置apple消息推送服务。

上传apple中生成的.p12文件,Password是.p12导出时设置的密码。

DefaultFullSharedAccessSugbature是访问Notification hub的URL,我们的应用程序后端在推送消息的时候会用到。

现在Azure notification hub的配置完成。

 

操作Notification Hub推送消息

首先移动设备需要按照自己的平台进行注册。以下代码为Xamarin.Forms的iOS项目部分。

namespace SimpleImageTestApp.iOS
{
    [Register("AppDelegate")]
    public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
    {
        //向后端API注册
        private RegisterClient registerClient = new RegisterClient();

        public override bool FinishedLaunching(UIApplication app, NSDictionary options)
        {
            global::Xamarin.Forms.Forms.Init();

            LoadApplication(new App());

            //向APNS注册
            if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))
            {
                var pushSettings = UIUserNotificationSettings.GetSettingsForTypes(
                       UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound,
                       new NSSet());

                UIApplication.SharedApplication.RegisterUserNotificationSettings(pushSettings);
                UIApplication.SharedApplication.RegisterForRemoteNotifications();
            }
            else
            {
                UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound;
                UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(notificationTypes);
            }

            return base.FinishedLaunching(app, options);
        }

        //向APNS注册得到deviceToken
        public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
        {
            Register(deviceToken);
        }
        //将该应用程序向APNS注册得到的deviceToken传给服务器后端 
        private async void Register(NSData deviceToken)
        {
            try
            {
                // Modify device token
                string _deviceToken = deviceToken.Description;
                _deviceToken = _deviceToken.Trim('<', '>').Replace(" ", "");
                SimpleImageTestApp.API.Storage.ISaveUser.RegistrationID = _deviceToken;
                // Get Mobile Services client
                await registerClient.RegisterAsync(_deviceToken, new HashSet<String>());
            }
            catch (Exception ex)
            {
            }

        }
		
        //接收APNS消息推送
        public override void ReceivedRemoteNotification(UIApplication application, NSDictionary userInfo)
        {
            NSObject inAppMessage;
            bool success = userInfo.TryGetValue(new NSString("aps"), out inAppMessage);
            if(success)
            {
                UILocalNotification notification = new UILocalNotification();
                NSDate.FromTimeIntervalSinceNow(1);
                notification.AlertAction = "";
                notification.AlertBody = inAppMessage.ToString();
                UIApplication.SharedApplication.ScheduleLocalNotification(notification);
            }
        }

        public override void FailedToRegisterForRemoteNotifications(UIApplication application, NSError error)
        {
            base.FailedToRegisterForRemoteNotifications(application, error);
        }
    }
}

Microsoft.Azure.NotificationHubs.NotificationHubClient 是C#代码中操作Notification Hub的类
ConnectionString为配置步骤中的DefaultFullSharedAccessSugbature

应用程序后端连接Notification Hub

var HubClient = NotificationHubClient.CreateClientFromConnectionString("ConnectionString","HubName");

iOS设备向APNS注册后,把得到的deviceToken传到应用程序后端,应用程序后端用deviceToken和tags向Notification Hub注册。

NotificationHubClient.CreateAppleNativeRegistrationAsync(string deviceToken, System.Collections.Generic.IEnumerable<string> tags)

在发送推送消息时可以用tags控制向哪些设备发送,使用tags可以实现向单人、组发送。比如在用户登录之后使用UserID作为tags注册就可以实现给单人发送。由于应用程序可能会受到攻击,因此保护特定标记的注册需要格外小心,tags可以由应用程序后端来给出,这样可以增加标记级安全性。

NotificationHubClient.SendAppleNativeNotificationAsync按照tag发送消息。

System.Threading.Tasks.Task<Microsoft.Azure.NotificationHubs.NotificationOutcome> SendNotificationAsync(string jsonPayload, string tagExpression)

Azure对JavaScript也提供了支持,使用npm install azure-sb安装支持包,调用的函数和C#代码中的函数基本一致

 

Android5.0 拦截第三方推送的通知消息

相信大家在开发的过程中一定也会遇到这样的需求:屏蔽第三方的推送通知。那么怎么屏蔽呢,今天就为大家说明一下怎么拦截APP的推送通知。 其实不止是第三方有推送消息,Android本身的模块也有推送消息的,...
  • lyjIT
  • lyjIT
  • 2016年06月30日 14:58
  • 2873

服务器主动向android手机端推送消息

前两篇简单介绍了下Web Service。下面就将此项技术与开源项目androidpn结合起来,实现服务器向android手机端推送消息。 首先在eclipse中打开Androidpn服务器端,...
  • wgsz888
  • wgsz888
  • 2014年10月13日 16:11
  • 3496

通过推送消息控制Android系统锁屏、唤醒

最近一年以来,博主一直在搞密室逃脱方面的东西。涉及到的技术很杂,不少也很冷门。 前段时间有这样一个有意思的需求:要求服务器在达到一定要求时唤醒一台待机的投影仪自动进行播放,并且在不同的条件下播放不...
  • jinciyulang
  • jinciyulang
  • 2016年01月19日 11:06
  • 3226

在SAE使用Apple Push Notification Service服务开发iOS应用, 实现消息推送

在SAE使用Apple Push Notification Service服务开发iOS应用, 实现消息推送 From: http://saeapns.sinaapp.com/doc.html ...
  • wave_1102
  • wave_1102
  • 2012年06月16日 16:34
  • 15059

在SAE使用Apple Push Notification Service服务开发iOS应用, 实现消息推送

1,在iOS开发者中心: iOS Provisioning Portal 创建一个AppID,如图: 2,生成iOS Push Service证书,如图: 按照上述提示操作...
  • leonpengweicn
  • leonpengweicn
  • 2014年10月24日 11:29
  • 752

微软云技术Windows Azure专题(二):如何利用Mobile向Windows商店应用推送消息(1)

本文介绍了如何使用Windows Azure的Mobile Service发送推送信息Windows商店应用程序。   建立一个Mobile Service的同时Azure会自动创建一个数据库。推送...
  • arsenal1109389480
  • arsenal1109389480
  • 2013年10月05日 03:46
  • 2191

微软云技术Windows Azure专题(一):如何利用Service Bus向Windows商店应用推送消息

本文介绍了如何使用Windows Azure的Service Bus通知中心发送推送通知Windows商店应用程序。   先来明确一下大体上要做哪些步骤: 1.申请一个Windows应用商店的应用。...
  • arsenal1109389480
  • arsenal1109389480
  • 2013年10月05日 02:44
  • 2167

微软云技术Windows Azure专题(三):如何利用Mobile向Windows商店应用推送消息(2)

上一讲我们讲了如何利用Mobile向Windows商店应用推送消息。可是用心的朋友会发现,这个推送只能对自己当前的电脑有效,并不能推送给所有安装了这个应用的用户。     哈哈,其实这里边用到了通道的...
  • arsenal1109389480
  • arsenal1109389480
  • 2013年10月05日 13:30
  • 1745

PHP代码发送IOS推送消息 PUSH IOS NOTIFICATION

  • 2014年02月14日 11:42
  • 863B
  • 下载

宣布正式发布 Windows Azure Notification Hub,新增 SQL Server AlwaysOn 可用性组侦听器支持

今天,我们非常高兴地宣布,针对使用 Windows Azure 的移动和企业开发人员推出一些新功能。这些新功能可以减少构建移动应用程序的开发时间和成本,并能帮助企业开发人员实现高可用性和全球业务连续性...
  • azurechina
  • azurechina
  • 2013年08月15日 17:06
  • 1293
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Azure notification hub推送消息到xamarin手机应用
举报原因:
原因补充:

(最多只允许输入30个字)