iOS10的推送框架UserNotifications以及UserNotificationsUI

本文详细介绍了iOS10中的UserNotifications框架,包括注册、接收推送消息、远程和本地推送的处理,以及如何配置推送策略和使用NotificationContentExtension、NotificationServiceExtension进行推送内容的扩展。通过实例代码和预览展示了整个过程,帮助开发者理解和适配iOS10的推送系统。

iOS10发布以来,相信各位开发者能踩的坑也应该踩得差不多了;但也许正是因为每次苹果都会更新比较多的东西,才会觉得搞iOS很有意思吧。(不知道大家会不会觉得楼主这种想法有点坑?)

推送是iOS10系统变动比较大的一个地方,对于这种大变动不瞅瞅一下着实不符合楼主的性格,那么楼主就在求知欲的推动下(毕竟还得给自己的项目进行适配不是..)就花了点时间对UserNotifications这个框架进行了一个整体的了解,希望在这里记录一下,希望能够帮助对这个框架有兴趣的小伙伴。

如果大家的项目中推送是使用了极光、友盟等第三方推送,那么请根据他们的官方文档以及最新的SDK对iOS10进行适配即可,跟着文档一步一步走也比较简单。但是如果想要真实的了解原框架的流程,建议还是使用原生推送吧,楼主本文博客下使用的就是原生推送。

如何配置原生推送,推荐有梦想的蜗牛 一步一步教你做ios推送,这位博主写的很详细,虽然开发者界面已经不是那样子了,但实质的东西还是没有变化的。如果按照推荐博文的配置(!一定要确认所有的配置都没有问题!),但依旧收不到远程推送,那么估计就和楼主一样“中奖”了,可能是PHP端交互出问题了,这个时候推荐大家使用PushMeBody来完成远程推送。(使用PushMesBody中的device token直接复制打印的device token即可,不需要去掉空格)

为了能够区分它与之前用法的异同,楼主还是尽可能的想通过比较的方法实现推送的相关功能。
所有coding都在 RITL/RITLPushNoticationDemo(如果有帮助,请Star表示支持一下,感谢)
如果有什么问题,也请及时指出,共同进步,感谢。

推送的注册

注册的位置没有任何的变化,是在Appdelegate中的-application: didFinishLaunchingWithOptions:方法里面进行注册,楼主为了简化它的代码,将注册功能封装成了一个RITLNotificationManager类,所以该方法下只需一句话即可:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    //初始化个数
    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;

    //注册所有的推送
    [[RITLNotificationManager sharedInstance]registerRemoteNotificationsApplication:self];

    return YES;
}


注册具体代码实现

RITLNotificationManager的声明(楼主在声明文件中使用了预编译进行方法的声明,实际的开发中建议不要这么写,将方法分开便是,不同的版本使用不同的方法即可)以及实现方法如下:

//RITLNotificationManager.h(实际Demo中它在"RITLOriginPushAppDelegate+RITLNotificationManager.h"文件下)

/// 注册远程推送
#ifdef __IPHONE_10_0
- (void)registerRemoteNotificationsApplication:(id<UNUserNotificationCenterDelegate>)application;
#else
- (void)registerRemoteNotificationsApplication:(id)application;
#endif
//RITLOriginPushAppDelegate+RITLNotificationManager.m

#ifdef __IPHONE_10_0
-(void)registerRemoteNotificationsApplication:(id<UNUserNotificationCenterDelegate>)application
#else
- (void)registerRemoteNotificationsApplication:(id)application
#endif
{
#ifdef __IPHONE_10_0

    //设置代理对象
    [UNUserNotificationCenter currentNotificationCenter].delegate = application;

    // 请求权限
    [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:UNAuthorizationOptionBadge|UNAuthorizationOptionSound|UNAuthorizationOptionAlert completionHandler:^(BOOL granted, NSError * _Nullable error) {

        if (granted == true)//如果准许,注册推送
        {
            [[UIApplication sharedApplication]registerForRemoteNotifications];
        }  
    }];

#else

#ifdef __IPHONE_8_0 //适配iOS 8
    [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:nil]];

    [[UIApplication sharedApplication]registerForRemoteNotifications];

#else //适配iOS7

    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
#endif

#endif
}


注册完毕进行的回调

这一部分iOS10没有发生变化,还是和之前一样,分为注册成功以及注册失败两个协议方法,方法就在类别RITLOriginPushAppDelegate+RITLNotificationManager:

// 注册推送成功
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    //    NSLog(@"token = %@",deviceToken);
    // 将返回的token发送给服务器
}

// 注册推送失败
-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
    NSLog(@"remoteNotice failture = %@",error.localizedDescription);
}


UserNotifications以前接收推送消息

在Demo中对AppDelegate新建了一个类别"RITLOriginPushAppDelegate+RITLOldNotification"来完成对之前推送消息的接收以及处理:

//通过点击远程推送进入App执行的方法,不管是应用被杀死还是位于后台
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    //收到的信息
    NSLog(@"%@",[[userInfo valueForKey:@"aps"] valueForKey:@"alert"]);

    [self performSelector:NSSelectorFromString(@"__showAlert:") withObject:@"通过点击推送进入App" afterDelay:0];
}
// 在前台收到远程推送执行的方法,如果实现了iOS10的协议方法,该方法不执行,虽然没有标明废弃
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))com
内容概要:本文深入研究了基于最优滑模控制的永磁同步电机(PMSM)调速系统模型,重点利用Simulink工具搭建并仿真了该控制系统的动态响应特性。文章系统阐述了最优滑模控制策略的设计原理,突出其在削弱传统滑模控制固有抖振现象、增强系统鲁棒性方面的显著优势。通过与传统滑模控制方法的对比实验,充分验证了所提出方法在调速精度、抗外部干扰能力以及动态响应速度等方面的优越性能。研究内容涵盖PMSM数学建模、滑模面构造、最优控制律推导、Lyapunov稳定性分析、参数整定及Simulink仿真验证等完整环节,形成了一套严谨的控制算法设计与实现流程。; 适合人群:具备自动控制原理、现代控制理论基础和MATLAB/Simulink仿真操作能力,从事电机驱动控制、电力电子与电力传动、运动控制或自动化等相关领域研究的工程技术人员及高校研究生。; 使用场景及目标:① 深入掌握滑模控制理论及其在高性能电机调速系统中的具体应用方法;② 学习如何设计并实现能够有效抑制抖振的最优滑模控制器,以提升系统整体鲁棒性和控制品质;③ 利用Simulink平台独立完成从理论建模到仿真验证的全过程,服务于科研课题、课程设计或实际工程项目。; 阅读建议:建议读者务必结合MATLAB/Simulink环境动手复现文中模型,重点关注滑模切换面的设计准则、控制律的数学推导过程以及控制器参数的调节规律,并通过施加不同的负载扰动、设定多种转速指令等方式全面测试系统的动态与稳态性能,从而深刻理解最优滑模控制的核心机理与工程应用价值。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值