云推送¶
服务概述¶
云推送(Push)是新浪云开发的协助开发者推送手机通知的服务,目前支持iOS和Android系统的推送。
iOS版本介绍¶
服务说明¶
开发者通过编写代码调用API接口(或直接通过新浪云提供的页面)推送消息,消息先存到新浪云,再由新浪云的推送服务发送到苹果的推送服务器(APNs),最后由APNs投递到用户的手机。请参照下图:
使用推送服务,首先请在新浪云应用的“服务管理”列表中找到“云推送”服务页面,在“推送设置”页面上传证书。证书的生成请参考苹果官方文档。证书上传成功后就可以通过调用新浪云云推送服务接口(或“云推送”页面“推送消息”页)推送手机通知了。
注解
为提高苹果推送的及时性和成功率,请开发者注意以下几点:
- 请注意证书的类型,正确选择开发环境和正式环境。
- 请注意证书的过期时间。bundle ID与App Id 保持一致。
- push函数调用成功,只代表消息已推送到新浪云服务器,并不代表成功推送到苹果服务器。(“推送统计”展示的推送成功数代表成功推送到苹果服务器)。
- 如需查看推送成功率(该数据会有十分钟左右延迟),可通过“推送统计”查看,也可以使用getinfo函数查看(目前该接口只提供当天的数据)。
- 如需要查看具体失败的原因,可通过“日志中心”的云推送页查看。
服务限制¶
单app最大上传证书数 | 10 |
使用示例¶
下面使用代码来说明云推送iOS服务的调用方式。
<?php
$cert_id = 1;
$device_token = "xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx";
$message = "hello world";
//这个是简单的例子,更复杂的消息格式请查看苹果官方文档
$body = array(
'aps' => array( 'alert' => $message , 'badge' => 1, 'sound' => 'in.caf')
);
$apns = new SaeAPNS();
//push消息到新浪云推送服务器
$result = $apns->push( $cert_id , $body , $device_token );
if( $result && is_array($result) ){
echo '发送成功';
var_dump( $result );
} else {
echo '发送失败';
var_dump($apns->errno(), $apns->errmsg());
}
//查看消息发送的汇总信息,返回值包括当天发送成功的消息数,以及因各类原因发送失败的消息数。
$result = $apns->getInfo($cert_id);
if ($result === false) {
echo "getInfo失败";
var_dump($apns->errno(), $apns->errmsg());
} else {
echo "getInfo成功";
var_dump($result);
}
?>
Android版本介绍¶
服务说明¶
开发者通过编写代码调用API接口(或直接通过新浪云提供的页面)推送消息,消息先存到新浪云,再由新浪云的推送服务投递到用户的手机。请参照下图:
使用推送服务,首先需要在新浪云应用的“服务管理”列表中找到“云推送”服务页面,在“推送设置”页面申请AppID。
Android Push Service用AppID来标识应用。申请完AppID后,即可参考 Android SDK 说明 在Android App中嵌入新浪云的SDK了。
App开发完成后,可以使用新浪云云推送服务接口推送手机通知。
服务限制¶
单app可申请的AppID | 1 |
离线消息存储条数 | 最后5条 |
离线消息有效期 | 12小时 |
最大消息长度 | 4M |
Android SDK 说明¶
概述¶
新浪云 Android Push SDK以Jar包的形式提供,方便开发者使用,对外的调用类只有一个PushManager,通过这个类可以打开、关闭、刷新Push的通道。Push通道以TCP长连接的形式存在。
集成SDK¶
从 云推送Android SDK 下载新浪云云推送Android的SDK并解压。
在Eclipse中打开需要使用云推送服务的工程,按照如下步骤集成。
在工程根目录下的libs文件夹中,导入SDK里的SinaPush_{version}_SAE_release.jar包和最新的android-support-v{version}.jar 包,若没有libs目录,则选中工程,右键new->folder,命名为libs。
在应用的 AndroidManifest.xml 中添加相关权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="yourPackageName.permission.SINA_PUSH" />
<!-- 添加 SinaPushSDK 自定义的权限 -->
<permission
android:name=" yourPackageName.permission.SINA_PUSH"
android:protectionLevel="normal" />
在应用的AndroidManifest.xml中配置服务
<!--
声明使用 SinaPushSDK 必须启动的服务
com.sina.push.service.SinaPushService注意:需要有 android:permission="
yourPackageName.permission.SINA_PUSH"
-->
<service
android:name="com.sina.push.service.SinaPushService"
android:label="PushDataCenter"
android:permission="yourPackageName.permission.SINA_PUSH"
android:process=":remote" >
<intent-filter>
<!--
SinaPushSDK service action 命名规则
sina.push.action.service.APPID
注意必须为: sina.push.action.service. + APPID
-->
<action android:name="sina.push.action.service.1004" />
<category android:name="android.category.DEFAULT" />
</intent-filter>
</service>
<!--
声明使用 SinaPushSDK 必须注册的广播事件
-->
<receiver android:name="com.sina.push.receiver.PushSDKReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<!--
声明使用 SinaPushSDK 接收透传消息的广播事件
-->
<receiver android:name=".SDKMsgReceiver" >
<intent-filter>
<action android:name="com.sina.push.msg.broadcast.1004" /></intent-filter>
</receiver>
<provider android:name="com.sina.push.datacenter.PushProvider"
android:process=":remote"
android:multiprocess="false"
android:authorities="com.sina.push.pushprovider.1004"/>
<meta-data android:name="sinapush_appid" android:value="1004" />
注解
上文Demo中的1004,应替换为自己应用的AppID,AppID需要从新浪云的服务页面申请。
在调用所有接口前,必须先进行初始化,且初始化只需要调用一次。
PushManager manager = PushManager.getInstance(getApplicationContext());
接收 Push 消息¶
消息分类
Push消息分为两类,一类是SDK处理的消息,一类是透传给App处理的消息。
- SDK处理的消息:Android Push SDK 收到消息后,SDK直接处理,不会透传给App。
- 透传给App的消息:Android Push SDK 收到消息后,直接封装,透传给App处理。如果想将消息透传给App,需要在推送消息时,添加extra字段。如:使用示例 中push时添加的 $extra 参数。
注解
如果想由应用自己来处理、展示 push 消息,那么必须由 Server 端在消息中 extra 字段内添加 json 格式的信息:
handle_by_app: 1 为 app 处理, 0 为 SDK 处理, 默认为 0。
接收Push消息
Push 的消息类型
类型 | 说明 | 消息实体 |
---|---|---|
MSG_TYPE_MPS_PUSH_DATA | Push 消息 | PushDataPacket |
MSG_TYPE_ACTION_SWITCH_CHANNEL | 通道打开消息 | ActionResult |
MSG_TYPE_SAE_DATA | Aid 消息 | String |
MSG_CHANNEL_HAS_BEEN_BUILDED | 通道打开消息 | 无 |
注解
aid是推送服务的设备标识,推送消息时,会要求提供aid参数:
- 设备的aid不是永久不变的,设备长时间未连接到服务器,aid标识会被服务器端删除,再次连接时会重新分配aid。
- 清除App数据也会导致aid改变。
Demo
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
int msg_type = intent.getIntExtra(MPSConsts.CMD_ACTION, -1);
switch(msg_type){
case MPSConsts.MSG_TYPE_MPS_PUSH_DATA:
PushDataPacket packet = intent.getParcelableExtra(MPSConsts.KEY_MSG_MPS_PUSH_DATA);
Toast.makeText(context, "onPush data: " + packet.getSrcJson(),
Toast.LENGTH_LONG).show();
break;
case MPSConsts.MSG_TYPE_UPLOAD_BUSINESS_ERROR:
break;
case MPSConsts.MSG_CHANNEL_HAS_BEEN_BUILDED:
System.out.println("MPSConsts.MSG_CHANNEL_HAS_BEEN_BUILDED!");
Toast.makeText(context, "MSG_CHANNEL_HAS_BEEN_BUILDED", Toast.LENGTH_LONG).show();
break;
case MPSConsts.MSG_TYPE_SAE_DATA:
String aid = intent.getStringExtra(MPSConsts.KEY_MSG_SAE_DATA);
LogUtil.debug("SDKMsgReceiver aid ===========" + aid);
Toast.makeText(context, aid, Toast.LENGTH_LONG).show();
break;
}
}
跳转到具体页面
1. 跳转到某个应用的页面: SDK 收到 push 消息后会发出一个 notification 或是弹出一个 dialog。当用户点击notification 或对话框上的按钮时,会跳转到相应的页面。例如掌中新浪,收到了一个 push下来的新闻消息,展示为 notification,点击后跳转到显示新闻的 activity 中。要想完成上述功能,需要在 push 消息中 acts 字段的参数中包含该应用的包名和 activity 的类名。
动作名/动作 ID:2
参数 1:包名
参数 2:完整类名
“acts”: [“2,com.sina.news,com.sina.news.ui.NewContentActivity”],
2. 跳转到浏览器: SDK 收到消息后如果想跳转到浏览器,需要在 push 消息中 acts 字段的参数中包含 url地址。
动作名/动作 ID:4
参数 1:url 地址
“acts”: [“4,http://www.sina.com”],
3. 通过 Scheme 跳转: 通过 Scheme 跳转到某个应用的 activity 中。
动作名/动作 ID:5
参数 1:scheme
“acts”: [“5,sinaweibo://sendweibo”],
使用示例¶
下面使用代码来说明云推送Android服务的调用方式。
<?php
$appid = 20001;
$token = 'BYfkQcUYULUB';
$title = 'title';
$msg = 'hello wolrd';
$acts = "[\"2,sina.Apns,sina.Apns.MainActivity\"]";
$extra = array(
'handle_by_app'=>'0'
);
$adpns = new SaeADPNS();
//appid 是应用的标识,从新浪云的推送服务页面申请
//token 是SDK通道标识,从SDK的onPush中获取
$result = $adpns->push($appid, $token, $title, $msg, $acts, $extra);
if ($result && is_array($result)) {
echo '发送成功!';
var_dump($result);
} else {
echo '发送失败。';
var_dump($apns->errno(), $apns->errmsg());
}
?>