首先, 我使用的是"友盟推送"(UMessage):
对于"证书"导出这块, 有个坑, 我得说一下, 就是有时候导出的两个证书未必是.p12格式. 这时候需将钥匙串中的证书从"系统"拖拽至"登录"处即可导出.p12格式.
这里, 我想说的不是证书配置,
先看需求: 在前台运行时, 以横幅接收推送消息, 点击后进入详情页; 后台运行时, 不做推送接收时的UI改变, 依然是点击推送消息进入详情页. 退出登录时推送接收关闭.
在此, 我先吐槽一点, 好的产品很重要, 然而我现在还木有遇到....因为我们之前的需求中有一条, 就是退出登录时仍然接收推送, 点击后判断是不是记住密码状态, 是的话跳过登录界面直接进入详情页.(excuse me?其实现在APP几乎都是记住密码状态, 哪儿还用用户自己操作是否记住密码呢? )
好吧, 我先针对之前的这个需求诉说下之前遇到的坑: 断点真的不是调试状态就断到你想断的地方的.. 比如, 你的app在压入后台在移除后, 你在接收推送消息后, 打开应用, 这个时候是不会断到断点处的(开发人员都懂得...).
接入主题,
前台运行时接入横幅替换推送消息弹框, 主要的是要先将推送消息弹框关闭. 在下面这个代理方法中关闭:
-(void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo
{
[UMessage setAutoAlert:NO];
[UMessage didReceiveRemoteNotification:userInfo];
........
}
"[UMessage setAutoAlert:NO];"这句代码加此最为合适, 加到.m中其他方法内(想提前关掉弹框), 就会使得推送消息接收不到.
对于推送消息的开关,
关掉推送, 简单些, 就一行代码:
[UMessageunregisterForRemoteNotifications];
对于推送打开, 你不仅要进行注册, 还得及时先服务端发送获取到的新的deviceToken, 注册主要是下面这几行代码:
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= _IPHONE80_
if(UMSYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
{
//register remoteNotification types
UIMutableUserNotificationAction*action1 = [[UIMutableUserNotificationActionalloc]init];
action1.identifier=@"action1_identifier";
action1.title=@"Accept";
action1.activationMode=UIUserNotificationActivationModeForeground;//当点击的时候启动程序
UIMutableUserNotificationAction*action2 = [[UIMutableUserNotificationActionalloc]init];//第二按钮
action2.identifier=@"action2_identifier";
action2.title=@"Reject";
action2.activationMode=UIUserNotificationActivationModeBackground;//当点击的时候不启动程序,在后台处理
action2.authenticationRequired=YES;//需要解锁才能处理,如果action.activationMode = UIUserNotificationActivationModeForeground;则这个属性被忽略;
action2.destructive=YES;
UIMutableUserNotificationCategory*categorys = [[UIMutableUserNotificationCategoryalloc]init];
categorys.identifier=@"category1";//这组动作的唯一标示
[categoryssetActions:@[action1,action2]forContext:(UIUserNotificationActionContextDefault)];
//-----开关-----:open//
UIUserNotificationSettings*userSettings = [UIUserNotificationSettingssettingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIRemoteNotificationTypeAlertcategories:[NSSetsetWithObject:categorys]];
[UMessageregisterRemoteNotificationAndUserNotificationSettings:userSettings];
}else{
//-----开关-----:open//
//register remoteNotification types
[UMessageregisterForRemoteNotificationTypes:UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert];
[[UIApplicationsharedApplication]registerForRemoteNotificationTypes:UIRemoteNotificationTypeNone|UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound];
}
#else
//register remoteNotification types
[UMessage registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge
|UIRemoteNotificationTypeSound
|UIRemoteNotificationTypeAlert];
#endif
为保险起见, 下面这句代码加上最为合适:
[[UIApplication sharedApplication]registerForRemoteNotifications];
当你注册完推送的同时, 下面这个代理方法就run了, 你也拿到了deviceToken , 将其发送至服务端即可
-(void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
[UMessage registerDeviceToken:deviceToken];
}
无论怎样, iOS系统下的通知接收处理还是不能像安卓那样灵活有趣.
我们还有一个需求是要自定义控制接收到从而显示在通知栏里面的通知数. 比如, 我设置最多显示两条, 那么在通知栏里面显示最新推送过来的两条..
居然有小伙伴给我推荐"today widget", 好吧, 还是很感谢这位小伙伴. 随后又有推荐模仿定时器闹钟之类种种, 可惜并不能行. 我也尝试了转成本地推送, 但有时间延迟或者不推送的现象.
先写到这里, 以后会再更新修改补充.