iOS 推送

长距离推送(Remote Notification)

一.从远程服务器推送给客户端的打招呼(供给联网)
二.远程推送服务, 苹果起名字为:APNS (Apple Push Notification Services)
消除难题:只要联网了, 就可知接受到服务器推送的长途文告
选拔须知:
不无的苹果设备,在联网状态下,都会与苹果服务器建立长连接.
一.长连续:一直总是,客户端与服务器
二.长连接功能:
壹>事件校准
贰>系统进级
3>查找本身的BlackBerry等….
三.长连接的好处
一>数据传输速度快
二>数据保持最新情形

   class student
    {
        private int age;
        private string name;
        public static int schoolage;  //静态成员

登记远程推送文告:

一.客户端如若想要接收APNs的长距离推送通告,必须先实行注册(获得用户授权)
诚如在应用程式运维完结后就马上打开挂号

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

二.挂号成功后, 调用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);
}

三.点击推送布告,和本地一样有二种情状.
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);
}

二>app已经关门,必要再一次展开,—基本完毕格局和地面公告1致。

骨子里还有为数不少第一方推送服务,比如百度云推送、极光、个推,但都以增加了壹道环节。

理所当然的流水生产线是 :你的服务器->APNS服务器->iOS设备。
用了第壹方的就成为:你的服务器->第2方推送服务器->APNS服务器->iOS设备。

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

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

本地文告

壹.不要求服务器援救(无需联网)就能发生的推送布告
二.选取意况: 按时类任务(时钟,轻巧的六日游之类)

本地公告推送的落实异常粗略:
壹.开立当地推送公告对象
[[UILocalNotification alloc] init]创制三个本地公告
2.设置本地布告的连锁属性
务必安装的习性
2.一.推送通告的触及时间(什么时候产生推送布告)
@property(nonatomic,copy) NSDate *fireDate
二.贰.推送通告的具体内容
@property(nonatomic,copy) NSString *alertBody
二.三.在锁屏时显得的动作标题(完整测标题:”滑动来” + alertAction)
@property(nonatomic,copy) NSString *alertAction
二.四.装置锁屏分界面alertAction是或不是行得通
localNote.hasAction = YES;
2.伍.appLogo数字
@property(nonatomic,assign) NSInteger applicationIconBadgeNumber
二.陆.调度本地推送公告(调度实现后,拉动布告会在一定期刻fireDate发出)
[[UIApplication shareApplication] scheduleLocalNotification:ln]
能够进行安装的装置
二.柒.安装文告中央通报的标题
localNote.alertTitle = @"222222222222";
二.八.安装音响效果(假若不设置正是系统暗中认可的音响效果,
设置的话会在mainBundle中搜索)
localNote.soundName = @"buyao.wav";
二.9.每隔多久重复发二次推送文告
@property(nonatomic) NSCalendarUnit repeatInterval
2.拾.点击推送通知展开app时展现的开发银行图片(mainBundle 中提取图片)
@property(nonatomic,copy) NSSring *alertLaunchImage
贰.11.增大的附加新闻
@property(nonatomic,copy) NSDictionary *userInfo
2.12.时区
@property(nonatomic,copy) NSTimeZone *timeZone
(1般设置为[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];
}

当新闻被推送过来时,大家须求点击推送新闻,来完结都部队分一定的职务.比不上更新分界面什么的(监听本地推送文告的点击)

 反之,全部非静态的成员,方法,都是对类的实例化对象开始展览操作,所以每当实例化3个指标,就会去实行1回相应的组织函数 

官方结果长连接的利用

1.获得deviceToken的过程

图片 2

Snip20151005_1.png

图片 3

Snip20151005_2.png

壹>客户端向苹果服务APNS,发送设备的UDID和阿拉伯语的Bundle Identifier.
2>经苹果服务器加密生成贰个deviceToken
三>将眼下用户的deviceToken(用户标志),发送给本身使用的服务器
四>自个儿的服务器,将得到的deviceToken,举行保存

2.利用deviceToken拓展多少传输,推送公告

图片 4

Snip20151005_3.png

伍>供给推送的时候,将信息和deviceToken一同发送给APNS,苹果服务器,再通过deviceToken找到用户,并将音讯发给用户

图片 5

 

此间不再演示关于证书的布局, 轻易的只进行认证步骤:
1> 创设分明的AppID,唯有明显的AppID手艺进行部分相当的操作
二>真机调节和测试的APNS SSL证书
三>发表程序的APNS SSL证书
四>生成描述文件
[各类安装证书, 再装描述]

        public student(int Age, string Name) 
        {
            this.age = Age;
            this.name = Name;
        }

推送文告跟NSNotification差异
一.NSNotification是虚幻的,不可知的
二.推送通告是可知的

        public int Age
        {
            get { return age; }
            set { age = value; }
        }

iOS中提供了第22中学推送通告
一.地面推送公告(Local Notification)
二.远程推送通告(Remote Notification)

        public void Show() 
        {
            Console.WriteLine(“笔者的名字叫{0},笔者今年{一}岁”,this.name,this.age);
        }
    }

当用户点击本地推送布告的时候,会活动张开app,那里有二种情况

1.app没有关闭,只是直接隐匿在后台
让app进入前台,并会调用AppDelegate的上面的方法(无须重新起动app)

图片 6

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

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

图片 7

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

        //调用了带三个参数的构造函数
        public student(int Age):this(Age,”未起名”)
        {
        }

推送文告的展现效果:
一.在显示屏顶部呈现的一条横幅
贰.在显示屏中间弹出二个UIAlertView
3.在锁屏分界面展现壹块横幅
四.跟新appLogo的数字
伍.广播音响效果

        //静态构造函数必须无参数和无访问修饰符
        //静态构造函数不能够运用this关键字,this是指向目标,而不是类
        //静态构造函数只可以构造静态成员
        //静态构造函数最多只会被施行2次
        static student()
        {
            schoolage = 18;
        }

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

        //调用了带一个参数的构造函数
        public student():this(18) 
        {
        }

 类里面装有宣称为静态的积极分子,方法,都只是对类的概念和操作,类的静态构造函数自然也就只会在操作此类相关的时候被实例化3回

发表评论

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

网站地图xml地图