标签:
分为本地推送和远程推送2种。可以在应用没有打开甚至手机锁屏情况下给用户以提示。它们都需要注册,注册后系统会弹出提示框(如下图)提示用户是否同意,如果同意则正常使用;如果用户不同意则下次打开程序也不会弹出该提示框,需要用户到设置里面设置。一共有三种提示类型:
UIUserNotificationTypeBadge // 应用图标右上角的信息提示
UIUserNotificationTypeSound // 播放提示音
UIUserNotificationTypeAlert // 提示框
本地推送
1 注册与处理
代码如下:
/// 一般在在启动时注册通知,程序被杀死,点击通知后调用此程序
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { // iOS8
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];
[application registerUserNotificationSettings:setting];
}
if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
// 这里添加处理代码
}
return YES;
}
/// 程序没有被杀死(处于前台或后台),点击通知后会调用此程序
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
// 这里添加处理代码
}
可以看到,处理代码有两个地方,一个是
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification,另一个是
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;如果程序没有被杀死,即处于前台或者后台,那么调用前者;如果程序被杀死,则调用后者。
2 发送通知
代码如下:
- (IBAction)addLocalNotification {
// 1.创建一个本地通知
UILocalNotification *localNote = [[UILocalNotification alloc] init];
// 1.1.设置通知发出的时间
localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
// 1.2.设置通知内容
localNote.alertBody = @"这是一个推送这是一个推送";
// 1.3.设置锁屏时,字体下方显示的一个文字
localNote.alertAction = @"赶紧!!!!!";
localNote.hasAction = YES;
// 1.4.设置启动图片(通过通知打开的)
localNote.alertLaunchImage = @"../Documents/IMG_0024.jpg";
// 1.5.设置通过到来的声音
localNote.soundName = UILocalNotificationDefaultSoundName;
// 1.6.设置应用图标左上角显示的数字
localNote.applicationIconBadgeNumber = 999;
// 1.7.设置一些额外的信息
localNote.userInfo = @{@"qq" : @"704711253", @"msg" : @"success"};
// 2.执行通知
[[UIApplication sharedApplication] scheduleLocalNotification:localNote];
}
效果如下:
远程推送
与Android上我们自己实现的推送服务不一样,Apple对设备的控制非常严格,消息推送的流程必须要经过APNs(如下图):
这里 Provider 是指某个应用的Developer。
1 远程推送的注册与本地推送不同,iOS8.0前后也不同,具体代码如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge| UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
// 还需要在didRegisterUserNotificationSettings回调中调用 [application registerForRemoteNotifications];
} else {
[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge];
}
return YES;
}
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[application registerForRemoteNotifications];
}
2 如果注册失败,比如没有证书等等,会调用:
/// 注册失败调用
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"远程通知注册失败:%@",error);
}
3 如果用户同意,苹果会根据应用的 bundleID 和 手机UDID 生成 deviceToken,然后调用 application 的 didregister 方法返回 devicetoken,程序应该把 devicetoken 发给应用的服务器,服务器有义务将其存储(如果允许多点登录,可能存多个 devicetoken)。准备工作就完了。
/// 用户同意后,会调用此程序,获取系统的deviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSLog(@"deviceToken = %@",deviceToken);
}
4 用户点击了通知后默认打开程序。处理代码也有两个地方,一个是
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;另一个是
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;如果程序没有被杀死,即处于前台或者后台,那么调用前者;如果程序被杀死,则调用后者。
5 整体如下图所示:
另外,deviceToken可以作为设备识别,且比idfa 更持久,因为它是应用的 bundleID 和 手机UDID 生成。如下:
删除应用从新安装:不变
恢复出厂设置:不变
删掉程序后升级系统再安装:不变
重装系统(恢复):不变
重装系统(重新激活,不设为新iPhone,使用备份):不变
重装系统(重新激活,设为新iPhone,不用备份):变化,很少出现
标签:
原文地址:http://www.cnblogs.com/mddblog/p/4748511.html