iOS systemPush

关于iOSpush我们一般都会使用一些第三方SDK。最近因为项目需求需要使用系统push。这里总结下系统push的一些知识点:

关于push的证书这里就不介绍了。服务器方面:只需要把p12证书给到就行。

1、客户端注册、获取deviceToken

证书配置好了,下一步我们要获取deviceToken,用于推送到客户端设备。这个deviceToken也需要上传给服务器,否则无法push。

由于iOS10及以上把本地通知和远程通知都集成在了UserNotifications库里面,所以register push我们需要适配下系统版本:

- (void)registerSystemPushWithApplication:(UIApplication *)application
{
    //iOS10及以上使用UserNotifications框架
    if ([NSProcessInfo.processInfo isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){10,0,0}]){
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        center.delegate = self;
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
            if (!error) {
                NSLog(@"request authorization succeeded!");
            }
        }];
    }
    else{
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
        [application registerUserNotificationSettings:settings];
    }
    
    // 注册获得device Token
    [[UIApplication sharedApplication] registerForRemoteNotifications];
}

注册成功之后,会在Appdelegate里面输出deviceToken

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NSLog(@"token:%@",deviceToken);
}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
    NSLog(@"push register error:%@",error);
}
注意(注册失败):

1、确认证书没有问题
2、使用真机
3、如下图,push Noti需要打开开关


屏幕快照 2017-09-04 下午2.09.37.png

客户端接收push消息

接收也需要按系统来分别处理,iOS7以上10以下

- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:
(void (^)(UIBackgroundFetchResult))completionHandler {
    UIApplicationState state = [UIApplication sharedApplication].applicationState;
    if (state == UIApplicationStateActive) {
        //app在前台
        [[SystemPushManage sharedSystemPushManage] activePushControllerWithUserInfo:userInfo];
    }
    else if (state == UIApplicationStateInactive){
        [[SystemPushManage sharedSystemPushManage] backgroundPushControllerWithUserInfo:userInfo];
    }
    DLog(@"iOS7及以上系统,收到通知:%@", userInfo);
    completionHandler(UIBackgroundFetchResultNewData);
}

关于iOS10及以上请查看这个DEMO

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,969评论 19 139
  • 关于推送 关于苹果的推送网上已经有非常多的资源讲解,我在这里就不再累赘。直接切入主题,讲讲如何模拟推送以及处理推送...
    SuperDanny阅读 7,476评论 1 16
  • 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知...
    莫离_焱阅读 6,564评论 1 8
  • 1、OC中创建线程的方法是什么?如果指定在主线程中执行代码?如何延时执行代码。【难度系数★★】 1)创建线程的方法...
    木旁_G阅读 1,993评论 2 16
  • 凡事有交待 件件有着落 事事有回音
    Shellmom阅读 181评论 0 0