IOS学习——推送
1.应用程序生命周期
Notrunning未运行程序没启动
Inactive未激活程序在前台运行,不过没有接收到事件。在没有事件处理情况下程序通常停留在这个状态;
Active激活程序在前台运行而且接收到了事件。这也是前台的一个正常的模式;
Backgroud后台程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。间到之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态;
Suspended挂起程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存
2.推送相关原理
推送的原理是,iphone连着唯一的一条连接到apple的服务器,由apple的服务器连接到各种邮件、天气、qq、微博服务器。平时就靠apple的服务器与各服务器沟通,有新消息时,才告诉iphone。因此非常省流量,而且省电。iphone可以把所有的第三方进程kill掉,系统底层维持着与apple服务器的连接。而android必须保留进程才能接收信息。在推送之前很多智能系统只能通过轮询的方式不断定期向服务器询问是否有新信息,往往费电和费流量。
消息推送不支持群发,只能一个一个发.如果你的App有100万个用户,要发消息怎么办?一个一个的发呗,发100万次.消息包大概包括两部分:标示用户手机的id(32个字节)+消息体(<=256Bytes),消息体是json字符串,传输过程用ssl加密
deviceToken生成之后不是永远不变化的,当重装系统后将发生变化,正因为token有可能改变,所以建议在appstart的时候即,(didFinishLaunchingWithOptions)的时候调用registerForRemoteNotificationTypes,来检测deviceToken是否改变,如果改变则传送给push服务器,token应该存在本地用来判断是否变化,最好的方法是你第一次获取到deviceToken之后,也提交,然后存在本地,之后每次都比较,发现有变化,就更新你的服务器上的记录,那么旧device在push服务器中的record怎么办,一般是发送给APNS然后通过他的反馈消息来处理用户在device里删除app,调用registerForRemoteNotificationTypes后,成功注册后APNS返回token,然后回调delegate的方法didRegisterForRemoteNotificationsWithDeviceToken如果注册失败则调用,didFailToRegisterForRemoteNotificationsWithError
注意点:在第一次调用registerForRemoteNotificationTypes,方法时候没有联网,则回调的delegate方法不回调用,在第一次调用registerForRemoteNotificationTypes,注册成功之后,之后即使没有联网,在调用registerForRemoteNotificationTypes,方法时候会把上一次的devicetoken作为最新的token,用户在第一次安装app的时候,是一定会向APNS发送手机注册消息,然后APNS给出用户提示是否本地接受推送,如果接受则在通知中的包括,不能推送则在通知中心的不包括(只要设置了都会向本地发消息接受与否在于本地设置)。此时如果卸载app重新安装的话,则用户不会再次收到推送本地判断。而默认是让用户可以接受本地可以接受推送消息,此时如果用户不想接受推送消息可以去通知中心设置
3.推送状态
App关闭(手机顶部会弹出推送alert提示)
点击通知栏(能收到推送消息内容)
didFinishLaunchingWithOptions============================={
UIApplicationLaunchOptionsRemoteNotificationKey={
aps={
alert="1234567878900-------";
badge=1;
sound=default;
};
};
}
点击图标(不能收到推送消息内容)
didFinishLaunchingWithOptions=============================(null)
App后台(手机顶部会弹出推送alert提示)
点击通知栏(能收到推送消息内容)
didReceiveRemoteNotification============================={
aps={
alert="1234567878900-------";
badge=1;
sound=default;
};
}
点击图标(不能收到推送消息内容)
App前台(手机顶部会不会弹出推送alert提示)
可以接受到推送消息内容
didReceiveRemoteNotification============================={
aps={
alert="1234567878900-------";
badge=1;
sound=default;
};
}