sách gpt4 ăn đã đi

node.js - 如何使用 laravel 5.4 中的 LRedis 和 nodejs 中的 socket.io 向同一 channel 中的特定用户发送 apns 通知或消息?

In lại 作者:IT王子 更新时间:2023-10-29 05:59:37 27 4
mua khóa gpt4 giày nike

我在客户端使用 socket.io 在 Laravel 5.4 中创建聊天应用程序,同时向目标用户发送 APNS 通知。

当用户向目标用户发送消息时执行此操作时,消息发送不止一次意味着它取决于与 Node socket.io 服务器连接的连接数,我认为这意味着我的 channel (“消息”)循环该消息连接的客户端数量,因此它在接收端显示不止一次。这是我的发件人端(Laravel):

    $redis = LRedis::connection();
$data = [
'message' => $msg,
'user' => $auth,
'music'=>$music,
'target_user'=>$target_user
];
$redis->publish('message', json_encode($data));

在 socket.js 中:

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var redis = require('redis');
var apn = require('apn');
var request = require('request');
var auth_user_id = null;
var mysql = require('mysql');

var con = mysql.createConnection({
host: "localhost",
user: "root",
password: "",
database: "database"
});

con.connect(function(err) {
if (err) throw err;
console.log("Database Connected!");
});
var options = {
token: {
key: "app-keys/APNsAuthKey_U3QV9H86BR.p8",
keyId: "keyId",
teamId: "teamid",
cert: "app-keys/musicChatAppDevelopment.pem",
},
development: true,
production: false,
};
var apnProvider = new apn.Provider(options);
server.listen(8890);
io.on('connection', (socket) => {
var auth_user_id = socket.handshake.query.auth_user_id;
console.log("client connected");
console.log("Client Socket id--"+socket.id+"-----User Id----"+auth_user_id);
var redisClient = redis.createClient();
redisClient.subscribe('message');
if(auth_user_id>0) {
var sql = "UPDATE users SET socket_id ='"+socket.id+"' WHERE id ="+auth_user_id;
con.query(sql, function (err, result) {
if (err) throw err;
console.log(result.affectedRows + " record(s) updated");
});
}
redisClient.on('message', (channel, data) => {
console.log(channel);
let data_= JSON.parse(data);
let message_ = data_.message;
let deviceToken = data_.target_user['ios_token'];
if(data_.user['id']!=data_.target_user['id']) {
console.log(data_.target_user['ios_token']);
var note = new apn.Notification();
note.expiry = Math.floor(Date.now() / 1000) + 3600; // Expires 1 hour from now.
note.badge = 0;
note.sound = "ping.aiff";
note.alert = {
"title" : data_.user['first_name'],
"body" : message_,
};
note.payload = { "aps" : {
"alert" : {
"title" : data_.user['first_name'],
"body" : message_
}
}
}
note.topic = "com.charpixel.hellodemo";
console.log(note);
let socketId = data_.target_user['socket_id'];
apnProvider.send(note, deviceToken).then( (result) => {
console.log(JSON.stringify(result));
});
console.log("Target User Socket id "+data_.target_user['socket_id']);
socket.broadcast(data_.target_user['socket_id']).emit(channel, data);
io.to(socketId).emit(channel,data);

}

});
socket.on('disconnect', () => {
redisClient.quit();
});
});

在 index.blade.php 中:

var ip = ':8890?auth_user_id='+JSON.parse(user_id)['id'];
console.log("Curent_URL"+ip);
var socket = io.connect(ip);
socket.on('message', function (data) {
});

还在我的 IOS 应用程序上多次收到 apns 通知。

câu trả lời hay nhất

对于一对一聊天,您应该为每个聊天创建单独的 channel 。您的代码在每个客户订阅的 channel “消息”上发送消息。所以这里有多个问题。例如,如果您有 3 个客户:

  1. redisClient.on('message') 将为所有 3 个客户端触发。
  2. 由于数据保持不变(这意味着设备 token 保持不变),无论触发了哪个客户端 on('message),通知都将发送到同一接收者,这就是您收到多个通知的原因。

解决方案是您应该为每次聊天创建一个唯一的 channel 。参见 cái này以 stackoverflow 答案为例。它不使用 redis,但您也可以将其更改为使用 reddis。

关于node.js - 如何使用 laravel 5.4 中的 LRedis 和 nodejs 中的 socket.io 向同一 channel 中的特定用户发送 apns 通知或消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48409095/

27 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress