博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS10全新推送功能的实现
阅读量:6281 次
发布时间:2019-06-22

本文共 10333 字,大约阅读时间需要 34 分钟。

从iOS8.0开始推送功能的实现在不断改变,功能也在不断增加,iOS10又出来了一个推送插件的开发(见最后图),废话不多说直接上代码:

在开始之前需要打开一个推送开关,不然无法获取deviceToken,老项目或者出现deviceToken无效的情况:如图:

 

打开后会生成entitlements文件,需要有APS Environment

 

#import 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. /* APP未启动,点击推送消息的情况下 iOS10遗弃UIApplicationLaunchOptionsLocalNotificationKey,使用代理UNUserNotificationCenterDelegate方法didReceiveNotificationResponse:withCompletionHandler:获取本地推送 */// NSDictionary *localUserInfo = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];// if (localUserInfo) {// NSLog(@"localUserInfo:%@",localUserInfo);// //APP未启动,点击推送消息// } NSDictionary *remoteUserInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]; if (remoteUserInfo) { NSLog(@"remoteUserInfo:%@",remoteUserInfo); //APP未启动,点击推送消息,iOS10下还是跟以前一样在此获取 } [self registerNotification]; return YES;}

注册推送方法的改变:

 

新增库 #import <UserNotifications/UserNotifications.h>  推送单列UNUserNotificationCenter 等API

