码迷,mamicode.com
首页 > 移动开发 > 详细

iOS本地推送与远程推送

时间:2015-08-21 19:21:34      阅读:284      评论:0      收藏:0      [点我收藏+]

标签:

  分为本地推送和远程推送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,不用备份):变化,很少出现

iOS本地推送与远程推送

标签:

原文地址:http://www.cnblogs.com/mddblog/p/4748511.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!