TP5+Hbuilder+极光推送
PHP部分
// 极光的key和secret,在极光注册完应用后,会生成
protected function _initialize()
{
parent::_initialize();
$jpushConfig = Config::get("jpush");
$this->app_key = $jpushConfig['app_key'];
$this->master_secret = $jpushConfig['master_secret'];
$this->url = "https://api.jpush.cn/v3/push";//推送的地址
$this->userModel = model('User');
//用户信息
if (Session::get('user.share_user_id')) {
$this->user_id = Session::get('user.share_user_id');
$this->company_id = Session::get('user.share_com_id');
} else {
$this->user_id = Session::get('user.id');
$userInfo = $this->userModel->where(['id' => $this->user_id])->find();
$this->company_id = $userInfo['company_id'];
if ($this->company_id != Session::get('user.company_id'))
Session::set('user.company_id', $this->company_id);
}
}
public function sendMsg($type,$pushData){
//需要为设备设置aliassendMsg
if($type=='all'){
$receiver = 'all';
}else{
$alias = $type;
$receiver['alias'] = array($alias);
}
$content = $pushData['content'];
$title = $pushData['title'];
$extras = array();
$result = $this->push($receiver,$content,$title,$extras);
if($result){
$res_arr = json_decode($result, true);
if(isset($res_arr['error'])){ //如果返回了error则证明失败
//错误信息 错误码
echo json_encode(array('status'=>0,'errorCode'=>$res_arr['error']['code'],'errorMessage'=>$res_arr['error']['message']));
exit;
}else{
//处理成功的推送......
//可执行一系列对应操作~
echo json_encode(array('status'=>1,'msg'=>'推送成功'));
exit;
}
}else{ //接口调用失败或无响应
echo json_encode(array('status'=>0,'msg'=>'接口调用失败或无响应'));
exit;
}
}
public function push($receiver = 'all', $content = '', $title = '', $extras = array(), $m_time = 86400)
{
$app_key = $this->app_key; //待发送的应用程序(appKey),只能填一个。
$master_secret = $this->master_secret; //主密码
$url = "https://api.jpush.cn/v3/push"; //推送的地址
$base64 = base64_encode("{$app_key}:{$master_secret}");
$header = array("Authorization:Basic {$base64}", "Content-Type:application/json");
$data = array();
$data['platform'] = 'all'; //目标用户终端手机的平台类型android,ios,winphone
$data['audience'] = $receiver; //目标用户
$data['notification'] = array(
//统一的模式--标准模式
"alert" => $content,
//安卓自定义
"android" => array(
"alert" => $content,
"title" => $title,
"builder_id" => 1,
"extras" => array("data" => $extras)
),
//ios的自定义
"ios" => array(
"alert" => $content,
"badge" => "1",
"sound" => "default",
"content-available" => true,
"extras" => array("data" => $extras)
),
);
//附加选项
$data['options'] = array(
"sendno" => time(),
"time_to_live" => $m_time, //保存离线时间的秒数默认为一天
"apns_production" => false, //指定 APNS 通知发送环境:0开发环境,1生产环境。
);
$param = json_encode($data);
$res = $this->push_curl($param, $header, $url);
if ($res) { //得到返回值--成功已否后面判断
return $res;
} else { //未得到返回值--返回失败
return false;
}
}
//推送的Curl方法
public function push_curl($param = "", $header = "", $url = "")
{
if (empty($param)) {
return false;
}
$postUrl = $url;
$curlPost = $param;
$ch = curl_init(); //初始化curl
curl_setopt($ch, CURLOPT_URL, $postUrl); //抓取指定网页
curl_setopt($ch, CURLOPT_HEADER, 0); //设置header
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_POST, 1); //post提交方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); // 增加 HTTP Header(头)里的字段
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // 终止从服务端进行验证
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
$data = curl_exec($ch); //运行curl
curl_close($ch);
return $data;
}
Hbuilder本地打包
步骤:
- 选择项目;
- 发行;
- 原生app-本地打包;
- 生成本地打包app资源;
参考【Android平台本地(离线)打包指南】
- 配置编译工程
导入演示应用HBuilder-Hello工程
启动AndroidStudio 点击导入工程“import project”
- 选中工程所在目录点击“OK”
- 选择生成的AndroidStudio工程的保存路径,然后点击“next”,
- 在演示工程中已经配置好HelloH5应用相关资源,完成导入后,可Shift F10直接编译运行:
- 从SDK目录中拷贝要使用的feature库到工程app/libs目录
参考“Feature列表.xls”文档确定应用中使用到的扩展API,拷贝libs目录中对应的**“jar”文件拷贝到工程的app->libs目录下。
如果有引用“so”文件需要拷贝到工程的app->src->main->jniLibs**下对应目录中。
如使用分享功能(新浪微博分享、腾讯微博分享,微信分享),则需要拷贝以下文件:
- 拷贝完成后在工程中刷新可在工程的libs目录下显示:
- 配置应用的权限
参考“Feature列表.xls”文档确定应用中使用到的扩展API,在AndroidManifest.xml文件中删除不用到API的权限。
如不使用音频(plus.audio.*)相关5+ API,则可删除Audio相关的权限:
- 配置其它第三方库的数据
由于第三方库需要使用一些特定的数据,所以在使用时需要将相关参数配置到AndroidManifest.xml文件中。
如使用分享功能,则需要配置各分享平台的申请应用的相关参数:
- 配置应用的包名及版本号
打开AndroidManifest.xml文件,在代码视图中修改根节点的package属性值,如下:
package为应用的包名,采用反向域名格式,为应用的标识;
versionCode为应用的版本号,建议与manifest.json中version -> code值一致;
versionName为应用的版本名称,建议与manifest.json中version -> name值一致。
- 配置应用名称
打开app->res -> values -> strings.xml文件,修改“app_name”字段值,该值为安装到手机上桌面显示的应用名称,建议与manifest.json中name(基础配置中的应用名称)对应:
- 配置应用图标和启动界面
将应用的图标(文件名为icon.png)启动图片按照对应的尺寸拷贝到工程的app->src->main->res -> drawable-XXX目录下:
- 更新应用资源
打开app->src->main->assets -> apps 目录,将“HelloH5”目录名称修改为应用manifest.json中的id名称(这步非常重要,否则会导致应用无法正常启动),并将所有应用资源拷贝到其下的www目录中:
- 配置应用信息
打开app->src->main->assets -> data下的control.xml文件,修改appid和appver的值:
appid值为HBuilder应用的appid,必须与应用manifest.json中的id值完全一致;
appver为应用的版本号,必须与manifest.json中的version -> name值完全一致;
version值为应用基座版本号(plus.runtime.innerVersion返回的值),不要随意修改。
- 配置完成编译运行
应用配置完毕,按Shift F10编译运行应用
在弹出的设备列表对话框中选择要运行的设备:
参考【JPush HBuilder Demo步骤】
Demo 用法
通过 Android Studio 引入项目目录下的 android 目录,再替换 ./android/app/build.gradle 中的「应用的包名」和「应用的 AppKey」。
集成指南
HBuilder 项目集成第三方插件,需先参考 HBuilder 官方的离线打包教程,将您的 HBuilder 项目集成进 Android 工程中。之后再执行以下步骤:
1.拷贝 ./android/app/src/main/java/io.dcloud.feature.jpush 文件夹至你 Android Studio 工程的 /src/main/java/ 目录下。
2.拷贝 ./jpush.js 到你 Android Studio 工程的 /assets/apps/HBuilder应用名/js/ 下。
3.在 /assets/apps/你的应用名/www/manifest.json 文件中添加:
4.在 /assets/data/dcloud_properties.xml 中添加(如果已存在 Push feature,可以直接修改):
5.在 app/build.gradle 中添加:
6.在 AndroidManifest.xml 中添加:
打包apk报错
错误: app:transformClassesWithMultidexlistForDebug
参考:https://www.edwardbeazer.com/execution-failed-for-task-app-transformclasseswithmultidexlistfordebug/