起名iOS信息推送机制

推送公告跟NSNotification不同
1.NSNotification是架空的,不可见的
2.推送通告是可见的

       

iOS中提供了2中推送通告
1.地面推送通告(Local Notification)
2.远程推送公告(Remote Notification)

起名 1

推送的成效:可以让不在前台运行的app,告知客户app内部暴发的事情.(QQ音信推送,微信音信推送等等)

       
大家这一个小组因轮滑而结成,也因轮滑而得了,期间有无数喜洋洋的时光和铭记的记得,我想用文字记录下来,献给我们这段情谊,这段青春。

推送公告的变现效果:
1.在屏幕顶部显示的一条横幅
2.在屏幕中间弹出一个UIAlertView
3.在锁屏界面呈现一块横幅
4.跟新app图标的数字
5.播放音效

         
我们相识于轮滑社,是该校轮滑社的分子,玩了一段时间轮滑,也在一起参预了多少个活动,都相互认识,可是并不了解。我们之间互相熟知是因为一场大型竞技,17年新正呼伦Bell避暑山庄举办班迪球锦标赛,咱们多少个都采纳做助理裁判。
为了有利于联系,我们建了一个座谈组,起名为性感小组,就是这多少个小组,留下了自我大学许多难以忘怀的想起。 
在别墅做助理评判的那几天,天气至极的冷,零下十几度的气候,穿六个大袄依然冻到不行,有时候去的早,就去山庄卫生间取暖,一起聊天组队打游戏,这一个时候再冷也是开玩笑的。

地点公告

1.不需要服务器补助(无需联网)就能发出的推送通告
2.使用情状: 定时类任务(闹钟,简单的游玩之类)

本地通告推送的贯彻很简单:
1.创办本地推送通告对象
[[UILocalNotification alloc] init]创建一个地面通知
2.装置本地通告的相干属性
非得设置的特性
2.1.推送公告的触发时间(什么日期暴发推送布告)
@property(nonatomic,copy) NSDate *fireDate
2.2.推送通告的具体内容
@property(nonatomic,copy) NSString *alertBody
2.3.在锁屏时显示的动作标题(完整测标题:”滑动来” + alertAction)
@property(nonatomic,copy) NSString *alertAction
2.4.设置锁屏界面alertAction是否有效
localNote.hasAction = YES;
2.5.app图标数字
@property(nonatomic,assign) NSInteger applicationIconBadgeNumber
2.6.调度本地推送通知(调度完毕后,推动通告会在特定时间fireDate发出)
[[UIApplication shareApplication] scheduleLocalNotification:ln]
可以举行安装的安装
2.7.装置文告中央通报的标题
localNote.alertTitle = @"222222222222";
2.8.装置音效(要是不设置就是系统默认的音效,
设置的话会在mainBundle中找找)
localNote.soundName = @"buyao.wav";
2.9.每隔多久重复发四遍推送公告
@property(nonatomic) NSCalendarUnit repeatInterval
2.10.点击推送通告打开app时呈现的开行图片(mainBundle 中领取图片)
@property(nonatomic,copy) NSSring *alertLaunchImage
2.11.叠加的额外音讯
@property(nonatomic,copy) NSDictionary *userInfo
2.12.时区
@property(nonatomic,copy) NSTimeZone *timeZone
(一般设置为[NSTimeZone defaultTimeZone],跟随手机的时区)

–代码实现过程:

本土公告.gif

/*
 @property(nonatomic,copy) NSDate *fireDate;
 @property(nonatomic,copy) NSTimeZone *timeZone; 时区

 @property(nonatomic) NSCalendarUnit repeatInterval; 重复间隔(枚举)
 @property(nonatomic,copy) NSCalendar *repeatCalendar; 重复日期(NSCalendar)

 @property(nonatomic,copy) CLRegion *region 设置区域(设置当进入某一个区域时,发出一个通知)

 @property(nonatomic,assign) BOOL regionTriggersOnce YES,只会在第一次进入某一个区域时发出通知.NO,每次进入该区域都会发通知

 @property(nonatomic,copy) NSString *alertBody;      

 @property(nonatomic) BOOL hasAction;                是否隐藏锁屏界面设置的alertAction
 @property(nonatomic,copy) NSString *alertAction;    设置锁屏界面一个文字

 @property(nonatomic,copy) NSString *alertLaunchImage;   启动图片
 @property(nonatomic,copy) NSString *alertTitle

 @property(nonatomic,copy) NSString *soundName;

 @property(nonatomic) NSInteger applicationIconBadgeNumber;

 @property(nonatomic,copy) NSDictionary *userInfo; // 设置通知的额外的数据
 */

