码迷,mamicode.com
首页 > 移动开发 > 详细

iOS 消息推送及本地通知,原理解析

时间:2015-07-23 23:59:33      阅读:2670      评论:0      收藏:0      [点我收藏+]

标签:消息通知 本地通知 ios远程通知原理解

在此整理了一些前辈的思路,根据自己对问题的理解及相似方面的比较做了这篇笔记,本文并未详细讲解,只是根据自己提出问题进行一个解决,希望能对大家有些帮助。

1. deviceToken与UUID,UDID的区别



deviceToken :
A token that identifies the device to APS. The token is an opaque data type because that is the form that the provider needs to submit to the APS servers when it sends a notification to a device. The APS servers require a binary format for performance reasons.
Note that the device token is different from the uniqueIdentifier property of UIDevice because, for security and privacy reasons, it must change when the device is wiped.


当设备被擦除后,token必须变化。


UUID:Universally Unique IDentifiers,翻译过来就是“全局唯一标志符”
UUID是一个标识你系统中的存储设备的字符串,其目的是帮助使用者唯一的确定系统中的所有存储设备,不管它们是什么类型的。它可以标识DVD驱动器,USB存储设备以及你系统中的硬盘设备等。一个典型的UUID看起来就是这样:
BF930680-9994-442C-8A6C-FB4FD0707EB2(128bit 32位16进制)


为什么使用UUID:
> 1.它是真正的唯一标志符
UUID为系统中的存储设备提供唯一的标识字符串,不管这个设备是什么类型的。如果你在系统中添加了新的存储设备如硬盘,很可能会造成一些麻烦,比如说启动的时候因为找不到设备而失败,而使用了UUID则不会有这样的问题。


> 2.设备名并非总是不变的
自动分配的设备名称并非总是一致的,它们依赖于启动时内核加载模块的顺序。如果你在插入了USB盘时启动了系统,而下次启动时又把它拔掉了,就有可能导致设备名分配不一致。
使用UUID对于挂载移动设备也非常有好处——例如我有一个24合一的读卡器,它支持各种各样的卡,而使用UUID总可以使用同一块卡挂载在同一个地方。


> 3.ubuntu中的许多关键功能现在开始依赖于UUID





操作步骤前的一些原理:
device token,即设备令牌,不是系统唯一标识,需要在应用启动时发起到apple服务器请求,注册自己的设备和应用,并获得这个device token。


device token有什么用?如果应用需要push notification给手机,那么它要有个服务器端(provider),但是它发出的信息不是直接给手机的,而是必须统一交给apple的服务器,这个服务器就是apple push notification server(apns)。apple服务器通过这个token,知道应用要发的消息是给哪个手机设备的,并转发该消息给手机,手机再通知应用程序。


UDID:Unique Device Identifier,它是苹果IOS设备的唯一标识码,它由40个字符的字母和数字组成(越狱的设备通过某些工具可以改变设备的UDID)。移动网络可利用UDID来识别移动设备,但是,从iOS5.0(2011年8月份)开始,苹果宣布将不再支持用uniqueIdentifier方法获取设备的UDID,iOS5以下是可以用的。在2013年3月21日苹果已经通知开发者:从2013年5月1日起,访问UDIDs的程序将不再被审核通过,替代的方案是开发者应该使用“在iOS6中介绍的Vendor或Advertising标识符”。所以UDID是绝对不能用了。


更多信息参见:http://zengrong.net/post/2152.htm




2. 推送的各个阶段:
> app 注册推送服务通知(向iOS)
> iOS系统向APNS服务器请求一个device token
> app接收到device token
> app向你自己的服务器发送token
> 当有些事情触发你的推送服务时,向APNS发送一个推送通知。
> APNS发送这个推送通知到你的app


证书配备完成后:
  > 在项目的AppDelegate中的didFinishLaunchingWithOptions方法中加入下面的代码:


#define iOS8 [[UIDevice currentDevice] systemVersion].doubleValue >= 8.0




- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    // 要区分是否为ios8
#ifdef iOS8
        UIUserNotificationSettings *notiSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound) categories:nil];
        [application registerUserNotificationSettings:notiSettings];
#else
        [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound)];
#endif


> 添加接收信息部分
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NSLog(@"deviceToken");
}


-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    // 确实接收到推送信息
    NSLog(@"%@",userInfo);
}


3. 本地通知 :一定要进入到后台后才能看到效果
    UILocalNotification *notification = [[UILocalNotification alloc] init];
    if (notification != nil) {
        NSDate *now = [NSDate new];
        notification.fireDate = [now addTimeInterval:10.0];
        notification.timeZone = [NSTimeZone defaultTimeZone];
        notification.alertBody = @"要去吃晚饭了";
        application.applicationIconBadgeNumber = 10; // 显示到Icon的图标右上角
        [application scheduleLocalNotification:notification];
    }


UILocalNotification的实例,主要有三类属性
* scheduled time, 时间周期,用来指定iOS系统发送通知的日期和时间; 
* notification type,通知类型,包括警告信息、动作按钮的标题、应用图标上的badge(数字标记)和播放的声音;
* 自定义数据,本地通知可以包含一个dictionary类型的本地数据


4. 远程通知(第3点上的所有通知皆为远程通知)
设备的准备
首先要知道,push notification 只能在真机上运行的,无法在模拟器上使用,如果在模拟器上运行,在注册时会有类似如下错误:
Error in registration. Error: Error Domain=NSCocoaErrorDomain Code=3010 "remote notifications are not supported in the simulator" UserInfo=0x5d249d0 {NSLocalizedDescription=remote notifications are not supported in the simulator}
真机也需要注意,如果没有越狱,没有问题。越狱的话,比如通过blacksnOw,因为没有经过iTunes,无法生成有效的设备证书(device certificate),因此注册的时候不会成功。


具体可参考:http://blog.csdn.net/kiki1985/article/details/8809220

版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS 消息推送及本地通知,原理解析

标签:消息通知 本地通知 ios远程通知原理解

原文地址:http://blog.csdn.net/linfengwenyou/article/details/47029293

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!