iOS-百度推送

作者: coder_hong | 来源:发表于2017-03-30 22:26 被阅读1081次

    公司在项目使用第三方的推送是百度推送 接下来学习一下
    百度推送地址

    第一章 生成AppKey

    1.1 注册百度账号

    1.2 创建应用

    Snip20170330_76.png

    1.2.1 设置应用名称

    Snip20170330_77.png

    1.2.2 应用配置

    Snip20170330_80.png

    1.2.2 应用配置完成 得到API KEY

    Snip20170330_81.png

    第二章 生成推送所需的pem证书

    2.1 在开发者这种找到我们的应用对应的APPID

    Snip20170330_82.png

    2.2 选择证书关联的APPID

    Snip20170330_83.png

    2.3 选择电脑钥匙串办法的证书

    Snip20170330_84.png

    2.4 同样的操作就会生成两个cer证书,双击安装到我们的钥匙串中

    Snip20170330_85.png

    2.5 导出两个P12文件

    2.6 将导出的P12通过命令导出百度需要的pem证书

    Snip20170330_86.png

    2.7证书与证书校验

    与 APNs 之间是加密的连接,因此需要使用证书来加密连接。每个的推送环境有自己单独的推送证书,即开发证书和生产证书。

    在将证书最终转为 pem 格式后,可通过与 APNs 连接来测试证书是否有效。

    开发环境:

    openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert MyApnsDev.pem
    

    生产环境:

    openssl s_client -connect gateway.push.apple.com:2195 -cert MyApnsPro.pem
    

    当输入完命令回车后,终端首先会输出很多相关信息。

    当连接建立失败时,会直接关闭。

    当连接建立成功时,终端会停止输出,并等待你输入,你可以随便输入一些字符后摁回车,然后连接才会关闭。�

    2.8 通知的两种推送环境

    在使用 iOS 远程推送功能时,有两种不同的环境。开发环境(Development)以及生产环境(Production)。

    App 当前使用的推送环境与 Xcode - Build Settings - Code Signing - Provisioning Profile 文件的模式一致。

    2.7 将pem证书上传到我们百度创建的应用中

    Snip20170330_87.png

    这样我们前期的配置工作就完成了。由于苹果APNS是加密过的,所以我们需要将证书传递给百度,接下来我们在我们项目中将DeviceToken传递给百度,它会绑定生成一个对应的channel_ID.
    channel_id : channel_id是用于表示一台设备的唯一标识, 在推送消息时,用于指定消息的目标接收设备.

    第三章 创建我们的iOS工程,集成百度SDK

    3.1 下载百度SDK 地址

    Snip20170330_88.png

    下载后的文件目录

    Snip20170330_89.png

    3.2 将红色的部分拖进项目中去,test.caf不需要

    Snip20170330_90.png

    3.3对于Xcode8.0配置

    Snip20170330_91.png Snip20170330_92.png

    3.4 在AppDelegate中初始化百度推送

    #import "AppDelegate.h"
    #import <UserNotifications/UserNotifications.h>
    #import "BPush.h"
    #import "ViewController.h"
    @interface AppDelegate ()
    
    @end
    
    @implementation AppDelegate
    
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        
        
        // iOS10 下需要使用新的 API
        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) {
    #ifdef NSFoundationVersionNumber_iOS_9_x_Max
            UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
            
            [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound + UNAuthorizationOptionBadge)
                                  completionHandler:^(BOOL granted, NSError * _Nullable error) {
                                      // Enable or disable features based on authorization.
                                      if (granted) {
                                          [application registerForRemoteNotifications];
                                      }
                                  }];
    #endif
        }
        else if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
            UIUserNotificationType myTypes = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
            
            UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:myTypes categories:nil];
            [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
        }else {
            UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeSound;
            [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
        }
        
        
        #warning 测试 开发环境 时需要修改BPushMode为BPushModeDevelopment 需要修改Apikey为自己的Apikey
        
         [BPush registerChannel:launchOptions apiKey:@"M4a6DvXbCnl7rgvLcVeIwSFw" pushMode:BPushModeDevelopment withFirstAction:@"打开" withSecondAction:@"关闭" withCategory:@"test" useBehaviorTextInput:YES isDebug:YES];
        
        // App 使用户点击推送消息启动
        NSDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        if (userInfo) {
            [BPush handleNotification:userInfo];
        }
        
        // 清除角标
        [[UIApplication sharedApplication] setApplicationIconBadgeNumber:1.0];
            
        return YES;
    }
    
    #pragma Gegistnotification
    
    // 在iOS8中,还需要添加这个方法。通过新的ApI 注册推送服务
    - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
    {
        [application registerForRemoteNotifications];
    }
    
    
    
    // 当 DeviceToken 获取失败时,系统会调用此回调方法
    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
    {
        NSLog(@"DeviceToken 获取失败, 原因是: %@", error);
    }
    
    // 当注册成功时候返回 deviceToken
    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    {
        NSLog(@"%@-----", deviceToken);
        [BPush registerDeviceToken:deviceToken];
        
        // 绑定Push服务通道 error_code为0是绑定成功 绑定成功后可以获取appid,channelid,userid等信息
        [BPush bindChannelWithCompleteHandler:^(id result, NSError *error) {
            
            if (result) {
                if ([result[@"error_code"] intValue] != 0) {
                    return ;
                }
                
                // 获取channel_id
                NSString *myChange_id = [BPush getChannelId];
    //            [BPush getAppId];
    //            [BPush getUserId];
                NSLog(@"%@", myChange_id);
                
                [BPush setTag:@"MyTag" withCompleteHandler:^(id result, NSError *error) {
                    if (result) {
                        // BPushCallBack中有设置标签结果的反馈,,error_code 为0时设置成功会得到设置结果。
                        NSLog(@"result==================%@", result);
                        
                    }
                }];
                
            }
        }];
        
    }
    
    
    
    // 当用户点击了通知 应用在前台 或者开启后台并且应用在后台 是调用
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
    {
        
        NSLog(@"%@", userInfo);
        
        
        // 应用在前台 不跳转页面
        if (application.applicationState == UIApplicationStateActive) {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"收到一条消息" message:userInfo[@"aps"][@"alert"] delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
            
            [alert show];
        }
        // 杀死情况下 直接跳转到页面
        if (application.applicationState == UIApplicationStateInactive) {
            
            /*
                SkipViewController *skipCtr = [[SkipViewController alloc] init];
                [_tabBarCtr.selectedViewController pushViewController:skipCtr animated: YES];
             */
        }
        
        // 应用在后台 当后台设置apps字段里的
        if(application.applicationState == UIApplicationStateBackground){
            
             ViewController *vc = (ViewController *)self.window.rootViewController;
            
            
            vc.textView.text = userInfo.description;
            
        }
    }
    

    3.5在百度后台创建发送通知

    Snip20170330_93.png

    3.6 查看推送列表

    Snip20170330_94.png

    第三章 PHP集成百度推送

    1.1下载PHP对应SDK

    Snip20170330_95.png

    下载后的SDK目录

    Snip20170330_97.png

    将项目拖拽到我们本地的服务器站点

    Snip20170330_98.png

    1.2 配置项目

    • 修改configure.php中的defaultapiKey及defaultsecurekey,填入在Setp 2中获得的apikey及secure key.
    Snip20170330_99.png

    1.2 在hello_for_ios.php 中脚本中发送一个推送

    Snip20170330_102.png

    推送消息的格式


    第四章 对于证书过期的处理

    Snip20170330_103.png

    4.1到苹果开发者中心,找到对应的AppID

    Snip20170330_104.png

    4.2选择过期的证书 重新生成对应的证书

    Snip20170330_105.png

    4.3 按这上面的步骤上传到百度我们创建的应用中,就可以正常的发送通知了。

    相关文章

      网友评论

        本文标题:iOS-百度推送

        本文链接:https://www.haomeiwen.com/subject/cmnpottx.html