1.本土推送文告(Local Notification),2.推送公告是可知的

推送布告跟NSNotification不同
1.NSNotification是空虚的,不可见的
2.推送公告是可知的

推送布告跟NSNotification不同
1.NSNotification是空洞的,不可知的
2.推送文告是可见的

推送文告跟NSNotification不相同
1.NSNotification是抽象的,不可知的
2.推送文告是可知的

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

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

iOS中提供了2中推送布告
1.本地推送布告(Local Notification)
2.远程推送布告(Remote Notification)

推送的职能:可以让不在前台运行的app,告知客户app内部爆发的事情.(QQ新闻推送,微信新闻推送等等)

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

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

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

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

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

地面布告

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];
}

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

地方通知

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],跟随手机的时区)

–代码完毕进程:

图片 1

本地公告.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];
}

当新闻被推送过来时,我们必要点击推送消息,来形成部分特定的任务.不如更新界面什么的(监听本地推送布告的点击)

地方布告

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],跟随手机的时区)

–代码完毕进度:

图片 2

地面通告.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];
}

当新闻被推送过来时,大家必要点击推送新闻,来形成部分特定的职务.不如更新界面什么的(监听本地推送公告的点击)

当用户点击本地推送布告的时候,会活动打开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;
}
当用户点击本地推送布告的时候,会自行打开app,这里有2种景况

1.app没有停歇,只是向来隐匿在后台
让app进入前台,并会调用AppDelegate的下边的艺术(不要重新启航app)

图片 3

点击本地布告.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已经被关闭(进度被杀掉)

图片 4

点击本地布告.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;
}
当用户点击本地推送文告的时候,会自行打开app,那里有2种情况

1.app没有停歇,只是一向隐匿在后台
让app进入前台,并会调用AppDelegate的上面的方法(不要重新启航app)

图片 5

点击本地布告.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已经被关闭(进度被杀掉)

图片 6

点击本地布告.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 Services)
斩草除根难点:只要联网了, 就可以吸收到服务器推送的长距离公告
应用须知:
拥有的苹果设备,在联网状态下,都会与苹果服务器建立长连接.
1.长连接:一向总是,客户端与服务器
2.长连接作用:
1>事件校准
2>系统升级
3>查找自身的OPPO等….
3.长连接的补益
1>数据传输速度快
2>数据保持最新境况

长途推送(Remote Notification)

1.从远程服务器推送给客户端的打招呼(需要联网)
2.远程推送服务, 苹果起名为:APNS (Apple Push Notification Services)
竭泽而渔难点:只要联网了, 就可以接收到服务器推送的长距离布告
使用须知:
负有的苹果设备,在联网状态下,都会与苹果服务器建立长连接.
1.长老是:一向总是,客户端与服务器
2.长连接效用:
1>事件校准
2>系统升级
3>查找自己的索尼爱立信等….
3.长连接的好处
1>数据传输速度快
2>数据保持最新气象

远程推送(Remote Notification)

1.从远程服务器推送给客户端的公告(要求联网)
2.远程推送服务, 苹果起名为:APNS (Apple Push Notification Services)
涸泽而渔难点:只要联网了, 就可以吸纳到服务器推送的远距离文告
使用须知:
抱有的苹果设备,在联网状态下,都会与苹果服务器建立长连接.
1.长连连:平昔总是,客户端与服务器
2.长连接成效:
1>事件校准
2>系统升级
3>查找自身的魅族等….
3.长连接的功利
1>数据传输速度快
2>数据保持最新气象

官方结果长连接的行使

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>生成描述文件
[次第安装证书, 再装描述]

合法结果长连接的行使

1.获得deviceToken的过程

图片 7

Snip20151005_1.png

图片 8

Snip20151005_2.png

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

2.利用deviceToken举办多少传输,推送文告

图片 9

Snip20151005_3.png

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

图片 10

 

此处不再演示关于证书的配备, 简单的只举办认证步骤:
1> 创造明确的AppID,唯有明确的AppID才能进行局地格外的操作
2>真机调试的APNS SSL证书
3>发表程序的APNS SSL证书
4>生成描述文件
[次第安装证书, 再装描述]

合法表达长连接的使用

1.获得deviceToken的过程

图片 11

图片 12

1>客户端向苹果服务APNS,发送设备的UDID和波兰语的Bundle Identifier.
2>经苹果服务器加密生成一个deviceToken
3>将日前用户的deviceToken(用户标识),发送给本身使用的服务器
4>自个儿的服务器,将收获的deviceToken,举行封存

2.利用deviceToken展开多少传输,推送布告

图片 13

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

图片 14

此地不再演示关于证书的布置, 简单的只进行求证步骤:
1> 成立明确的AppID,唯有明确的AppID才能展开局地特殊的操作
2>真机调试的APNS SSL证书
3>公布程序的APNS SSL证书
4>生成描述文件
[次第安装证书, 再装描述]

登记远程推送通告:

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

注册远程推送通告:

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已经倒闭,要求再次打开,—基本落到实处格局和地点文告一致。

实际上还有不少第三方推送服务,比如百度云推送、极光、个推,但都是充实了一道环节。

当然的流水线是 :你的服务器->APNS服务器->iOS设备。
用了第三方的就变成:你的服务器->第三方推送服务器->APNS服务器->iOS设备。

原稿链接:http://www.jianshu.com/p/e347f999ed95

登记远程推送通告:

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已经倒闭,须要再度开启,—基本已毕格局和地面通知一致

参考:
iOS音信推送机制