iOS音信推送机制

by admin on 2019年2月20日

推送通告跟NSNotification不相同
1.NSNotification是指雁为羹的,不可知的
2.推送文告是可知的

当您还年少时总会对成材的干扰感到好笑,已婚汉子被事业、婚姻搞得焦头烂额,单身青年也会被家长逼问找女对象了未曾,过年带不带女对象齐声回家,被逼问的一方往往支支吾吾说不出话来,每到此地你总是会情难自禁偷笑年少真好,没那么多闹心。

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

接二连三认为成人的世界离你自身还很遥远,直到有一天,你也被老人逼问谈对象了从未有过,何时带女友回家,你才恍然意识到,自个儿一度暗中地长大了,成了您早就最不想当的父婆婆了。

推送的机能:能够让不在前台运营的app,告知客户app内部发生的事情.(QQ音讯推送,微信音讯推送等等)

还记得,上初中高中时,班里总有一对人在谈恋爱,父母却告诫你,现在努力学习,到了高校,好女儿有的是,你遵从了二老的配置,熄灭了心灵刚要开放的花火。等考上了大学,你不成熟的儿女气总是惹得女友生气,匆匆谈过两段心思,除了让你成熟了些外,什么都没多余。

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

毕业后的前两年,你在生活的线上苦苦挣扎,白天着力的办事,下班后也不忘记给协调充电。等过了挣扎期,事业开始处于平稳发展的阶段,你才有生气想其他的事务。恰在此刻,你起来注目到您的家长每2九日在你耳边唠叨,你不小了,该找个女对象了,即使不打算很快结婚,也理应先谈着,你无法辩解,只可以满口应是。

本地文告

1.不要求服务器支持(无需联网)就能暴发的推送布告
2.施用情形: 定时类任务(闹钟,不难的玩耍之类)

地点通告推送的贯彻很简短:
必发365bifa0000,1.创造本地推送布告对象
[[UILocalNotification alloc] init]成立3个地点布告
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];
}

当新闻被推送过来时,我们需求点击推送音讯,来成功部分一定的任务.不如更新界面什么的(监听本地推送公告的点击)

实在您也知晓,本人早已到了年龄了,父母的年龄也不小了,他们还频频的盼着抱儿子呢。

当用户点击本地推送文告的时候,会自行打开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 瑟维斯s)
杀鸡取蛋难点:只要联网了, 就可以接受到服务器推送的长距离通告
使用须知:
装有的苹果设备,在联网状态下,都会与苹果服务器建立长连接.
1.长老是:一向总是,客户端与服务器
2.长连接效能:
1>事件校准
2>系统升级
3>查找本人的索尼爱立信等….
3.长连接的好处
1>数据传输速度快
2>数据保持最新气象

再看同学,因为当过几年同学,相互之间太知根知底了,没有对象之间那种由秘密到熟稔的历程,也并未一见倾心时的心跳加快和肾上腺激素极速分泌的鼓舞,你一味不能在校友之间找到爱情的感觉,如同此你的有所的圈子都被拔除了。爱情对您的话就好像有个别遥不可及了。

法定结果长连接的应用

1.获得deviceToken的过程

Snip20151005_1.png

Snip20151005_2.png

1>客户端向苹果服务APNS,发送设备的UDID和俄语的Bundle Identifier.
2>经苹果服务器加密生成1个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.客户端尽管想要接收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

家长的饶舌又在您的耳边绕了几年,而你也逐年地经受了父三姨布置的不偏不倚,从满满的冲突到渐渐地承受再到习惯了接近,或者你也没发现本人的心态已经发出了变通吗?是割舍了爱情吧?是习惯了顺从吗??仍然根本地判断了切实而认命了?或者你也说不清吧。

路走到了那边出现了矛盾,摆在前面的有两条路,在这几个分裂点做个记号吧。

懒惰的你,踏上了那条笔直的路,采用了内部2个还看得相比较雅观的不偏不倚对象,互相在一块儿半年,经过简短的熟练和磨合后,你们最后一起去民政局领了代表着互动做对方天使的红本本,从此执子之手,与子偕老,相互扶持,相濡相呴,共同扶助起1个家。

生存中总免不了磕磕绊绊,勺子总会遇到锅沿,你们也都试着去驾驭对方。纵然天天为油盐酱醋茶而奔忙劳累,但你们终于将生活过了下去,生活也算幸福,你总是会惊讶平平淡淡才是真,只是不可避免地,总是会在有些无人的犄角怀念年轻时的美好的爱情,然则你已判定了切实,爱情再美好,和婚姻总归是见仁见智的。

身残志坚的您,走上了另一条崎岖的路。就算自身平日连接会笑话你,都以奔三的人依旧2只单身狗,可是你总是会表露灿烂的笑脸,微笑着说,自身是一名行者,虽身陷乌黑,可是心却一直在搜寻光明。

即使如此作者老是会劝你尽快找个对象把团结交托出去,但我却打心底羡慕你的单身生活。你办事耐劳努力,总是会碰着上级的夸奖。对仇人忠诚重情义,外人有标题总喜欢找你帮衬。你自信淡定,能从容地回应来自外省的风险。你精晓生活,纵然单独,本身的屋子也会处以得有次序,身上的衣着平素都是整洁,充满阳光的寓意。你热爱生活,假日的您总是带着照相机外出巡游对着大自然的美景拍拍拍。即使如此的您早就很全面了,但你依旧摆脱不了你是单身狗的真情,哈哈哈,请允许作者不顾一切地笑几声吧。

实际,作者直接都晓得,你一贯相信爱情,你将协调的人生演绎的这样可以,是想将更精良的和谐付出你生命中的那些他啊。

只怕,人世间所谓的姻缘,就是在适合的时日,遇见合适的人。有个旁人,一旦相遇,便一眼万年。纵然不知情你的她会怎样时候出现,不过自个儿始终相信,将来的某一天,你们一定会在某些转角互相相遇,相爱,相知,相许,相守平生。众里寻她千百度,蓦然回首,那人却在灯火阑珊处。作者,期待着你们的轶事。。。

发表评论

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

网站地图xml地图