其实刚开始导师叫我写,我是拒绝的,因为,你不能叫我写,我就马上去写…所以,我拖到了 deadline 前最后一天终于开始动笔。

声明:由于我只会写 PHP,不了解 IOS 那边的事,因此本篇文章不提供 IOS 的代码,恕小弟无能为力。此次代码均在 Laravel 框架下进行

目录


一、 安装

二、 推送的实现原理

三、 运行示例代码

四、 别名推送的实现方法

五、 推送代码的简单解析

六、 坑及注意事项

七、 极光推送与 Laravel 队列

一、安装


1.往composer.json里面放入:

2.在命令行中执行composer install或者composer update
3.完成啦 ^0^

二、推送的实现原理


  1. IOS 在 Apple Push Notification Service (苹果消息推送服务器,简称 APNs ) 配置开发证书和生产证书。
  2. IOS App 跟 APNs 要 device token, IOS App 接收 device token。
  3. IOS App 将 device token 发给 PHP 服务端。
  4. 当用户在 IOS App 上发送评论时/ Postman POST 推送方法时,服务端向 APNs 发送推送提醒。
  5. APNs 将推送发给 IOS App.

(图片及文字来自[这个]网站。)

三、运行示例代码


万事开头难,像我这样的渣渣,是连官网提供的去头去尾的代码我都看不懂的,所以果断 git clone 了 JPush 在 GitHub 上的文件,打开 example 观摩观摩。

1.首先,你需要引入 JPush,就像这样:

2.其次,要有 IOS App 的 AppKey 和 Master Secret,这两样东西都可以在极光网站注册账号,导入必要的证书来获取,这个是需要导入的证书:

导入完成之后

3.获取 AppKey 和 Master Secret 后,就可以在代码里加入它们啦~

4.最后最后,照抄极光推送文件里的 example 就好。

完整代码如下

极光开发者服务网站上显示的信息,请记得选择 Api 而不是 Web,推送成功后目标和成功都应该是 1。

如果此时你已经推送成功,那么官网的示例代码对你来说应该已经完全不是问题了,照抄就好,一定能用的,好人当到底,送佛送到西,再献上一份根据极光在 GitHub 上的 PHP 文档修改的代码:

上面代码中的 options 一项控制的是客户端是生产环境下推送还是开发环境下推送,True 为生产环境,反之则为开发环境~。

四、别名推送的实现方法


别名推送的功能是推送给某一用户,在我这里的情况是当用户 A 给用户 B 帖子下评论时,发推送给用户 B 通知帖子有新评论。
初步的实现是 IOS 端和服务端都填一样的东西,比如 1,比如小明之类的,这次我们就把别名设置为“JPush”。

PHP:

IOS:

当尝试成功之后就可以尝试放入变量咯~

IOS:

大功告成~

如果 Postman 调试中出现 cannot find user by this audience 的报错,则说明服务端和 IOS 端的别名对不上哦。

五、推送代码的简单解析


1.->setPlatform(['ios'])
括号中可填入数列,除了 ios 还可以加入 android,两个平台一起发推送。

2.->addAlias("$你的变量")
可填入变量,也可填入具体别名。

3.->setNotificationAlert("你收到了一条新消息")
你会在极光网站上看到的推送信息,请注意这条信息不是手机上会显示的文本,手机上显示的文本请看下一条。

4.->iosNotification('你收到了一条新消息', [
这一条代码的字才是真正会在手机上看到的消息。

5.'badge' => '+1',
实现有多条未读时,App 的图标的角标可以 +1,若填’5’的话,无论有多少条推送,角标永远都是 5。

6.

推送代码的附加字段,不会和“你收到了一条新消息”一起显示在推送文本中,这个 extras 是给 IOS 端程序员调试用的,key 和 value 这两个词都可以变,比如在我的项目里,我填入的是'postId' => "$postId",这样 IOS 端就可以获取这个变量。

当然也可以拿来向对面表白:'saysomething' => "我爱你"之类的,希望大家踊跃尝试寻找真爱~

六、坑及注意事项


1.AppKey 和 Master Secret 可以不写在代码中,而是写进 .env 里在代码用调用,那就变成了

2.如果 Postman 调试中出现了 error_log(./jpush/log) 这个错误

官方文档提供的解决方法,把 jpush.log 关掉就好啦~

3.当极光网站上目标和成功都是0的处理方法:这是开发环境和生产环境的坑。由于 IOS 客户端那边是分开发环境及生产环境的,此时请看看 IOS 和服务端环境一不一致,当一边在用生产环境,而另一边在用开发环境的时候,目标和成功都会是0。

七、极光推送与队列


Laravel 队列组件提供一个统一的 API 集成了许多不同的队列服务,队列允许你延后执行一个耗时的任务,例如延后至指定的时间才发送邮件,进而大幅的加快了应用程序处理请求的速度。

由于我实在不懂队列在极光推送的应用上到底是干嘛用的,但是既然导师要我写,那我就写一写好了。由上面的引述可得,队列主要的功能在于延后发送,也就是说,当推送功能触发时,并不会马上推送,而是在队列里排队,执行了队列监听php artisan queue:listen时,队列里的任务才会执行。
实现队列有多种方式,Laravel也支持多种队列实现驱动,比如数据库、Redis、Beanstalkd、IronMQ及Amazon SQS等。此次实现中,我用的是数据库。以下是具体操作步骤:

1.请记得你需要一个数据库,快去数据库软件里创建一个 + 在.env里面设置一下你萌萌的数据库吧 ^0^

2.将.env中的QUEUE_DRIVER=sync改成QUEUE_DRIVER=database
3.下面让我们在数据库中创建两个队列相关的表。请打开命令行,输入php artisan queue:table以及php artisan queue:failed-table再执行migrate,php artisan migrate。这样你的数据库中就多出了两个队列相关的表———— jobs 和 failed_jobs ^0^

4.队列的文件在 Laravel 中一个叫 Jobs 的文件夹中,路径是 app/Jobs。现在让我们来创建一个队列文件吧~命令行执行:php artisan make:job pushCommentQueue
这样我们就得到了一个队列文件,现在我们就可以把推送代码从以前的地方挪走,放到pushCommentQueue.php里面了。当你把文件挪走之后,记得在原来的位置放如下代码来执行队列:

$comment->user_id 是我想在队列文件用的数据,我想用 user_id 作为推送中使用的别名。我们将在队列文件中处理它。

5.接下来来到队列文件pushCommentQueue.php,我们想要传递的参数 user_id,将通过构造函数_construct传递到队列文件中,而推送的代码则写在handle()中,下面是完整代码:

发表评论

电子邮件地址不会被公开。 必填项已用*标注