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
vefriendApply
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ızcaclient-
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:
-
- channel_added
Bir kanal, kullanıcı çevrimiçi olmadığında çevrimiçi olmaya geçtiğinde tetiklenen olay; ya da çevrimiçi olma olayı
- channel_added
-
- channel_removed
Bir kanalın tüm kullanıcıları çevrimdışı olduğunda tetiklenen olay; ya da çevrimdışı olma olayı
- channel_removed
İpucu
Bu olaylar, kullanıcıların çevrimiçi durumlarını yönetmek için oldukça faydalıdır.Dikkat
Webhook adresiconfig/plugin/webman/push/app.php
içerisinde yapılandırılmalıdır.
Webhook olaylarını işleme kodunuconfig/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
- İstek adresinin wss ile başlaması gerekmektedir.
- Port numarası yazılmamalıdır.
- Mutlaka ssl sertifikasına karşılık gelen alan adı ile bağlanılmalıdır.
push-vue.js Kullanım Talimatları
-
push-vue.js dosyasını proje dizinine, örneğin: src/utils/push-vue.js olarak kopyalayın.
-
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/