- (IBAction)addLocalNote:(id)sender {
    // 1.创建一个本地通知
    UILocalNotification *localNote = [[UILocalNotification alloc] init];

    // 2.设置本地通知的一些属性(通知发出的时间/通知的内容)
    // 2.1.设置通知发出的时间
    localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:5.0];
    // 2.2.设置通知的内容
    localNote.alertBody = @"吃饭了吗?";
    // 2.3.设置锁屏界面的文字
    localNote.alertAction = @"查看具体的消息";
    // 2.4.设置锁屏界面alertAction是否有效
    localNote.hasAction = YES;
    // 2.5.设置通过点击通知打开APP的时候的启动图片(无论字符串设置成什么内容,都是显示应用程序的启动图片)
    localNote.alertLaunchImage = @"111";
    // 2.6.设置通知中心通知的标题
    localNote.alertTitle = @"222222222222";
    // 2.7.设置音效
    localNote.soundName = @"buyao.wav";
    // 2.8.设置应用程序图标右上角的数字
    localNote.applicationIconBadgeNumber = 1;
    // 2.9.设置通知之后的属性
    localNote.userInfo = @{@"name" : @"张三", @"toName" : @"李四"};

    // 3.调度通知
    [[UIApplication sharedApplication] scheduleLocalNotification:localNote];
}

当音信被推送过来时,大家需要点击推送信息,来成功部分特定的任务.不如更新界面什么的(监听本地推送公告的点击)

起名 2

当用户点击本地推送通告的时候,会自行打开app,这里有2种情景

1.app没有停歇,只是一向隐匿在后台
让app进入前台,并会调用AppDelegate的底下的法门(毫不重新起动app)

点击本地文告.gif

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
—-代码实现

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    // 在这里写跳转代码
    // 如果是应用程序在前台,依然会收到通知,但是收到通知之后不应该跳转
    if (application.applicationState == UIApplicationStateActive) return;

    if (application.applicationState == UIApplicationStateInactive) {
        // 当应用在后台收到本地通知时执行的跳转代码
        [self jumpToSession];
    }

    NSLog(@"%@", notification);
}

- (void)jumpToSession
{
    UILabel *redView = [[UILabel alloc] init];
    redView.backgroundColor = [UIColor redColor];
    redView.frame = CGRectMake(0, 100, 300, 400);
    redView.numberOfLines = 0;
    // redView.text = [NSString stringWithFormat:@"%@", launchOptions];
    [self.window.rootViewController.view addSubview:redView];
}

2.app已经被关门(进程被杀死)

点击本地通告.gif

最先app,启动完毕会调用AppDelegate的底下的点子
- (BOOL)application:(UIApplication *)application didFinishLaunchWithOptions:(NSDictionary *)launchOptions;
launchOptions参数通过UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知对象
急需特别注意的是:在iOS8.0自此本地通告有了一些变型,即使要使用当地通告,需要得到用户的许可.
didFinishLaunchWithOptions主意中添加如下代码:

#define IS_iOS8 ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)

 if (IS_iOS8) {
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];
        [application registerUserNotificationSettings:settings];
    }

—–代码实现相关操作

