webman/push

webman/push هو مكون إضافي مجاني لخدمة الدفع (push) من جانب الخادم، يعتمد العميل على نمط الاشتراك، متوافق مع pusher، ويحتوي على العديد من العملاء مثل JS، أندرويد (java)، آي أو إس (swift)، آي أو إس (Obj-C)، uniapp، .NET، Unity، Flutter، AngularJS وغيرها. يدعم SDK الدفع من جانب الخادم PHP، Node، Ruby، Asp، Java، Python، Go، Swift وغيرها. يتضمن العميل نبضات قلب وإعادة اتصال تلقائية عند انقطاع الاتصال، مما يجعل استخدامه بسيطًا ومستقرًا للغاية. مناسب للاستخدام في دفع الرسائل، الدردشة وغيرها من سيناريوهات الاتصالات الفورية.

يأتي المكون الإضافي مزودًا بعميل js للويب push.js وعميل uniapp uniapp-push.js، ويمكن تنزيل عملاء لغات أخرى من https://pusher.com/docs/channels/channels_libraries/libraries/

التثبيت

composer require webman/push

العميل (جافاسكريبت)

استيراد عميل الجافاسكريبت

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

استخدام العميل (القناة العامة)

// إنشاء اتصال
var connection = new Push({
    url: 'ws://127.0.0.1:3131', // عنوان websocket
    app_key: '<app_key، يمكن الحصول عليه في config/plugin/webman/push/app.php>',
    auth: '/plugin/webman/push/auth' // مصادقة الاشتراك (مسموح بها فقط للقنوات الخاصة)
});
// نفترض أن uid المستخدم هو 1
var uid = 1;
// المتصفح يستمع لرسائل القناة user-1، أي رسائل المستخدم uid 1
var user_channel = connection.subscribe('user-' + uid);

// عند وجود حدث message في قناة user-1
user_channel.on('message', function(data) {
    // data تحتوي على محتوى الرسالة
    console.log(data);
});
// عند وجود حدث friendApply في قناة user-1
user_channel.on('friendApply', function (data) {
    // data تحتوي على معلومات طلب الصداقة
    console.log(data);
});

// نفترض أن group_id هو 2
var group_id = 2;
// المتصفح يستمع لرسائل القناة group-2، أي يستمع لرسائل المجموعة 2
var group_channel = connection.subscribe('group-' + group_id);
// عند وجود حدث message في المجموعة 2
group_channel.on('message', function(data) {
    // data تحتوي على محتوى الرسالة
    console.log(data);
});

نصائح
في المثال أعلاه، subscribe يعمل على الاشتراك في القناة، message و friendApply هي أحداث على القناة. القنوات والأحداث هي سلاسل شخصية، ولا تحتاج إلى تكوين مسبق من جانب الخادم.

دفع من جانب الخادم (PHP)

use Webman\Push\Api;
$api = new Api(
    // يمكن استخدام config مباشرة عند استخدام webman، في بيئات غير webman يجب كتابة التكوينات اللازمة يدويًا
    'http://127.0.0.1:3232',
    config('plugin.webman.push.app.app_key'),
    config('plugin.webman.push.app.app_secret')
);
// دفع رسالة حدث message لجميع عملاء الاشتراك في user-1
$api->trigger('user-1', 'message', [
    'from_uid' => 2,
    'content'  => 'مرحبا، هذه هي محتوى الرسالة'
]);

القنوات الخاصة

في المثال أعلاه، يمكن لأي مستخدم الاشتراك في المعلومات عبر Push.js، إذا كانت المعلومات حساسة، فإن هذا غير آمن.

يدعم webman/push الاشتراك في القنوات الخاصة، وتبدأ القنوات الخاصة بـ private-. على سبيل المثال:

var connection = new Push({
    url: 'ws://127.0.0.1:3131', // عنوان websocket
    app_key: '<app_key>',
    auth: '/plugin/webman/push/auth' // مصادقة الاشتراك (مسموح بها فقط للقنوات الخاصة)
});

// نفترض أن uid المستخدم هو 1
var uid = 1;
// المتصفح يستمع لرسائل القناة الخاصة private-user-1
var user_channel = connection.subscribe('private-user-' + uid);

