webman/push
webman/push
, ücretsiz bir itme (push) sunucu eklentisidir. İstemci abonelik modeline dayalıdır ve pusher ile uyumludur. JS, Android (java), IOS (swift), IOS (Obj-C), uniapp, .NET, Unity, Flutter, AngularJS gibi birçok istemciyi destekler. Arka planda itme SDK'sı PHP, Node, Ruby, Asp, Java, Python, Go, Swift gibi dillere destek verir. İstemci otomatik olarak kalp atışı ve bağlantı kesilmesi durumunda otomatik yeniden bağlanma özelliğine sahiptir ve kullanımı oldukça basit ve istikrarlıdır. Mesaj itme, sohbet ve birçok anlık iletişim senaryosu için uygundur.
Eklenti, bir web sayfası JS istemcisi olan push.js ve uniapp istemcisi olan uniapp-push.js
ile birlikte gelir. Diğer dil istemcilerini https://pusher.com/docs/channels/channels_libraries/libraries/ adresinden indirebilirsiniz.
Eklenti için webman-framework>=1.2.0 gereklidir.
Kurulum
composer require webman/push
İstemci (javascript)
JavaScript istemcisi içeri aktarma
<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ından alınır>',
auth: '/plugin/webman/push/auth' // Abonelik yetkilendirme (yalnızca özel kanallar için)
});
// Kullanıcı uid'si 1 olarak varsayalım
var uid = 1;
// Tarayıcı, user-1 kanalındaki mesajları dinler, yani kullanıcı uid'si 1 olan kullanıcı mesajları
var user_channel = connection.subscribe('user-' + uid);
// user-1 kanalında mesaj etkinliği olduğunda
user_channel.on('message', function(data) {
// data içinde mesaj içeriği bulunmaktadır
console.log(data);
});
// user-1 kanalında friendApply etkinliği olduğunda
user_channel.on('friendApply', function (data) {
// data içinde arkadaşlık başvurusuyla ilgili bilgiler bulunmaktadır
console.log(data);
});
// Grup id'si 2 olarak varsayalım
var group_id = 2;
// Tarayıcı, group-2 kanalındaki mesajları dinler, yani grup 2'nin grup mesajlarını dinler
var group_channel = connection.subscribe('group-' + group_id);
// group-2'nin message etkinliği olduğunda
group_channel.on('message', function(data) {
// data içinde mesaj içeriği bulunmaktadır
console.log(data);
});
İpuçları
Yukarıdaki örnekte subscribe, kanal aboneliği sağlar,message
vefriendApply
kanal üzerindeki etkinliklerdir. Kanallar ve etkinlikler, önceden yapılandırılmasını gerektirmez ve herhangi bir dizedir.
Sunucu İtmesi (PHP)
use Webman\Push\Api;
$api = new Api(
// webman altında yapılandırmayı doğrudan alabilirsiniz, webman ortamı dışında ilgili yapılandırmayı elle eklemeniz gerekir
'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 etkinliği için mesaj gönderme
$api->trigger('user-1', 'message', [
'from_uid' => 2,
'content' => 'Merhaba, bu mesaj içeriğidir'
]);
Özel Kanallar
Yukarıdaki örneklerde herhangi bir kullanıcı Push.js aracılığıyla bilgilere abone olabilir, eğer bilgiler hassas bilgiler ise bu şekilde güvenli değildir.
webman/push
, özel kanal aboneliğini destekler. Özel kanallar, private-
ile başlayan kanallardır. Ö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 yetkilendirme (yalnızca özel kanallar için)
});
// Kullanıcı uid'si 1 olarak varsayalım
var uid = 1;
// Tarayıcı, private-user-1 özel kanalındaki mesajları dinler
var user_channel = connection.subscribe('private-user-' + uid);
İstemcinin özel bir kanala abone olduğunda (private-
ile başlayan kanal) tarayıcı, bir ajax yetkilendirme isteği başlatır (ajax adresi, yeni Push oluşturulurken yapılandırılan auth parametresidir). Geliştirici burada, geçerli kullanıcının bu kanalı dinleme yetkisi olup olmadığını kontrol edebilir. Bu şekilde aboneliğin güvenliği sağlanır.
Yetkilendirme hakkında bilgi için
config/plugin/webman/push/route.php
içindeki kodlara bakabilirsiniz.
İstemci İtmesi
Yukarıdaki örneklerin hepsi istemcinin belirli bir kanala abone olmasını içerir, sunucunun API'ını çağırmasını içerir. webman/push ayrıca istemcinin doğrudan mesaj göndermesini de destekler.
Not
İstemci tarafından yapılan itme yalnızca özel kanalları (private-
ile başlayan kanalları) destekler ve istemci yalnızcaclient-
ile başlayan etkinlikleri tetikleyebilir.
İstemcinin etkinlik itmesi ö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"});
Not
Yukarıdaki kodlar,private-user-1
kanalına abone olan tüm (şu anda etkin olan istemciler hariç) istemcilereclient-message
etkinliği verilerini gönderir (gönderen istemci kendi gönderdiği veriyi almayacaktır).
Webhooks
Webhook, kanalın bazı etkinliklerini almak için kullanılır.
Şu anda başlıca 2 etkinlik tipi vardır:
-
1、channel_added
Hiçbir istemcinin çevrimiçi olmadığından bir istemci çevrimiçi olduğunda veya çevrimdışı/yeniden çevrimiçi etkinliği olarak tetiklenen bir olay -
2、channel_removed
Bir kanalın tüm istemcileri çevrimdışı olduğunda tetiklenen bir olay veya çevrimdışı/yeni çevrimiçi etkinliği
İpuçları
Bu etkinlikler, kullanıcıların çevrimiçi durumunu sürdürmek için oldukça faydalıdır.Not
Webhook adresiconfig/plugin/webman/push/app.php
içinde yapılandırılır.
Webhook etkinliklerini almak ve işlemek için kodlarconfig/plugin/webman/push/route.php
içinde bulunmaktadır.
Sayfanın yenilenmesi nedeniyle kullanıcı kısa süreli olarak çevrimdışı olduğunda, bu aslında bir çevrimdışı durum olarak kabul edilmemelidir, webman/push gecikmeli bir değerlendirme yapacak şekilde yapılandırılmıştır, bu nedenle çevrimiçi/çevrim dışı etkinliklerde 1-3 saniye gecikme olabilir.wss proxy (SSL)
https üzerinden ws bağlantısı kullanılamaz, bunun yerine wss bağlantısı kullanılmalıdır. Bu durumda nginx üzerinden wss proxy kullanılabilir, aşağıdaki gibi yapılandırılabilir:
server {
# .... Diğer yapılandırmalar burada gösterilmemiştir ...
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;
}
}
Not: Yukarıdaki yapılandırmadaki <app_key>
, config/plugin/webman/push/app.php
dosyasından alınır.
Nginx yeniden başlatıldıktan sonra sunucuya aşağıdaki şekilde bağlanabilir:
var connection = new Push({
url: 'wss://ornek.com',
app_key: '<app_key, config/plugin/webman/push/app.php içinden alınır>',
auth: '/plugin/webman/push/auth' // Sadece özel kanallar için abonelik doğrulaması
});
Not
- İstek adresi wss ile başlamalıdır
- Port belirtilmemelidir
- ssl sertifikasına ait olan alan adı kullanılmalıdır
push-vue.js Kullanımı
-
push-vue.js dosyasını projenin kök dizinine kopyalayın, örneğin: src/utils/push-vue.js
-
Vue sayfasında içeri aktarın:
<script lang="ts" setup> import { onMounted } from 'vue' import { Push } from '../utils/push-vue'
onMounted(() => {
console.log('Component mounted')
// Webman-push örneğini oluştur
// Bağlantıyı kur
var connection = new Push({
url: 'ws://127.0.0.1:3131', // websocket adresi
app_key: '<app_key, config/plugin/webman/push/app.php içinden alınır>',
auth: '/plugin/webman/push/auth' // Sadece özel kanallar için abonelik doğrulaması
});
// Varsayılan olarak kullanıcı uid'si 1 olsun
var uid = 1;
// Tarayıcı user-1 kanalındaki mesajları dinler, yani kullanıcı uid'si 1 olan kullanıcıların mesajlarını dinler
var user_channel = connection.subscribe('user-' + uid);
// user-1 kanalında message olayı gerçekleştiğinde
user_channel.on('message', function (data) {
// veri mesaj içeriğini içerir
console.log(data);
});
// user-1 kanalında friendApply olayı gerçekleştiğinde
user_channel.on('friendApply', function (data) {
// veri arkadaşlık başvurusuyla ilgili bilgileri içerir
console.log(data);
});
// Varsayalım ki grup kimliği 2 olsun
var group_id = 2;
// Tarayıcı group-2 kanalındaki mesajları dinler, yani grup 2'nin grup mesajlarını dinler
var group_channel = connection.subscribe('group-' + group_id);
// group-2 kanalında message olayı gerçekleştiğinde
group_channel.on('message', function (data) {
// veri mesaj içeriğini içerir
console.log(data);
});
})
## Diğer istemci adresleri
`webman/push`, pusher ile uyumludur, diğer diller (Java Swift .NET Objective-C Unity Flutter Android IOS AngularJS vb.) istemci adresi indirme bağlantısı: https://pusher.com/docs/channels/channels_libraries/libraries/