iOS集成指南
iOS云推送简介
基本理念
整合Android、iOS平台,扩展统一的消息格式和API,提供统一的推送服务。减少开发维护工作量,封装和优化APNs推送云/端接口,提升推送吞吐、性能和稳定性。
云推送的iOS实现基于苹果公司的APNs服务,相当于给APNs做了层代理。设计的基本思路是:
- 客户端上,尽可能的保持原有APNs编程模型,让开发者的切换成本最小。只需在原有APNs的编码基础上,增加云推送的初始化和绑定接口的调用。
- 服务端上,尽可能的做到全权代理,最大节省开发工作量。只需初始化推送证书的操作。
应用、云推送和APNs的关系
对应上图的流程标号,各个过程解释如下:
- 1 - 初始化应用推送证书
- 2 - 应用运行在iOS设备上,向云推送Server做绑定操作
- 3 - 给云推送服务发送请求,向指定iOS设备推送消息(广播或组播不需要user id)
- 4 - 云推送服务器用应用的推送证书和APNs Server建立连接,并向指定设备的DeviceToken推送消息
- 5 - APNs向iOS设备推送消息
需要的资源
- 客户端SDK 包含:libBPush.a和BPush.h文件,以及PushDemo示例工程。
下载地址:http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/sdk/clientsdk
- 应用的APNs推送证书
开发模式和生产模式
iOS应用的开发版和发布版所使用的APNs推送服务器是不同的,用于签名的APNs证书也分开发版和发布版,而且不同版本的应用在设备上获取的device token也不同。
云推送采取的策略是:推送消息时,开发版和发布版使用相同的域名进行推送并通过deploy_status参数加以区分。
域名:http://channel.api.duapp.com
注:部署状态(deploy_status)指应用当前的部署状态,可取值:
1: 开发状态 2: 生产状态
若不指定,则默认设置为生产状态。
APNs证书准备
这里假设您的Mac已经具备iOS应用开发以及APNs开发的环境。如果未具备,请百度之。
1. p12证书导出
在钥匙串访问中选中推送证书,导出为个人信息交换文件(.p12格式)。
选择文件格式、文件名和保存路径。
输入导出密码。
2. pem证书生成
将p12证书文件转换成pem证书文件。在终端里运行以下命令转换:
openssl pkcs12 -in MyApnsCert.p12 -out MyApnsCert.pem -nodes
提示输入密码,就是p12的导出密码。
SDK集成
添加SDK到APP工程。
1. 将libBPush.a和BPush.h添加到Xcode工程
2. 添加JSONKit.m和JSONKit.h到Xcode工程
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基本信息中可以查看。如下图:
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开发证书或生产证书,保存设置即可。
初始化成功后页面显示如下:
2. 推送通知
在推送消息页面选择通知:
填写通知内容:
勾选ios设备:
在高级设置中可以指定通知提示音效果和角标数。音频文件填写您的ios应用中的音频资源名,支持aiff、wav、caf格式,如cat.caf。角标请填写整数,ios设备收到通知后,您的应用图标上将显示该角标值。
通过附加字段实现iOS通知推送的自定义内容:
注:附加字段对Android和iOS同时起作用。
云推送的iOS通知体格式,完全按照APNs格式推送。关于各字段更详细的介绍请参考相关的苹果开发者文档。
用PHP SDK推送通知
1. 初始化证书
$channel = new Channel($apiKey, $secretKey); // 请正确设置apiKey和secretKey,在开发者中心应用基本信息中查看
$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_name和cert_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 ) ; // 请正确设置apiKey和secretKey,在开发者中心应用基本信息中查看
$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配置文件identifier:PushDemo-Info.plist => Bundle identifier的值改为您应用的Provisioning Profile对应的identifier;
- 3. 修改BPushConfig.plist中的API_KEY值,为您在百度开发者中心申请的应用的api key;
- 4. 在设备上运行PushDemo后,点击”Bind”按钮。如果Bind成功,屏幕上方将展现服务端返回的app id、channel id和user id。屏幕下方显示服务端返回的完整结果;
- 5. 按照 推送消息 章节中描述的方法,设置userid和channelid为第4步中在设备上获取的相应值,进行推送,端上将收到推送通知。
- 6. 当您需要在ios8设备中调试时,请将AppDelegate.m文件中的宏定义#define SUPPORT_IOS8 0 中的0改为1。
JXT.mobileprovision的文件,这个文件是要装到手机里面的。
打开Xcode的window菜单下的Organizer,将JXT.mobileprovision文件添加到Provisioning里面。
这时,打开你的设备,你会发现在设置->通用->描述文件里面有个东西,那就是你的证书了。然后再双击JXT.mobileprovision这个文件,
这样你的Xcode就被激活了,这时查看Users\用户名\Library\MobileDevice\Provisioning Profiles下面,应该多了一个
XXXXXX-XXXXXX-XXXXX-XXXXXX.mobileprovision的文件。
接着,打开你的工程,并打开plist文件,将里面的Bundle identifier改成com.aurora.jxt。
然后,打开工程的info,并按照下图进行设置:
、
如果你想选中的那一项是灰色的,那么你前面的某些流程一定出了问题。
然后,Targets的info,按照下图进行设置:
最后,选中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 v7和arm v7s的。
// 必填 验证码, validation_token为appkey, app_master_secret与timertamp的MD5码,
// 实力代码参展附录G。 如果使用了签名,则这个字段不填