iOS远程推送服务


iOS远程推送服务


APNs服务,苹果官方网址:https://developer.apple.com/library/prerelease/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html

一,Apple Notification Push Server(苹果消息推送服务器)
    苹果推送服务有两种,本地推送(local)和远程推送(remote);我们今天讲远程推送。
    1,远程推送服务可以转发从提供者(一般是制作应用提供的服务器)一个远程通知(remote notification)到设备。一个通知是一个简短的消息包括两个重要的数据:设备令牌(device token)和有效载荷(payload)。设备令牌(device token)就好像是手机号码,它包含了APNs分配给某个设备中某个本机应用的允许推送的信息。APNs也会使用它来验证一个通知。有效载荷(payload)是一个json格式的列表,描述了通知怎么在设备上显示通知给使用该应用的用户。
    2,远程通知数据流是单向的。提供者(provider)组装包含device Token和payload的通知包。提供者(provider)发送该通知给APNs。


    3,device token共享

    4,然而,上面都不是完整流程的完全体;一般公司实现远程推送的完全体是把上面两幅图片结合起来:
    
二,iOS获取deviceToken;
    如果希望自己的应用支持推送功能,需要在苹果开发者后台配置应用的证书和配置文件,还有推送用的证书。
    1)配置项目证书+推送证书,网址:
    https://developer.apple.com/membercenter/index.action
    -------------------------------
        开发一个应用,需要完整的证书有七个(不考虑csr文件)
        1-开发者开发用签名证书
        2-开发者发布用签名证书
        3-某个项目对应的推送开发证书
        4-某个项目对应的推送发布证书
        5-某个项目对应的开发调试配置文件
        6-某个项目对应的发布配置文件
        7-某个项目对应的adhoc配置文件
        如果账号不是新账号
        创建一个应用,颁布证书的时候,应该从创建App Id开始,然后颁布推送/配置文件。
        如果是新账号,应该先在某台mac上通过钥匙串工具颁布CSR文件到电脑,CSR文件是可以在苹果开发者后台颁布其他证书的验证文件。为了防止意外情况发生,凡是需要CSR文件验证才能获取的证书,最好在颁布CSR文件的电脑上颁发。
        颁发完CSR文件,再登陆苹果开发者后台,颁发开发者开发用签名证书和开发者发布用签名证书。
    -------------------------------    

    2)应用注册推送通知,获取device token
    UIApplication的方法:
-(void)registerNotificationPush{
    UIApplication * application=[UIApplication sharedApplication];
    if ([UIDevice currentDevice].systemVersion.integerValue>=8) {
        //1.创建消息上面要添加的动作(按钮的形式显示出来)
        UIMutableUserNotificationAction *action = [[UIMutableUserNotificationAction alloc] init];
        action.identifier = @"action";//按钮的标示
        action.title=@"Accept";//按钮的标题
        action.activationMode = UIUserNotificationActivationModeForeground;//当点击的时候启动程序
        //    action.authenticationRequired = YES;
        //    action.destructive = YES;
        
        UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];
        action2.identifier = @"action2";
        action2.title=@"Reject";
        action2.activationMode = UIUserNotificationActivationModeBackground;//当点击的时候不启动程序,在后台处理
        action.authenticationRequired = YES;//需要解锁才能处理,如果action.activationMode = UIUserNotificationActivationModeForeground;则这个属性被忽略;
        action.destructive = YES;
        
        //2.创建动作(按钮)的类别集合
        UIMutableUserNotificationCategory *categorys = [[UIMutableUserNotificationCategory alloc] init];
        categorys.identifier = @"alert";//这组动作的唯一标示,推送通知的时候也是根据这个来区分
        [categorys setActions:@[action,action2] forContext:(UIUserNotificationActionContextMinimal)];
        
        //3.创建UIUserNotificationSettings,并设置消息的显示类类型
        UIUserNotificationSettings *notiSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIRemoteNotificationTypeSound) categories:[NSSet setWithObjects:categorys, nil]];
        [application registerUserNotificationSettings:notiSettings];
    }else{
        [application registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
    }
}
    通过AppDelegate代理方法,拿到APNs返回的deviceToken
    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    
    
三,极光推送
    https://www.jpush.cn/common/
    1,极光后台账号的申请
    2,极光后台应用的配置,和后台证书的配置
    3,极光SDK接入应用
        为什么需要把极光应用接入SDK?
        获取到deviceToken以后,怎么把deviceToken传给服务器,以便服务器需要发送通知时候,可以拼接deviceToken参数。
    a,新建项目
    b,按照说明文档接入极光SDK
    c,按照说明文档对接接口

四,推送通知
    1,在真机中允许程序,直到log日志显示极光推送注册成功
    2,在极光推送后台配置好推送消息,点击发送。
        推送的消息内容一般不允许超过256字节。

五,应用获取推送消息
    推送的消息可以在应用中获取到,AppDelegate一共有三个代理方法可以获取
    1   - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    这个方法,一般是用户收到通知以后,点击通知界面打开应用时候接受到。如果直接通过应用图标打开应用,这里接受不到推送消息,哪怕真的有推送通知。
    2- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo NS_AVAILABLE_IOS(3_0);
    如果推送的时候,应用正在设备上运行,这个地方可以接受到推送的消息。
    3- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler NS_AVAILABLE_IOS(7_0);
    iOS7,以后新增的接受推送通知的接口,以后走这个。


极光推送接入常见问题:
    1,关于项目,xcode7新建项目后,在info.plist中修改项目总是提示bundle id不匹配。
    目前解决方案:直接创建项目时候,就保证bundle id正确。
    2,极光SDK接入后,访问网络失败:
    解决方案:xcode7默认不支持http,只支持比较安全的https;需要在info.plist文件中进行如下配置“NSAppTransportSecurity”“NSAllowsArbitraryLoads”
    
    3,报错:
    解决方案:进行如下设置
    
    4,报错
You've implemented -[<UIApplicationDelegate> application:didReceiveRemoteNotification:fetchCompletionHandler:], but you still need to add "remote-notification" to the list of your supported UIBackgroundModes in your Info.plist.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值