iOS 8 体验推送

一直更新了iOS8,但是一直没有开始研究这个iOS8,今天因为项目用到了推送,于是体验了iOS8的推送,先讲讲这个推送。目前分为四个推送:用户推送,本地推送,远程推送,地理位置推送。

推送界面

用户推送

我们先开始讲这个用户推送,我们要使用之前必须先注册这个推送,用户要允许这个程序进行推送

注册过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    UIUserNotificationType  types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert ;
    UIUserNotificationSettings  *mySettings  = [UIUserNotificationSettings settingsForTypes:types categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
    return YES;
}


- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
    UIUserNotificationType allowTypes = [notificationSettings types];
}


- (void)getReadyForNotification
{
    UIUserNotificationSettings *currentNotificationSettings = [[UIApplication sharedApplication] currentUserNotificationSettings];
    [self checkSetting:currentNotificationSettings];

}

总结就是三个方法进行注册

推送注册三个方法

我们现在仅仅是注册了通知的设置,还要注册推送通知的行为,在iOS8中,行为能直接在推送消息进行,如回复消息,拒绝消息等

直接在推送消息进行回复

这个真心碉堡了

我们如何能进行这些行为,首先我们需注册这些行为。

  • Actions
  • 1
    2
    3
    4
    5
    6
    
    UIMutableUserNotificationAction *acceptAction = [[UIMutableUserNotificationAction alloc] init];
    acceptAction.identifier = @"RickAction";
    acceptAction.title = @"Accept";
    acceptAction.activationMode = UIUserNotificationActivationModeBackground;
    acceptAction.destructive = NO;
    acceptAction.authenticationRequired = NO;
    
  • Categories
  • 1
    2
    3
    
    UIMutableUserNotificationCategory *inviteCategory = [[UIMutableUserNotificationCategory alloc] init];
    inviteCategory.identifier = @"INVITE_CATEGORY";
    [inviteCategory setActions:@[acceptAction] forContext:UIUserNotificationActionContextDefault];
    

    我们需要注意这个UIUserNotificationActionContextDefault,如果我们使用这个,我们会得到这个推送行为,Maybe和Accept

    Maybe和Accept

    我们还可以使用UIUserNotificationActionContextMinimal得到的是Decline和Accept行为

    Decline和Accept

  • Settings
  • 在这些行为注册之后,我们加上之前提到的推送设置就完成了注册推送的这个流程了

    1
    2
    3
    4
    
    NSSet *categories = [NSSet setWithObjects:inviteCategory, nil];
    UIUserNotificationType  types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert ;
    UIUserNotificationSettings  *mySettings  = [UIUserNotificationSettings settingsForTypes:types categories:categories];
    [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
    

    远程推送

    远程推送,所有消息大小不超过2KB,我们获取远程推送的json格式的消息,解析这个消息就是我们的远程推送了:

    1
    2
    3
    4
    5
    6
    7
    8
    
    {
        “aps”: {
            "content-available": 1,
            "alert": "This is the alert text",
            "badge": 1,
            "sound": "default"
        }
    }
    

    若要使用远程推送,满足两个条件:一、用户需要调用注册用户推送registerUserNotificationSettings;二、在info.plist文件中UIBackgroundModes必须包含远程通知。

    1
    
    [[UIApplication sharedApplication] registerForRemoteNotifications];
    

    这个注册通知的方法开始更改了

    1
    2
    3
    4
    5
    6
    7
    
    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    {
    }
    
    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
    {
    }
    

    iOS7通知代理方法

    iOS6的通知代理方法

    后来又增加了本地通知的代理方法

    添加本地推送的通知代理方法

    iOS8的推送代理方法只有两个了

    iOS 8推送的通知代理方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void (^)())completionHandler
    {
    }
    
    - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler
    {
    }
    
    - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void (^)())completionHandler
    {
        if ([identifier isEqualToString:@"RickAction"]) {
            [self handleAcceptActionWithNotification:notification];
        }
        completionHandler();
    }
    
    - (void)handleAcceptActionWithNotification:(UILocalNotification*)notification
    {
    }
    

    地理位置推送

    这个推送是新的API才有的特性,必须配合CLLocation定位一起使用。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    
    //Location Notification
        CLLocationManager *locMan = [[CLLocationManager alloc] init];
        locMan.delegate = self;
        [locMan requestWhenInUseAuthorization];
    
    #pragma mark - CLLocationManager
    
    - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
    
    {
        BOOL canUseLocationNotifications = (status == kCLAuthorizationStatusAuthorizedWhenInUse);
        if (canUseLocationNotifications) {
            [self startShowLocationNotification];
        }
    }
    - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
    
    {
        CLRegion *region = notification.region;
        if (region) {
        }
    }
    
    - (void)startShowLocationNotification
    
    {
        CLLocationCoordinate2D local2D ;
        local2D.latitude = 123.0;
        local2D.longitude = 223.0;
        UILocalNotification *locNotification = [[UILocalNotification alloc] init];
        locNotification.alertBody = @"你接收到了";
        locNotification.regionTriggersOnce = YES;
        locNotification.region = [[CLCircularRegion alloc] initWithCenter:local2D radius:45 identifier:@"local-identity"];
        [[UIApplication sharedApplication] scheduleLocalNotification:locNotification];
    }
    

    如果没有开启Core Location 那么上面的didReceiveLocalNotification不会被调用

    最后再总结一下,整个推送流程我觉得是这样子的,先注册推送,然后推送消息,客户端接收推送消息,执行推送行为。如果有错误,还请在文章下面评论,欢迎指正。

    推送的流程


    Comments