什么是推送通知?
APP退到后台,或者关闭时;应用推送一条消息告诉用户某件事情,应用通过点击通知进入到应用相应的页面.
推送通知应用场景?
推送通知应用场景很多比如:
(1)一些任务管理APP,会在任务时间即将到达时,通知你做该任务;
(2)健身App定时提醒你应该健身了;
(3)买过电影火车票后,提前半小时告诉你,电影即将开场,火车即将发车;
(4)当你QQ或者微信收到消息时,即使退到后台,或者关闭APP,也可以收到信息通知告诉我们;
(5)电商APP,推送一条消息通知我们有新品等等
(6)大文件,电影后台下载时,下载完成推送通知告知用户,文件已经下载完成.
推送通知的分类
本地通知:
通知发送方: 开发人员负责在APP内发送
应用场景: 确定知道未来某个时间点应该提醒用户什么
远程推送通知:
远程推送服务,又称为APNs(Apple Push Notification Services)
通知发送方: 服务器
应用场景:
1. 不确定未来某个时间点应该提醒用户什么,临时性的
2. 当APP彻底退出时也想继续让用户获取一些最新消息
推送通知的呈现效果(显示横幅还是UIAlertView,取决于用户的设置)
用户接收的推送通知,都会在通知栏弹出,所有通知都汇总在“通知中心”
在屏幕顶部显示一块横幅(显示具体内容)
在屏幕中间弹出一个UIAlertView(显示具体内容)
在锁屏界面显示一块横幅(锁屏状态下,显示具体内容)
更新app图标的数字(说明新内容的数量)
播放音效(提醒作用)
用户也可以决定是否要开启以下4个功能:
显示App图标数字
播放音效
锁屏显示
显示在“通知中心”
创建本地推送通知对象
UILocalNotification *ln = [[UILocalNotification alloc] init];
设置本地推送通知属性
推送通知的触发时间(何时发出推送通知)
@property(nonatomic,strong) NSDate *fireDate;
推送通知的具体内容
@property(nonatomic,strong) NSString *alertBody;
在锁屏时显示的动作标题(完整标题:“滑动来” + alertAction)
@property(nonatomic,strong) NSString *alertAction;
音效文件名
@property(nonatomic,strong) NSString *soundName;
app图标数字
@property(nonatomic,assign) NSInteger applicationIconBadgeNumber;
发出本地推送通知
调度本地推送通知(调度完毕后,推送通知会在特地时间fireDate发出)
[[UIApplication sharedApplication] scheduleLocalNotification:ln];
获得被调度(定制)的所有本地推送通知
@property(nonatomic,strong)NSArray*scheduledLocalNotifications;
(已经发出且过期的推送通知就算调度结束,会自动从这个数组中移除)
取消调度本地推送通知
- (void)cancelLocalNotification:(UILocalNotification *)notification;
- (void)cancelAllLocalNotifications;
立即发出本地推送通知
- (void)presentLocalNotificationNow:(UILocalNotification *)notification;
本地推送通知的其他属性
每隔多久重复发一次推送通知
@property(nonatomic,assign) NSCalendarUnit repeatInterval;
点击推送通知打开app时显示的启动图片
@property(nonatomic,strong) NSString *alertLaunchImage;
附加的额外信息
@property(nonatomic,strong) NSDictionary *userInfo;
时区
@property(nonatomic,strong) NSTimeZone *timeZone;
(一般设置为[NSTimeZone defaultTimeZone] ,跟随手机的时区)
点击本地推送通知
当用户点击本地推送通知,会自动打开app,这里有2种情况
app并没有关闭,一直隐藏在后台
让app进入前台,并会调用AppDelegate的下面方法(并非重新启动app)
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;
app已经被关闭(进程已死)
启动app,启动完毕会调用AppDelegate的下面方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
launchOptions参数通过UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知对象
iOS 8.0的变化
在iOS 8.0中,如果要使用本地通知,需要得到用户的许可
在didFinishLaunchingWithOptions方法中添加如下代码:
if(系统版本 >= 8.0) { // 注册接收通知的类型
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
[application registerUserNotificationSettings:settings]; // 注册允许接收远程推送通知
[application registerForRemoteNotifications];
} else { // 如果是iOS7.0,使用以下方法注册
[application registerForRemoteNotificationTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound];
}
Swift代码:
func registerAuthor() {
if #available(iOS 8.0, *) {
let type = UIUserNotificationType.Alert.rawValue | UIUserNotificationType.Badge.rawValue | UIUserNotificationType.Sound.rawValue
let sets = UIUserNotificationSettings(forTypes: UIUserNotificationType(rawValue: type), categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(sets)
}
}
控制器:
// 1. 创建一个本地通知
let localNot = UILocalNotification()
// 1.1 设置通知的必选项
localNot.alertBody = "我是一个本地通知"
// 1.2 通知的发送时间
localNot.fireDate = NSDate(timeIntervalSinceNow: 2)
// 重复周期
// localNot.repeatInterval = .Minute
// 设置锁屏滑动文字
localNot.hasAction = true
localNot.alertAction = "回复"
// 启动图片(当用户点击了本地通知, 启动我们APP 的时候, 带的启动图片)
// 如果是在ios9.0以前, 当锁屏界面, 出现一个通知, 用户点击了通知, 启动APP 的时候, 会自动将我们设置的图片, 当做启动图像 来显示
// ios9.0, 这个属性, 不太灵
// 如果这个图片,找不到, 会使用系统默认的启动图片
localNot.alertLaunchImage = "xxx"
// 设置通知弹框的标题
// 标题, 这对于, 通知中心的通知有效
if #available(iOS 8.2, *) {
localNot.alertTitle = "通知标题"
}
// 设置通知的声音
localNot.soundName = "通知声音文件.aac"
// 设置图标右上角的数字(0 代表不显示)
localNot.applicationIconBadgeNumber = 1
// 2. 发送本地通知
// 应用程序级别的操作
// UIApplication.sharedApplication().presentLocalNotificationNow(localNot)
UIApplication.sharedApplication().scheduleLocalNotification(localNot)
// 取消所有计划的通知
UIApplication.sharedApplication().cancelAllLocalNotifications()
远程推送
一.开发iOS程序的推送功能, iOS端需要做的事
1.请求苹果获得deviceToken
2.得到苹果返回的deviceToken,发送deviceToken给公司的服务器
3. 监听用户对通知的点击
二.调试iOS的远程推送功能, 必备条件:
1.真机
2.调试推送需要的证书文件
1> aps_development.cer : 某台电脑就能调试某个app的推送服务
2> iphone5_qq.mobileprovision : 某台电脑就能利用某台设备调试某个程序
三.发布具有推送服务的app
1> aps_production.cer : 如果发布的程序中包含了推送服务,就必须安装这个证书
2> qq.mobileprovision : 某台电脑就能发布某个程序
远程推送应用配置过程
1. 创建支持远程推送功能的App ID
2. 创建调试证书,并选中刚刚创建的App ID
3. 下载CER文件,并导入钥匙串管理
4. 创建发布证书,并选中刚刚创建的App ID
5. 下载CER文件,并导入钥匙串管理
6. 检查App ID,确认证书已经指定
7. 生成描述文件
证书配置01 – 创建App ID
注意
远程推送只能在真机上测试!因此先要保证真机调试的环境没有问题!
远程推送的第一步是要创建App ID
目的是说明哪个App需要使用推送服务
为远程推送服务创建的App ID一定要是全称,不能带有*
证书配置02 – 为App ID创建APNs SSL证书
有生产证书和发布证书,生产证书用来调试,发布证书用来发布应用,应用上线之前必须配置好推送发布证书,发布应用之后才能使用推送功能,如果上线的应用推送证书没有配置好,打包上线审核时苹果会通过邮件的形式提醒开发者,否则应用将没有推送功能
证书配置03 – 生成描述文件
证书配置04 – 安装
最终会得到3个文件
aps_development.cer:真机调试用的
aps_production.cer:发布程序用的
netease_news_iphone5_home.mobileprovision:描述文件
建议:先安装cer文件,再安装mobileprovision文件
注册远程推送通知
客户端如果想接收APNs的远程推送通知,必须先注册(得到用户的授权)
一般在App启动完毕后就马上注册
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 注册远程通知
UIRemoteNotificationType type = UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:type];
return YES; }
注册成功后会调用AppDelegate的下面方法,得到设备的deviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
NSLog(@"%@", deviceToken); }
JPush
一套远程推送解决方案,支持android和iOS两个平台
它能够快捷地为iOS App增加推送功能,减少集成APNs需要的工作量、开发复杂度
更多的信息,可以参考JPush官方网站:https://www.jpush.cn
集成iOS SDK的步骤可以参考
http://docs.jpush.cn/pages/viewpage.action?pageId=2621727