Back-End

21 set, 2015

Gerando notificações push com Pushbullet e Silex

Publicidade

Algumas vezes eu preciso enviar notificações push para apps mobile (Android ou iOS). Não é uma coisa difícil. Talvez seja um pequeno pesadelo nas primeiras vezes, mas quando você compreende o processo, é algo simples e direto. Nos últimos dias, eu descobri um serviço bacana chamado PushBullet. Ele permite que você instale um cliente em seu Android/IOS ou até mesmo no desktop, e envie notificações push entre eles.

O PushBullet também tem uma boa API, que permite a automatização das notificações push. Eu brinquei um pouquinho com a API e meu RaspberryPi – home server. É realmente simples para integrar a API com o seu backend Silex e enviar notificações push para os dispositivos registrados.

Eu criei um pequeno provedor de serviço que engloba a API. A ideia é usar uma aplicação Silex como esta:

use Silex\Application;
use PushSilex\Silex\Provider\PushbulletServiceProvider;
 
$app = new Application(['debug' => true]);
 
$myToken = include(__DIR__ . '/../conf/token.php');
 
$app->register(new PushbulletServiceProvider($myToken));
 
$app->get("/", function () {
    return "Usage: GET /note/{title}/{body}";
});
 
$app->get("/note/{title}/{body}", function (Application $app, $title, $body) {
    return $app->json($app['pushbullet.note']($title, $body));
});
 
$app->run();

Como você pode ver, estamos usando um provedor de serviços chamado PushbulletServiceProvider. Esse serviço oferece ‘pushbullet.note’ e permite enviar notificações push. Apenas precisamos configurar nosso Provedor de Serviço com o token do PushBullet.

<?php
namespace PushSilex\Silex\Provider;
use Silex\ServiceProviderInterface;
use Silex\Application;
class PushbulletServiceProvider implements ServiceProviderInterface
{
    private $accessToken;
    const URI = 'https://api.pushbullet.com/v2/pushes';
    const NOTE = 'note';
    public function __construct($accessToken)
    {
        $this->accessToken = $accessToken;
    }
    public function register(Application $app)
    {
        $app['pushbullet.note'] = $app->protect(function ($title, $body) {
            return $this->push(self::NOTE, $title, $body);
        });
    }
    private function push($type, $title, $body)
    {
        $data = [
            'type'  => $type,
            'title' => $title,
            'body'  => $body,
        ];
        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL            => self::URI,
            CURLOPT_HTTPHEADER     => ['Content-Type' => 'application/json'],
            CURLOPT_CUSTOMREQUEST  => 'POST',
            CURLOPT_POSTFIELDS     => $data,
            CURLOPT_HTTPAUTH       => CURLAUTH_BASIC,
            CURLOPT_USERPWD        => $this->accessToken . ':',
            CURLOPT_RETURNTRANSFER => true
        ]);
        $out = curl_exec($ch);
        curl_close($ch);
 
        return json_decode($out);
    }
    public function boot(Application $app)
    {
    }
}

Geralmente eu uso Guzzle para lidar com clientes HTTP, mas nesse exemplo criei uma conexão direta.

Você pode ver o projeto no meu GitHub.

***

Gonzalo Ayuso faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: http://gonzalo123.com/2015/08/24/generating-push-notifications-with-pushbullet-and-silex/