进阶
打开 URI 并传参
使用消息推送功能通过通知栏打开页面 URI 或是网页 URI 时,组件内部将按照系统默认的方式展示 URI 内容。当需要使用其它方式打开 URI 时(如:自定义webview),实现该接口,并传入接口实现类,则可实现自定义 URI 打开方式。
接口定义
public abstract class TMFPushIntentCreator {
/**
* 返回跳转打开uri的intent
* @param context 打开页面使用的上下文
* @param type 跳转类型,参考EJumpType定义: 1-APP跳转,2-Url跳转,3-跳转应用内页,4-不跳转
* @param uri 要打开的uri
* @param jsonExtras json格式的附加参数
* @return 需要打开的uri的Intent
*/
public Intent createIntent(Context context, int type, String uri, String jsonExtras) {
return null;
}
}
参数说明
参数名称 | 参数类型 | 参数描述 | 必选 |
---|---|---|---|
context | Context | 供使用的上下文 | Y |
type | int | 跳转类型,参考EJumpType定义: 1-APP跳转,2-Url跳转,3-跳转应用内页,4-不跳转 | Y |
uri | String | 需要打开的 URI | Y |
extra | String | 附加参数 | Y |
Sample
//传入打开uri的intent,不传则打开默认浏览器
PushCenter.setPushIntentCreator(new OpenUrlForPushImpl());
public class OpenUrlForPushImpl extends TMFPushIntentCreator {
@Override
public Intent createIntent(Context context, int type, String uri, String jsonExtras) {
if (type == EJumpType._EJT_URL && !TextUtils.isEmpty(uri)) {
Intent intent = new Intent(context, JSapiActivity.class);
intent.putExtra(JSapiActivity.PAGE_TYPE, JSapiActivity.WEB_PAGE);
intent.putExtra(JSapiActivity.PAGE_URL, uri);
return intent;
}
return null;
}
}
实现自定义通知栏
对于通知栏消息的展示,push 组件提供通知栏默认样式,即展示默认 app icon,标题,内容。默认通知栏的展示图标可通过在 mipmap 文件夹下,放置资源图片进行修改。通知栏小图标命名为 ic_notification_small,大图标命名为 ic_notification_large,当 mipmap 文件夹中,放置了对应命名的资源文件时,组件内部将获取资源用于默认通知栏样式展示。(请在对应文件夹下放置对应分辨率的图片)。
组件提供自定义通知栏样式接口。当需要自定义通知栏样式时,则需实现 ICustomNotificationForPush 接口并将其实现类传入 push 组件。同时,由于通知栏事件由外部处理,组件无法处理事件上报,故提供通知栏事件上报接口,由外部调用上报。
接口定义
public interface ICustomNotificationForPush {
/**
* 调用自定义通知栏的展示
* @param tmfPushMessage
* @return 自定义展示通知栏成功返回true,失败返回false
*/
public boolean showCustomNotification(TMFPushMessage tmfPushMessage);
}
方法参数
请参见 TMFPushMessage(通知栏消息数据结构) 。
Sample
PushCenter.setCustomNotification(new CustomNotificationForPushImpl());//可选,非厂商push时通知栏自定义样式的实现
public class CustomNotificationForPushImpl implements ICustomNotificationForPush {
@Override
public void showCustomNotification(TMFPushMessage tmfPushMessage) {
//展示自定义的通知栏
CustomNCFactory.getInstance()
.showPushNotification(ContextHolder.sContext,tmfPushMessage);
}
}
实现通知栏事件上报接口-自定义通知栏时使用
自定义通知栏样式时,通知栏事件的上报须由调用方发起上报,故提供上报接口如下。
接口定义
public interface ICustomNCReporter {
public static final int NC_EVENT_SHOW = EPushPhase.EPP_Show;//通知栏展示
public static final int NC_EVENT_CLICK = EPushPhase.EPP_Click;//通知栏点击
public static final int NC_EVENT_CLEAR = EPushPhase.EPP_Clear;//用户主动清除通知栏
public static final int NC_EVENT_APP_CANCEL = EPushPhase.EPP_Cancel;//App内部清除通知栏
/**
* 上报通知栏事件
* @param tmfPushMessage 通知栏消息体
* @param event 通知栏事件
*/
public void reportNCEvent(TMFPushMessage tmfPushMessage, int event);
}
参数说明
参数名称 | 参数类型 | 参数描述 | 必选 |
---|---|---|---|
tmfPushMessage | TmfPushMessage | 通知栏消息数据体 | Y |
Event | int | 通知栏事件 int 值 | Y |
Sample
//上报通知栏事件-展示
PushCenter.getCustomNCReporter().reportNCEvent(tmfPushMessage, ICustomNCReporter.NC_EVENT_SHOW);
条件推送设置
账号推送
通过控制台推送消息时,可以指定按用户账号推送,当需要使用此功能时,需要在客户端调用接口setUserId(String userId)
设置 userId,该接口按传值判断绑定/解绑,传入空串即为解绑操作。
接口定义
/**
* 设置UserId
* @param userId
*/
public static void setUserId(String userId) {}
Sample
//设置userId的接口示例,用于按用户标识做消息推送,实际使用场景为获取到userId后进行上报
ProfileManager.setUserId("custom_userid_1");
// userId解绑示例
ProfileManager.setUserId("");
地区推送
通过控制台推送消息时,可以指定按地区推送,当需要使用此功能时,需要在客户端调用地理位置上报接口,将客户端地区信息同步到云端。
接口定义
/**
* 地理位置上报(按地区推送)
* @param country 国家
* @param province 省
* @param city 市
*/
public static void setLocation(String country,String province,String city){}
说明:
ProfileLocationReporter
为 TMFDemo 中封装好的定位后将结果上报到 TMF 后台的接口,可直接复制相应代码进行使用。
自定义标签推送
通过 ProfileManager.setTag()
接口进行自定义标签的上报,tag 格式为 key-value 格式。同样,当需要做标签解绑操作时,则上报 value 为空串表示解绑。自定义标签使用前,需事先在TMF后台添加相关配置,功能入口:“数据同步->标签管理”,详细使用方法可参见数据同步 > 使用控制台
接口定义
/**
* 设置单个标签
* 如果标签key已设置过,则直接覆盖其value
* @param tag
* @param value
*/
public static void setTag(String tag, String value){}
/**
* 设置多个标签
* @param tags
*/
public static void setTags(Map<String, String> tags){
Sample
//设置自定义标签示例
ProfileManager.setTag("tag1","tag1_value1");
// 自定义标签删除示例,value为空即删除
ProfileManager.setTag("tag1","");
上报失败的标签将通过 ITagErrorListener 接口进行回调,该接口将返回上报失败的 tag 及其失败原因对应的错误码,通过 ProfileManager.setTagErrorListener()设置回调接口。
注意:需先设置回调接口再进行上报,即 setTagErrorListener() 的调用时机需在调用 setTag() 之前。若不关注 tag 上报是否失败,也可不设置该回调接口。
接口定义
/**
* 设置自定义Tag的错误回调
*/
public interface ITagErrorListener {
//错误回调
public void onError(List<TagResult> tagResultList);
/**
* Tag结果结构体,包括Tag的key-value及其错误码
*/
public class TagResult{
public String mTagKey;
public String mTagValue;
public int mErrorCode;
public TagResult(String tagKey,String tagValue,int errorCode){
mTagKey = tagKey;
mTagValue = tagValue;
mErrorCode = errorCode;
}
}
}
Sample
// 自定义标签设置错误回调接收示例
ProfileManager.setTagErrorListener(new ITagErrorListener() {//全局自定义标签错误监听器
@Override
public void onError(List<TagResult> tagResultList) {
if (tagResultList != null && tagResultList.size() > 0){
for (TagResult tagResult : tagResultList){
Log.i("TMF_Profile", "tagKey=" + tagResult.mTagKey + ",tagValue=" + tagResult.mTagValue + ",errorCode=" + tagResult.mErrorCode);
}
}
}
});
错误码定义
错误码 | 说明 |
---|---|
-1004 | 上报标签不可用。标签无效或未配置,需检查配置 |
-1005 | 上报标签值不在配置范围内 |
-1006 | 上报标签值过长,需要小于128字节 |
自定义标签快速上报结果回调接口
该接口直接调用 shark 上报自定义标签,无错误重试逻辑,只透传设置结果。
接口定义
/**
* 快速上报单个tag并回调该tag的设置结果
* 本接口用于快速上报tag并获取tag设置结果,与其它tag的接口逻辑区分处理,只透传上报结果,组件内部不会做失败重试
* 注:本接口与setTag接口互斥,即设置某个tag只能二者选其一使用,不能先后分别调用两个接口
* 原因举例:setTag接口上报速度较慢,先调用原接口设置某tag值为A,后调用本接口设置值为B时,
* 由于本接口设置速度较快,可能存在值B设置成功后才设置为值A的情况
* @param tagKey
* @param tagValue
* @param iSetTagCallback
*/
public static void setTagWithCallback(String tagKey, String tagValue, ISetTagCallback iSetTagCallback);
/**
* 单个tag设置结果回调
*/
public interface ISetTagCallback {
/**
* 设置tag的结果回调
* @param resultCode 结果码,详见TagErrorCode
*/
public void onResult(int resultCode);
}
错误码定义
public class TagErrorCode {
public static final int ERR_NONE = ECTRE_Success;//无错误,即上报成功
public static final int ERR_TagNullError = -998;//设置了tag中存在key/value为null的错误
public static final int ERR_NetworkError = -999;//网络错误,即当前无网络
public static final int ERR_ServerError = ECTRE_ServerError;//服务端发生错误
public static final int ERR_SDKInnerError = ECTRE_ActionError;//SDK内部发生错误
//云端返回上报标签不符合要求的具体错误码
public static final int ERR_ReportTagNotAvai = ECTRE_ReportTagNotAvai;//上报标签不可用。标签无效或未配置,需检查配置
public static final int ERR_ReportTagValueNotAvai = ECTRE_ReportTagValueNotAvai;//上报标签值不在配置范围内
public static final int ERR_ReportTagValueTooLong = ECTRE_ReportTagValueTooLong;//上报标签值过长,需要小于128字节
}
Sample
// 自定义标签快速上报及回调接口示例,建议不与setTag接口混合使用
ProfileManager.setTagWithCallback("tag2", "tag2_value1", new ISetTagCallback() {
@Override
public void onResult(int resultCode) {
Log.i("TMF_Profile","resultCode = "+resultCode);
}
});