#define IS_iOS8 ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    /*
     UIUserNotificationTypeNone    = 0,      不发出通知
     UIUserNotificationTypeBadge   = 1 << 0, 改变应用程序图标右上角的数字
     UIUserNotificationTypeSound   = 1 << 1, 播放音效
     UIUserNotificationTypeAlert   = 1 << 2, 是否运行显示横幅
     */

    [application setApplicationIconBadgeNumber:0];

    if (IS_iOS8) {
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];
        [application registerUserNotificationSettings:settings];
    }

    // 如果是正常启动应用程序,那么launchOptions参数是null
    // 如果是通过其它方式启动应用程序,那么launchOptions就值
    if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
        // 当被杀死状态收到本地通知时执行的跳转代码
        // [self jumpToSession];
        UILabel *redView = [[UILabel alloc] init];
        redView.backgroundColor = [UIColor redColor];
        redView.frame = CGRectMake(0, 100, 300, 400);
        redView.numberOfLines = 0;
        redView.text = [NSString stringWithFormat:@"%@", launchOptions];
        [self.window.rootViewController.view addSubview:redView];
    }

    return YES;
}

       
期末考试前的这段日子,轮滑社很五人都没空复习,再添加夜间天气特别冷,所以没人出来玩轮滑。可是大家多少个不等同,我们早晨约在联合吃晚饭,然后找个空体育场馆去读书,学习一会然后轮滑,这段时光的夜间,大学城的途中总是会有我们多少个的身形,我们这段时间,无数次围绕着大学城刷街,深夜九点钟左右,零下十几度的气候,在路灯的照明下,大家边滑边说笑,偶尔遇上路边感兴趣的东西,玩一会再前行。这段时间,我们学校门口卖吃的东西的不多,我们多少个就去其它学校门口,去买东西吃,你买这等同自己买这无异,最终在一块吃,大家在一块,总是充满了愉悦。

长途推送(Remote Notification)

1.从远程服务器推送给客户端的打招呼(需要联网)
2.远程推送服务, 苹果起名为:APNS (Apple Push Notification Service(Service)s)
化解问题:只要联网了, 就可知收到到服务器推送的远程通告
行使须知:
富有的苹果设备,在联网状态下,都会与苹果服务器建立长连接.
1.长一连:平昔总是,客户端与服务器
2.长连接效率:
1>事件校准
2>系统升级
3>查找自身的索尼爱立信等….
3.长连接的益处
1>数据传输速度快
2>数据保持最新气象

       
记得有五次,早上九点钟左右,立时快要关宿舍了,小组的一个小伙伴不开玩笑,说想出去喝酒,大家多少个想都没想,拿起手机就去找她,最终在市里找了一家营业的的食堂陪她喝酒,她说“我确实特别震撼,这几天特别不开玩笑,不开玩笑的时候就想和你们在一道,我说不心潮澎湃想出去喝酒,我们都陪自己一块儿,真的很激动。”从这点就能看出来大家多少个的涉嫌,她不快意时首先个想到的是我们多少个,而我辈可以在他索要大家的第一时间过去陪她。吃完饭已经凌晨了,我们多少个在市中心的广场转转了会,拍了一会照片,那一天恰好是5.20号,所以我们都发了个朋友圈,5.20和你们在一道,有你们真好。

法定结果长连接的利用

1.获得deviceToken的过程

Snip20151005_1.png

Snip20151005_2.png

1>客户端向苹果服务APNS,发送设备的UDID和藏语的Bundle Identifier.
2>经苹果服务器加密生成一个deviceToken
3>将眼前用户的deviceToken(用户标识),发送给自己使用的服务器
4>自己的服务器,将取得的deviceToken,进行封存

2.利用deviceToken展开数据传输,推送公告

Snip20151005_3.png

5>需要推送的时候,将音讯和deviceToken一起发送给APNS,苹果服务器,再通过deviceToken找到用户,并将新闻发给用户

这里不再演示关于证书的配备, 简单的只举办求证步骤:
1> 创立明确的AppID,唯有明确的AppID才能展开一些特有的操作
2>真机调试的APNS SSL证书
3>宣布程序的APNS SSL证书
4>生成描述文件
[逐一安装证书, 再装描述]

起名 3

注册远程推送公告:

1.客户端假诺想要接收APNs的长途推送通告,必须先举办注册(得到用户授权)
诚如在APP启动完毕后就随即开展注册

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
        // 1.注册UserNotification,以获取推送通知的权限
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge categories:nil];
        [application registerUserNotificationSettings:settings];

        // 2.注册远程推送
        [application registerForRemoteNotifications];
    } else {
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeNewsstandContentAvailability | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
    }

    return YES;
}

