webman/push

webman/push, abonelik modeli tabanlı bir ücretsiz push server eklentisidir. pusher ile uyumludur ve JS, Android (java), IOS (swift), IOS (Obj-C), uniapp, .NET, Unity, Flutter, AngularJS gibi çok sayıda istemciye sahiptir. Arka uç push SDK'sı PHP, Node, Ruby, Asp, Java, Python, Go, Swift gibi dilleri desteklemektedir. İstemciler otomatik kalp atışı ve bağlantı kesilmesi sonrası yeniden bağlantı sağlama özelliklerine sahiptir; kullanımı oldukça basit ve stabildir. Mesaj gönderme, sohbet gibi birçok anlık iletişim senaryosu için uygundur.

Eklenti ile birlikte bir web sayfası js istemcisi olan push.js ve uniapp istemcisi olan uniapp-push.js sağlanmaktadır. Diğer dil istemcileri için https://pusher.com/docs/channels/channels_libraries/libraries/ adresinden indirilebilir.

Kurulum

composer require webman/push

İstemci (javascript)

JavaScript istemcisini ekleme

<script src="/plugin/webman/push/push.js"> </script>

İstemci kullanımı (genel kanal)

// Bağlantı kurma
var connection = new Push({
    url: 'ws://127.0.0.1:3131', // websocket adresi
    app_key: '<app_key, config/plugin/webman/push/app.php dosyasında alınız>',
    auth: '/plugin/webman/push/auth' // Abonelik yetkilendirmesi (sadece özel kanallar için)
});
// Kullanıcı uid'sinin 1 olduğunu varsayalım
var uid = 1;
// Tarayıcı user-1 kanalındaki mesajları dinliyor, yani uid'si 1 olan kullanıcının mesajlarını
var user_channel = connection.subscribe('user-' + uid);

// user-1 kanalında message olayı meydana geldiğinde
user_channel.on('message', function(data) {
    // data burada mesaj içeriğidir
    console.log(data);
});
// user-1 kanalında friendApply olayı meydana geldiğinde
user_channel.on('friendApply', function (data) {
    // data burada arkadaş isteği ile ilgili bilgileri içerir
    console.log(data);
});

// Grup id'sinin 2 olduğunu varsayalım
var group_id = 2;
// Tarayıcı group-2 kanalındaki mesajları dinliyor, yani grup 2'nin grup mesajlarını
var group_channel = connection.subscribe('group-' + group_id);
// Grup 2'de message mesaj olayı meydana geldiğinde
group_channel.on('message', function(data) {
    // data burada mesaj içeriğidir
    console.log(data);
});

İpucu
Yukarıdaki örnekte subscribe, kanal aboneliği gerçekleştirir; message ve friendApply olaylar kanaldaki etkinliklerdir. Kanal ve olay isimleri herhangi bir dize olabilir, sunucu tarafında önceden yapılandırılması gerekmez.

Sunucu Push (PHP)

use Webman\Push\Api;
$api = new Api(
    // webman altında doğrudan config ile ayarları alabilirsiniz, webman dışı bir ortamda gerekirse ayarları manuel girmelisiniz
    'http://127.0.0.1:3232',
    config('plugin.webman.push.app.app_key'),
    config('plugin.webman.push.app.app_secret')
);
// user-1'e abone olan tüm istemcilere message olayı için mesaj gönderme
$api->trigger('user-1', 'message', [
    'from_uid' => 2,
    'content'  => 'Merhaba, bu mesaj içeriği'
]);

Özel Kanal

Yukarıdaki örnekte, herhangi bir kullanıcı Push.js aracılığıyla bilgiye abonelik yapabilir; eğer bilgiler hassas ise bu güvenli değildir.

webman/push, özel kanal aboneliğini destekler; özel kanallar private- ile başlar. Örneğin

var connection = new Push({
    url: 'ws://127.0.0.1:3131', // websocket adresi
    app_key: '<app_key>',
    auth: '/plugin/webman/push/auth' // Abonelik yetkilendirmesi (sadece özel kanallar için)
});

// Kullanıcı uid'sinin 1 olduğunu varsayalım
var uid = 1;
// Tarayıcı private-user-1 özel kanalındaki mesajları dinliyor
var user_channel = connection.subscribe('private-user-' + uid);

