Discuz的BigApp插件使用JPush来进行推送,但原先的设计,和JPush服务器真正通信的服务器是在游族的,并不在BigApp插件本身。所以BigApp插件源码里并没有JPush Php SDK的集成。这也是为什么插件里面有着大量的http://app.youzu.com/ 的配置URL以及需要去游族申请APP ID进行所谓的站长认证功能。
鉴于游族已经不再提供服务器,所以这部分的代码我们需要集成到BigApp插件本身来实现。
关于推送,在服务器端,我们需要考虑的是,当发送消息,添加好友时,对方得到相应的推送。在代码中,最终可以发现两组类似的实现
第一组
- bigapp/models/push/JpushClient.php
- bigapp/pushmessage.inc.php
- bigapp/pushaccount.inc.php
- bigapp/pushmsg.inc.php
第二组
- bigapp/libs/pushmsg.inc.php
- bigapp/api/1/addfriend.php
- bigapp/api/1/sendreply.php
- bigapp/api/1/sendpm.php
可能理解不深刻,不太清楚为什么会有这两组实现,而且其中有一个文件名还是一样的,但是放置的目录不同且代码类似但又不通。
最后调试发现,网页上发送消息时,最终会调用第二组的pushmsg.inc.php的sendMessage函数。
1 | public static function sendMessage($uid, $title, $content, $msgType, $extra = null, $mask = 3, $jpushAk = null, $jpushSk = null) |
目前看到的是,当加好友,发送消息以及回复消息,都会调用这个函数。函数的参数可以看到有我们需要的uid(相当于JPush的alias), 以及发送的内容,类型。
代码里有大量的关于站长认证用的App ID和APP Secret的检查,但并没有真正的JPush发送的代码。
新的设计是,在这个函数里添加自己的JPush发送的代码。
集成JPush的demo
1 | sendMessage($uid, $title, $content, $msgType, $extra = null, $mask = 3, $jpushAk = null, $jpushSk = null) |
先测试把Demo集成进来,注意BigApp插件源码里有很多手机检测
1 | if (!defined('IN_MOBILE_API')) { |
在测试时,先把这些代码注释掉。
还有,注意JPush SDK的autoload.php中定义的classLoader使用了spl_autoload_register,和Discuz的class_core.php定义的autoload冲突,因此需要把autoload文件中的discuz_error::exception_error($exc);删除。
暂时不清楚这些改动的负面作用。
最终的测试结果是,当通过论坛网页,A用户向B用户发送消息是,手机端确实能收到一条消息推送(ALL User)的推送测试。证明修改的地方和方案是可行的。
接下来就是定向推送的事情了,这需要服务器和客户端针对alias进行定制。