2.挂号成功后, 调用AppDelegate的法门,获取到用户的deviceToken

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // <32e7cf5f 8af9a8d4 2a3aaa76 7f3e9f8e 1f7ea8ff 39f50a2a e383528d 7ee9a4ea>
    // <32e7cf5f 8af9a8d4 2a3aaa76 7f3e9f8e 1f7ea8ff 39f50a2a e383528d 7ee9a4ea>
    NSLog(@"%@", deviceToken.description);
}

3.点击推送通知,和地面一样有二种情况.
1> app没有关闭,只是间接隐匿在后台
让app进入前台, 并调用下面的办法(app没有重新开动)
起名,逾期的主意:

// 当接受到远程退职时会执行该方法(当进入前台或者应用程序在前台)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    NSLog(@"%@", userInfo);

    UIView *redView = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    redView.frame = CGRectMake(100, 100, 100, 100);
    [self.window.rootViewController.view addSubview:redView];
}

苹果系统指出选取下边的章程:

/*
 1.开启后台模式
 2.调用completionHandler,告诉系统你现在是否有新的数据更新
 3.userInfo添加一个字段:"content-available" : "1" : 只要添加了该字段,接受到通知都会在后台运行
 */
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"%@", userInfo);
    UIView *redView = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    redView.frame = CGRectMake(100, 100, 100, 100);
    [self.window.rootViewController.view addSubview:redView];

    completionHandler(UIBackgroundFetchResultNewData);
}

2>app已经倒闭,需要再一次开启,—基本实现形式和当地通告yi’zhi

         
我们多少个假若有人过生日,我们就会在一道出去玩,有一段时间大家几个都在兼职,有多少个他们兼任的地方在郊区离学校比较远,下班时间也正如晚,大家多少个就倒了趟公交车,过去找她们,在那边找了家能吃饭能唱歌的ktv,边吃边玩。我们在饭桌上能够肆无忌惮的闲谈,想说什么样就说什么样,不用考虑那么多,我们平常在协同互怼,完全不用担心对方迫不及待,我们在一块吃饭,也不用在乎那么多饭桌礼仪,想怎么吃就怎么吃,有时候几人同时争着夹一个菜,看什么人可以吃到嘴里,我们在一块也不会有人逼着你喝酒,想喝就喝,不想喝就喝饮料,总之,只要大家在一块,就会有无穷的快乐。

       
我们在该校隔三差五约饭和约轮滑,每日清晨到饭点在群里喊,约饭了,约饭了老食堂三楼,总是在打打闹闹中把饭吃完,傍晚经常在一块玩轮滑,一块磨炼轮滑动作,不想练了,就出校门买烤冷面和铁板烧吃,大家友情最好的知情人就是,我一个学期长了十几斤称。有时候自己都挺羡慕我要好,在高校,有这样一群朋友,可以一块玩一块闹。不过呢,我们这一场友谊就保障了一年时光。

     
先天,有人退出了嗲声嗲气小组这一个属于大家的群,发布了俺们小组友谊的根本终结。其实,固然不退,这一个群也未尝了留存价值,已经好久好久没有人在里面说过话了,尽管有人说话也很少有人立时,随着我们之间友谊的掉以轻心,这么些群也已经失去了过去的热闹。

起名 4

       
暑假的时候有多少个选项去集训,进步轮滑技术,我犹豫好久,因为家里面的事,选拔了回家,当时自家还操心开学会和她俩中间疏远,后来事实注解,我想多了,我和他们之间友谊如故,一点尚无变,反而他们集训的,因为各类原因,关系变的很不佳。再添加开学社团纳新,关于管理协会的片段工作,他们意见不合,关系进一步执着,有些人会师如故连话都不说,最开首大家几个还对这一个小组抱有一丝希望,认为我们还是可以像在此以前一样,后来,我意识我想多了,他们的关系已经僵到不能挽回。

     
无论怎么,她们都是自己的好情人,我们已经在一块有过不少心满意足的时刻,即便小组散了,不过这段回想永远会留在我的脑中,感谢遇见,感谢曾经有你们,感谢。

     

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图