百度云推送sdk集成问题(及遇到的问题)

来源:互联网 发布:网络聊天技巧pdf 编辑:程序博客网 时间:2024/06/15 03:53

iOS集成指南


iOS云推送简介

基本理念

整合AndroidiOS平台,扩展统一的消息格式和API,提供统一的推送服务。减少开发维护工作量,封装和优化APNs推送云/端接口,提升推送吞吐、性能和稳定性。

云推送的iOS实现基于苹果公司的APNs服务,相当于给APNs做了层代理。设计的基本思路是:

  • 客户端上,尽可能的保持原有APNs编程模型,让开发者的切换成本最小。只需在原有APNs的编码基础上,增加云推送的初始化和绑定接口的调用。
  • 服务端上,尽可能的做到全权代理,最大节省开发工作量。只需初始化推送证书的操作。


应用、云推送和APNs的关系

push_ios_help_1c.png

对应上图的流程标号,各个过程解释如下:

  • 1 -初始化应用推送证书
  • 2 -应用运行在iOS设备上,向云推送Server做绑定操作
  • 3 -给云推送服务发送请求,向指定iOS设备推送消息(广播或组播不需要user id
  • 4 -云推送服务器用应用的推送证书和APNs Server建立连接,并向指定设备的DeviceToken推送消息
  • 5 - APNsiOS设备推送消息

需要的资源

  • 客户端SDK包含:libBPush.aBPush.h文件,以及PushDemo示例工程。
    下载地址:http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/sdk/clientsdk
  • 服务端SDK下载地址:http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/sdk/serversdk
  • 应用的APNs推送证书

开发模式和生产模式

iOS应用的开发版和发布版所使用的APNs推送服务器是不同的,用于签名的APNs证书也分开发版和发布版,而且不同版本的应用在设备上获取的device token也不同。

云推送采取的策略是:推送消息时,开发版和发布版使用相同的域名进行推送并通过deploy_status参数加以区分。

域名:http://channel.api.duapp.com

注:部署状态(deploy_status)指应用当前的部署状态,可取值:

1开发状态 2生产状态

若不指定,则默认设置为生产状态。

APNs证书准备

这里假设您的Mac已经具备iOS应用开发以及APNs开发的环境。如果未具备,请百度之。


1. p12证书导出

在钥匙串访问中选中推送证书,导出为个人信息交换文件(.p12格式)。

push_ios_help_2a.png

选择文件格式、文件名和保存路径。

push_ios_help_3a.png

输入导出密码。

push_ios_help_4.png


2. pem证书生成

p12证书文件转换成pem证书文件。在终端里运行以下命令转换:

openssl pkcs12 -in MyApnsCert.p12 -out MyApnsCert.pem -nodes

提示输入密码,就是p12的导出密码。

SDK集成

添加SDKAPP工程。

1. libBPush.aBPush.h添加到Xcode工程

2. 添加JSONKit.mJSONKit.hXcode工程

libBPush.a引用了开源的JSONKit库。如果您的工程已经使用了该库,可以省略这一步。


3. 创建并配置BPushConfig.plist文件

在工程中创建一个新的Property List文件,并命名为BPushConfig.plist,添加以下键值:

{

    “PRODUCTION_MODE” = NO

    “API_KEY” = “uZbmgZKhfumvGYGowcjSPFc1” 

    “DEBUG” = NO

}

PRODUCTION_MODE

必选。应用发布模式。开发证书签名时,值设为”NO”;发布证书签名时,值设为”YES”。请在调试和发布应用时,修改正确设置这个值,以免出现推送通知无法到达。

API_KEY

必选。百度开发者中心为每个app自动分配的api key,在开发者中心app基本信息中可以查看。如下图:

push_ios_help_5.png

DEBUG

可选。Push SDK调试模式开关,值为YES时,将打开SDK日志。默认关闭。


4. application: didFinishLaunchingWithOptions:中调用API,初始化Push

- (BOOL)application:(UIApplication *)application 

                didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    self.mainViewController = [[ViewController alloc] initWithNibName:@"MainWindow" bundle:nil];

    self.window.rootViewController = self.mainViewController;

    

    [window makeKeyAndVisible];    

    

    [BPush setupChannel:launchOptions]; // 必须

    

    [BPush setDelegate:self]; // 必须。参数对象必须实现onMethod: response:方法,本示例中为self

    

    // [BPush setAccessToken:@"3.ad0c16fa2c6aa378f450f54adb08039.2592000.1367133742.282335-602025"];  //可选。api key绑定时不需要,也可在其它时机调用

    

    [application registerForRemoteNotificationTypes:

              UIRemoteNotificationTypeAlert

            | UIRemoteNotificationTypeBadge

            | UIRemoteNotificationTypeSound];    

    

    return YES;

}