عند تسجيل العميل في قناة خاصة (قناة تبدأ بـ private-)، سيقوم المتصفح بإرسال طلب مصادقة ajax (عنوان ajax هو العنوان الذي تم تكوينه في معلمة auth عند إنشاء new Push)، يمكن للمطور هنا تحديد ما إذا كان المستخدم الحالي لديه إذن للاستماع إلى هذه القناة. هذا يضمن أمان الاشتراك.

للمزيد حول المصادقة، انظر إلى الكود في config/plugin/webman/push/route.php

دفع من جهة العميل

المثال أعلاه يظهر أن العملاء يشتركون في قناة معينة، ويدعو الخادم واجهة API للدفع. يدعم webman/push أيضًا إرسال رسائل مباشرة من العميل.

تنبيه
دفع الرسائل بين العملاء يقصر على القنوات الخاصة (قنوات تبدأ بـ private-)، ويمكن للعميل فقط تفعيل أحداث تبدأ بـ client-.

مثال لرسالة تفعيل الحدث من العميل

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

تنبيه
الكود أعلاه يرسل بيانات حدث client-message إلى جميع العملاء الذين اشتركوا في private-user-1 (العميل الذي قام بإرسال الرسالة لن يتلقى بيانات الإرسال الخاصة به).

webhook

يستخدم webhook لاستقبال بعض الأحداث المتعلقة بالقنوات.

يوجد حاليًا حدثان رئيسيان:

  • 1، channel_added
    يحدث عندما ينتقل أحد القنوات من عدم وجود عملاء متصلين إلى وجود عملاء متصلين، أو ما يمكن تسميته حدث الاتصال

  • 2، channel_removed
    يحدث عندما ينقطع جميع العملاء عن أحد القنوات، أو ما يمكن تسميته حدث الانقطاع

نصائح
هذه الأحداث مفيدة جداً في الحفاظ على حالة اتصال المستخدم.

تنبيه
عنوان webhook يتم تكوينه في config/plugin/webman/push/app.php.
يمكنك الرجوع إلى الكود الخاص بالتعامل مع أحداث webhook في config/plugin/webman/push/route.php
نظرًا لتجديد الصفحة الذي يؤدي إلى قطع اتصال المستخدم لفترة قصيرة، فإنه لا ينبغي أن يُعتبر قطع اتصال، سيقوم webman/push بإجراء تقييم مؤخر، لذا ستتأخر أحداث الاتصال/الانقطاع من 1-3 ثواني.

wss وكيل (SSL)

لا يمكن استخدام اتصال ws تحت https، ويتعين استخدام اتصال wss. في هذه الحالة، يمكنك استخدام proxy nginx لـ wss، التكوين يبدو كما يلي:

server {
    # .... تم حذف إعدادات أخرى هنا ...

    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;
    }
}

تنبيه إن مفتاح <app_key> في التكوين أعلاه يمكن الحصول عليه في config/plugin/webman/push/app.php

بعد إعادة تشغيل nginx، يمكنك الاتصال بالخادم بالطريقة التالية

var connection = new Push({
    url: 'wss://example.com',
    app_key: '<app_key، يمكن الحصول عليه في config/plugin/webman/push/app.php>',
    auth: '/plugin/webman/push/auth' // مصادقة الاشتراك (مسموح بها فقط للقنوات الخاصة)
});

تنبيه

  1. يجب أن يبدأ عنوان الطلب بـ wss
  2. لا تكتب المنفذ
  3. يجب أن تكون قد استخدمت اسم المجال المقابل للشهادة ssl للاتصال

إرشادات استخدام push-vue.js

  1. انسخ ملف push-vue.js إلى دليل المشروع، مثل: src/utils/push-vue.js

  2. في صفحة vue، استيراد



## عناوين العملاء الأخرى
يتوافق `webman/push` مع pusher، ويمكنك تنزيل عناوين العملاء للغات أخرى (Java Swift .NET Objective-C Unity Flutter Android IOS AngularJS وغيرها) من هنا:
https://pusher.com/docs/channels/channels_libraries/libraries/