- (void)registerNotification{    /*     identifier:行为标识符,用于调用代理方法时识别是哪种行为。     title:行为名称。     UIUserNotificationActivationMode:即行为是否打开APP。     authenticationRequired:是否需要解锁。     destructive:这个决定按钮显示颜色,YES的话按钮会是红色。     behavior:点击按钮文字输入,是否弹出键盘     */    UNNotificationAction *action1 = [UNNotificationAction actionWithIdentifier:@"action1" title:@"策略1行为1" options:UNNotificationActionOptionForeground];    /*iOS9实现方法    UIMutableUserNotificationAction * action1 = [[UIMutableUserNotificationAction alloc] init];    action1.identifier = @"action1";    action1.title=@"策略1行为1";    action1.activationMode = UIUserNotificationActivationModeForeground;    action1.destructive = YES;     */        UNTextInputNotificationAction *action2 = [UNTextInputNotificationAction actionWithIdentifier:@"action2" title:@"策略1行为2" options:UNNotificationActionOptionDestructive textInputButtonTitle:@"textInputButtonTitle" textInputPlaceholder:@"textInputPlaceholder"];    /*iOS9实现方法        UIMutableUserNotificationAction * action2 = [[UIMutableUserNotificationAction alloc] init];        action2.identifier = @"action2";        action2.title=@"策略1行为2";        action2.activationMode = UIUserNotificationActivationModeBackground;        action2.authenticationRequired = NO;        action2.destructive = NO;        action2.behavior = UIUserNotificationActionBehaviorTextInput;//点击按钮文字输入,是否弹出键盘    */        UNNotificationCategory *category1 = [UNNotificationCategory categoryWithIdentifier:@"Category1" actions:@[action2,action1]  intentIdentifiers:@[@"action1",@"action2"] options:UNNotificationCategoryOptionCustomDismissAction];    //        UIMutableUserNotificationCategory * category1 = [[UIMutableUserNotificationCategory alloc] init];    //        category1.identifier = @"Category1";    //        [category1 setActions:@[action2,action1] forContext:(UIUserNotificationActionContextDefault)];        UNNotificationAction *action3 = [UNNotificationAction actionWithIdentifier:@"action3" title:@"策略2行为1" options:UNNotificationActionOptionForeground];    //        UIMutableUserNotificationAction * action3 = [[UIMutableUserNotificationAction alloc] init];    //        action3.identifier = @"action3";    //        action3.title=@"策略2行为1";    //        action3.activationMode = UIUserNotificationActivationModeForeground;    //        action3.destructive = YES;        UNNotificationAction *action4 = [UNNotificationAction actionWithIdentifier:@"action4" title:@"策略2行为2" options:UNNotificationActionOptionForeground];    //        UIMutableUserNotificationAction * action4 = [[UIMutableUserNotificationAction alloc] init];    //        action4.identifier = @"action4";    //        action4.title=@"策略2行为2";    //        action4.activationMode = UIUserNotificationActivationModeBackground;    //        action4.authenticationRequired = NO;    //        action4.destructive = NO;        UNNotificationCategory *category2 = [UNNotificationCategory categoryWithIdentifier:@"Category2" actions:@[action3,action4]  intentIdentifiers:@[@"action3",@"action4"] options:UNNotificationCategoryOptionCustomDismissAction];    //        UIMutableUserNotificationCategory * category2 = [[UIMutableUserNotificationCategory alloc] init];    //        category2.identifier = @"Category2";    //        [category2 setActions:@[action4,action3] forContext:(UIUserNotificationActionContextDefault)];            [[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSet setWithObjects:category1,category2, nil]];    [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert completionHandler:^(BOOL granted, NSError * _Nullable error) {        NSLog(@"completionHandler");    }];    /*iOS9实现方法    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound) categories:[NSSet setWithObjects: category1,category2, nil]];    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];    */    [[UIApplication sharedApplication] registerForRemoteNotifications];            [UNUserNotificationCenter currentNotificationCenter].delegate = self;}

代理方法的改变:

一些本地和远程推送的回调放在了同一个代理方法

#pragma mark -- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings NS_AVAILABLE_IOS(8_0) __TVOS_PROHIBITED{    NSLog(@"didRegisterUserNotificationSettings");}- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken NS_AVAILABLE_IOS(3_0){    NSLog(@"deviceToken:%@",deviceToken);    NSString *deviceTokenSt = [[[[deviceToken description]                                 stringByReplacingOccurrencesOfString:@"<" withString:@""]                                stringByReplacingOccurrencesOfString:@">" withString:@""]                               stringByReplacingOccurrencesOfString:@" " withString:@""];    NSLog(@"deviceTokenSt:%@",deviceTokenSt);}- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error NS_AVAILABLE_IOS(3_0){    NSLog(@"didFailToRegisterForRemoteNotificationsWithError:%@",error);}/*iOS9使用方法- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo NS_DEPRECATED_IOS(3_0, 10_0, "Use UserNotifications Framework's -[UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:] or -[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:] for user visible notifications and -[UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:] for silent remote notifications"){    }*/- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{    NSLog(@"willPresentNotification:%@",notification.request.content.title);        // 这里真实需要处理交互的地方    // 获取通知所带的数据    NSString *notMess = [notification.request.content.userInfo objectForKey:@"aps"];    }- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{    //在没有启动本App时,收到服务器推送消息,下拉消息会有快捷回复的按钮,点击按钮后调用的方法,根据identifier来判断点击的哪个按钮    NSString *notMess = [response.notification.request.content.userInfo objectForKey:@"aps"];    NSLog(@"didReceiveNotificationResponse:%@",response.notification.request.content.title);//    response.notification.request.identifier}//远程推送APP在前台- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{    NSLog(@"didReceiveRemoteNotification:%@",userInfo);}/*- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler NS_DEPRECATED_IOS(8_0, 10_0, "Use UserNotifications Framework's -[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:]") __TVOS_PROHIBITED{    }*//*// 本地通知回调函数,当应用程序在前台时调用- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification NS_DEPRECATED_IOS(4_0, 10_0, "Use UserNotifications Framework's -[UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:] or -[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:]") __TVOS_PROHIBITED{    NSLog(@"didReceiveLocalNotification:%@",notification.userInfo);            // 这里真实需要处理交互的地方    // 获取通知所带的数据    NSString *notMess = [notification.userInfo objectForKey:@"aps"];    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"本地通知(前台)"                                                    message:notMess                                                   delegate:nil                                          cancelButtonTitle:@"OK"                                          otherButtonTitles:nil];    [alert show];        // 更新显示的徽章个数    NSInteger badge = [UIApplication sharedApplication].applicationIconBadgeNumber;    badge--;    badge = badge >= 0 ? badge : 0;    [UIApplication sharedApplication].applicationIconBadgeNumber = badge;        // 在不需要再推送时,可以取消推送    [FirstViewController cancelLocalNotificationWithKey:@"key"];}- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void(^)())completionHandler NS_DEPRECATED_IOS(8_0, 10_0, "Use UserNotifications Framework's -[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:]") __TVOS_PROHIBITED{    //在非本App界面时收到本地消息,下拉消息会有快捷回复的按钮,点击按钮后调用的方法,根据identifier来判断点击的哪个按钮,notification为消息内容    NSLog(@"%@----%@",identifier,notification);    completionHandler();//处理完消息,最后一定要调用这个代码块}*/

还有推送插件开发: 类似iOS tody widget插件开发

 

转载地址:http://fziva.baihongyu.com/

你可能感兴趣的文章
ART世界探险(19) - 优化编译器的编译流程
查看>>
玩转Edas应用部署
查看>>
music-音符与常用记号
查看>>
sql操作命令
查看>>
zip 数据压缩
查看>>
Python爬虫学习系列教程
查看>>
【数据库优化专题】MySQL视图优化(二)
查看>>
【转载】每个程序员都应该学习使用Python或Ruby
查看>>
PHP高级编程之守护进程,实现优雅重启
查看>>
PHP字符编码转换类3
查看>>
rsync同步服务配置手记
查看>>
http缓存知识
查看>>
Go 时间交并集小工具
查看>>
iOS 多线程总结
查看>>
webpack是如何实现前端模块化的
查看>>
TCP的三次握手四次挥手
查看>>
关于redis的几件小事(六)redis的持久化
查看>>
package.json
查看>>
webpack4+babel7+eslint+editorconfig+react-hot-loader 搭建react开发环境
查看>>
Maven 插件
查看>>