5. application: didRegisterForRemoteNotificationsWithDeviceToken:中调用API,注册device token

- (void)application:(UIApplication *)application 

                didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 

{

    

    [BPush registerDeviceToken:deviceToken]; // 必须

    

    [BPush bindChannel]; // 必须。可以在其它时机调用,只有在该方法返回(通过onMethod:response:回调)绑定成功时,app才能接收到Push消息。一个app绑定成功至少一次即可(如果access token变更请重新绑定)。

}


6. 实现BPushDelegate协议,必须实现方法onMethod:response:

// 必须,如果正确调用了setDelegate,在bindChannel之后,结果在这个回调中返回。

// 若绑定失败,请进行重新绑定,确保至少绑定成功一次

- (void) onMethod:(NSString*)method response:(NSDictionary*)data 

{

    if ([BPushRequestMethod_Bind isEqualToString:method]) 

    {

        NSDictionary* res = [[NSDictionary alloc] initWithDictionary:data];


        NSString *appid = [res valueForKey:BPushRequestAppIdKey];

        NSString *userid = [res valueForKey:BPushRequestUserIdKey];

        NSString *channelid = [res valueForKey:BPushRequestChannelIdKey];

        int returnCode = [[res valueForKey:BPushRequestErrorCodeKey] intValue];

        NSString *requestid = [res valueForKey:BPushRequestRequestIdKey];

    }

}


7. application: didReceiveRemoteNotification:中调用API,处理接收到的Push消息:

- (void)application:(UIApplication *)application 

                didReceiveRemoteNotification:(NSDictionary *)userInfo 

{

    [BPush handleNotification:userInfo]; // 可选

}

推送消息

管理控制台推送通知

在管理控制台以界面的形式,便捷初始化证书和推送通知。

1. 初始化证书

在选中某个应用后,点击左侧栏的推送,点击推送设置按钮,选择本地的APNs开发证书或生产证书,保存设置即可。

push_cer.png

初始化成功后页面显示如下:

push_ioscer.png

2. 推送通知

在推送消息页面选择通知:

push_console_notify.png

填写通知内容:

push_iosmsg.png

勾选ios设备:

push_device.png

在高级设置中可以指定通知提示音效果和角标数。音频文件填写您的ios应用中的音频资源名,支持aiffwavcaf格式,如cat.caf。角标请填写整数,ios设备收到通知后,您的应用图标上将显示该角标值。

push_iosmusi.png

通过附加字段实现iOS通知推送的自定义内容:

push_add.png

注:附加字段对AndroidiOS同时起作用。

云推送的iOS通知体格式,完全按照APNs格式推送。关于各字段更详细的介绍请参考相关的苹果开发者文档

PHP SDK推送通知

1. 初始化证书

$channel = new Channel($apiKey, $secretKey); // 请正确设置apiKeysecretKey,在开发者中心应用基本信息中查看


$fd = fopen($devcert, 'r');

$devcert = fread($fd, filesize($devcert)); // 开发版APNs pem证书


$fd = fopen($discert, 'r');

$discert = fread($fd, filesize($discert)); // 发布版APNs pem证书


$ret = $channel->initAppIoscert($cert_name, $cert_des, $dis_cert, $dev_cert); // cert_namecert_des您自定义字符串即可


