本文共 2813 字,大约阅读时间需要 9 分钟。
针对现场互动产品开发中的极光推送问题,我们从以下几个方面进行了解决方案设计和实现:
一、项目背景
之前的产品采用微信小程序作为用户端,电视盒子APP作为显示端。用户在小程序端通过发送弹幕和霸屏信息,服务端将消息推送至安卓端(电视盒子APP)显示。为实现这一功能,我们选择了极光推送 SDK 处理第三方推送任务。在实际运行过程中,发现极光推送返回的状态可能与实际结果不符,因此我们需要通过观察电视盒子APP的接收情况来判断推送是否成功。
二、实现极光推送功能
为了确保推送的可靠性,我们采用以下方法:
在项目根目录下添加极光推送依赖包:
"require": { "jpush/jpush": "*"}
安装依赖:
composer install
开发极光推送类:
$deviceId, 'app_id' => $appId])->value('register_id'); $jpushConfig = JpushAppConfig::find($appId); $client = new JPush($jpushConfig->app_key, $jpushConfig->master_secret, null); return $client->push() ->setPlatform('android') ->addRegistrationId($registerId) ->message('jpush', array('extras' => $data)) ->options(array('time_to_live' => 10)) ->send(); }}
在控制器中调用推送功能:
jpush = new JpushSend(); } public function deviceRegister(Request $request) { $data = $request->validate([ 'app_id' => 'required', 'device_code' => 'required', 'register_id' => 'required' ]); $device_id = Device::where('device_code', $data['device_code'])->find(['id']); DeviceJpush::insert([ 'app_id' => $data['app_id'], 'device_id' => $device_id, 'register_id' => $data['register_id'] ]); return responseOk(); } public function push(Request $request) { $data = $request->validate([ 'app_id' => 'required', 'device_id' => 'required', 'data' => 'required' ]); PushRecord::insert([ 'app_id' => $data['app_id'], 'device_id' => $data['device_id'], 'data' => json_encode($data['data']) ]); event(new JpushMsg($pushRecord)); return responseOk(); }}
完成数据库设计:
device( id, device_code, device_name, ...)jpush_app_config( id, app_key, master_secret, package_name, ...)device_jpush( id, device_id, app_id, register_id)
三、应对推送失败的解决方案
为了确保每条推送能够成功接收,我们采取以下措施:
push_record( id, device_id, app_id, data, push_status)
pushRecord = $pushRecord; } public function broadcastOn() { return new PrivateChannel('channel-name'); }}
recordId = $recordId; } public function handle() { $num = Cache::get('record'.$this->recordId); if ($num > 10) return; $pushRecord = PushRecord::find($this->recordId); if ($pushRecord->push_status === 1) return; event(new JpushMsg($pushRecord)); }}
validate(['record_id' => 'required']); PushRecord::where('id', $data['record_id'])->update(['push_status' => 1]); return responseOk(); }}
通过以上方法,我们实现了对极光推送的可靠性监控和异常处理,确保每条推送能够在电视盒子APP中正确接收,并在出现问题时采用延迟重新推送机制,避免因推送失败导致用户体验下降。
转载地址:http://sfgyk.baihongyu.com/