İstemci özel kanala abone olduğunda (private- ile başlayan kanal), tarayıcı bir ajax yetkilendirme isteği başlatır (ajax adresi new Push'ta auth parametresi ile yapılandırılan adrestir). Geliştirici burada, mevcut kullanıcının bu kanalı dinleme yetkisine sahip olup olmadığını kontrol edebilir. Böylece abonelik güvenliği sağlanmış olur.

Yetkilendirme ile ilgili detaylar için config/plugin/webman/push/route.php dosyasındaki koda bakabilirsiniz.

İstemciden Push

Yukarıdaki örneklerde istemciler bir kanala abone olur ve sunucu API arayüzünü çağırarak push yapar. webman/push, istemcilerin doğrudan mesaj göndermesine de izin verir.

Dikkat
İstemciler arası gönderim yalnızca özel kanallar (private- ile başlayan kanallar) için desteklenmektedir ve istemciler yalnızca client- ile başlayan olayları tetikleyebilir.

İstemcinin tetiklediği olay gönderim örneği

var user_channel = connection.subscribe('private-user-1');
user_channel.on('client-message', function (data) {
    // 
});
user_channel.trigger('client-message', {form_uid:2, content:"merhaba"});

Dikkat
Yukarıdaki kod, private-user-1 kanalına abone olan tüm istemcilere (mevcut istemci hariç) client-message olayı verilerini göndermektedir (gönderen istemci kendisinin gönderdiği verileri almaz).

webhook'lar

Webhook, bazı kanal olaylarını almak için kullanılır.

Şu anda iki ana olay vardır:

    1. channel_added
      Bir kanal, kullanıcı çevrimiçi olmadığında çevrimiçi olmaya geçtiğinde tetiklenen olay; ya da çevrimiçi olma olayı
    1. channel_removed
      Bir kanalın tüm kullanıcıları çevrimdışı olduğunda tetiklenen olay; ya da çevrimdışı olma olayı

İpucu
Bu olaylar, kullanıcıların çevrimiçi durumlarını yönetmek için oldukça faydalıdır.

Dikkat
Webhook adresi config/plugin/webman/push/app.php içerisinde yapılandırılmalıdır.
Webhook olaylarını işleme kodunu config/plugin/webman/push/route.php içindeki mantıkla inceleyebilirsiniz.
Sayfanın yenilenmesi sonucunda kullanıcının kısa süreli çevrimdışı olma durumu çevrimdışı olarak sayılmamalıdır; webman/push gecikmeli bir kontrol yapacaktır, bu nedenle çevrimiçi / çevrimdışı olayları 1-3 saniyelik bir gecikmeye sahip olabilir.

wss代理(SSL)

https altında ws bağlantısını kullanamazsınız, bu durumda wss bağlantısını kullanmanız gerekmektedir. Bu senaryo için nginx üzerinde wss proxy kullanabilirsiniz, yapılandırma aşağıdaki gibidir:

server {
    # .... Diğer yapılandırmalar burada atlandı ...

    location /app/<app_key>
    {
        proxy_pass http://127.0.0.1:3131;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Dikkat: Yukarıdaki yapılandırmadaki <app_key> değerini config/plugin/webman/push/app.php dosyasından alabilirsiniz.

Nginx'i yeniden başlattıktan sonra, sunucuya bağlanmak için aşağıdaki yöntemleri kullanın

var connection = new Push({
    url: 'wss://example.com',
    app_key: '<app_key, config/plugin/webman/push/app.php dosyasında alınız>',
    auth: '/plugin/webman/push/auth' // Abonelik yetkilendirmesi (sadece özel kanallar için)
});

Dikkat

  1. İstek adresinin wss ile başlaması gerekmektedir.
  2. Port numarası yazılmamalıdır.
  3. Mutlaka ssl sertifikasına karşılık gelen alan adı ile bağlanılmalıdır.

push-vue.js Kullanım Talimatları

  1. push-vue.js dosyasını proje dizinine, örneğin: src/utils/push-vue.js olarak kopyalayın.

  2. Vue sayfasında ekleyin.



## Diğer İstemci Adresleri
`webman/push` pusher ile uyumludur; diğer diller (Java, Swift, .NET, Objective-C, Unity, Flutter, Android, IOS, AngularJS vb.) için istemci adreslerini indirme adresi:
https://pusher.com/docs/channels/channels_libraries/libraries/