if (false === $ret) {   

    error_output ( 'WRONG, ' . __FUNCTION__ . ' ERROR!!!!!' ) ;

    error_output ( 'ERROR NUMBER: ' . $channel->errno ( ) ) ;

    error_output ( 'ERROR MESSAGE: ' . $channel->errmsg ( ) ) ;

    error_output ( 'REQUEST ID: ' . $channel->getRequestId ( ) );

else 

{   

    right_output ( 'SUCC, ' . __FUNCTION__ . ' OK!!!!!' ) ;

    right_output ( 'result: ' . print_r ( $ret, true ) ) ;

}

证书初始化只需要一次即可。如果证书变更或者过期,请及时地重新初始化证书。

2. 推送通知

$channel = new Channel ( $apiKey, $secretKey ) ; // 请正确设置apiKeysecretKey,在开发者中心应用基本信息中查看


$push_type = 1; //推送单播消息


$optional[Channel::USER_ID] = $user_id; // 手机端绑定获取的user id

$optional[Channel::CHANNEL_ID] = $channel_id; // 手机端绑定获取的channel id

$optional[Channel::DEVICE_TYPE] = 4; // 指定iOS设备类型

$optional[Channel::MESSAGE_TYPE] = 1;


$message = array(

    "aps" => array( 

        "alert" => "Message from 云推送",

        "badge" => 1,

        "sound" => "cat.caf" // 提示音,需要在Xcode工程中添加同名的音频资源

        )

    );


$message_key = "msg_key1";


$ret = $channel->pushMessage ( $push_type, $message, $message_key, $optional ) ;


if ( false === $ret )

{

    error_output ( 'WRONG, ' . __FUNCTION__ . ' ERROR!!!!!' ) ;

    error_output ( 'ERROR NUMBER: ' . $channel->errno ( ) ) ;

    error_output ( 'ERROR MESSAGE: ' . $channel->errmsg ( ) ) ;

    error_output ( 'REQUEST ID: ' . $channel->getRequestId ( ) );

}

else

{

    right_output ( 'SUCC, ' . __FUNCTION__ . ' OK!!!!!' ) ;

    right_output ( 'result: ' . print_r ( $ret, true ) ) ;

}

如果您用的是开发版证书签名的应用,请切换到开发版域名进行推送,具体做法参考上面的章节:开发模式和生产模式 示例中推送的消息为APNs标准格式,如果需要和Android端一起推送,可以查看云推送帮助文档中,REST API列表章节下的push_msg接口的messages参数说明。http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/api/list#push_msg

快速体验PushDemo

  • 1. Xcode打开发布包内部的PushDemo工程;
  • 2. 修改工程plist配置文件identifierPushDemo-Info.plist => Bundle identifier的值改为您应用的Provisioning Profile对应的identifier
  • 3. 修改BPushConfig.plist中的API_KEY值,为您在百度开发者中心申请的应用的api key
  • 4.在设备上运行PushDemo后,点击”Bind”按钮。如果Bind成功,屏幕上方将展现服务端返回的app idchannel iduser id。屏幕下方显示服务端返回的完整结果;
  • 5.按照 推送消息章节中描述的方法,设置useridchannelid为第4步中在设备上获取的相应值,进行推送,端上将收到推送通知。
  • 6. 当您需要在ios8设备中调试时,请将AppDelegate.m文件中的宏定义#define SUPPORT_IOS8 0中的0改为1


iPhone SDK的版本必须和真机版本一致,版本不兼容的话会出现找不到设备之类的错误。


JXT.mobileprovision的文件,这个文件是要装到手机里面的。


打开Xcodewindow菜单下的Organizer,将JXT.mobileprovision文件添加到Provisioning里面。

这时,打开你的设备,你会发现在设置->通用->描述文件里面有个东西,那就是你的证书了。然后再双击JXT.mobileprovision这个文件,

这样你的Xcode就被激活了,这时查看Users\用户名\Library\MobileDevice\Provisioning Profiles下面,应该多了一个

XXXXXX-XXXXXX-XXXXX-XXXXXX.mobileprovision的文件。

 

接着,打开你的工程,并打开plist文件,将里面的Bundle identifier改成com.aurora.jxt

 

然后,打开工程的info,并按照下图进行设置:

 

如果你想选中的那一项是灰色的,那么你前面的某些流程一定出了问题。

 

然后,Targetsinfo,按照下图进行设置:



 

最后,选中Device Debug,然后Build,大功告成了。

 




Xcode中新建一个项目,加入百度云推送sdk,按照PDF说明文档集成。运行时报错。

"_OBJC_CLASS_$_BPush", referenced from:

在百度的问题回复中找到了原因,不支持arm64

ios sdk貌似不支持arm64啊! : "_OBJC_CLASS_$_BPush", referenced from: Symbol(s) not found for architecture arm64

您好,现在暂时不支持arm64,我们会将您的建议反馈给相关的产品考虑的,敬请期待。

所以Build Setttings 中的 Architectures 选择只支持arm v7arm v7s的。



// 必填 验证码, validation_tokenappkey app_master_secrettimertampMD5码,

//  实力代码参展附录G如果使用了签名,则这个字段不填


0 0
原创粉丝点击