从ios8.0开始推送功能的实现在不断改变,功能也在不断增加,ios10又出来了一个推送插件的开发(见最后图),废话不多说直接上代码:
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#import <usernotifications/usernotifications.h>
- (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
?| 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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
- (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] minimalactions:@[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] minimalactions:@[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;
}
|
代理方法的改变:
一些本地和远程推送的回调放在了同一个代理方法
?| 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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
#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插件开发


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。








发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。