Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 通过FCM发送数据消息,_Swift_Firebase_Firebase Cloud Messaging_Apple Push Notifications - Fatal编程技术网

Swift 通过FCM发送数据消息,

Swift 通过FCM发送数据消息,,swift,firebase,firebase-cloud-messaging,apple-push-notifications,Swift,Firebase,Firebase Cloud Messaging,Apple Push Notifications,我正在尝试通过iOS应用程序上的Firebase云消息向用户发送通知,当有人跟踪他们时,我已在服务器上设置并部署了javascript,在以下方面似乎很成功: “我们有一个新的跟随者UID:8dUMfYX9NibJDgOm3qdTcvtVO523,用于用户:fva0gy5klvlvlvipowrqsz1cluf3” 在控制台日志中通过,这些是正确的uid,但它也说明: '没有要发送到的通知令牌' 我的想法是,令牌没有链接到auth帐户,但我不知道如何链接,也不知道应该在什么时候链接。我还应注意,

我正在尝试通过iOS应用程序上的Firebase云消息向用户发送通知,当有人跟踪他们时,我已在服务器上设置并部署了javascript,在以下方面似乎很成功:

“我们有一个新的跟随者UID:8dUMfYX9NibJDgOm3qdTcvtVO523,用于用户:fva0gy5klvlvlvipowrqsz1cluf3”

在控制台日志中通过,这些是正确的uid,但它也说明:

'没有要发送到的通知令牌'

我的想法是,令牌没有链接到auth帐户,但我不知道如何链接,也不知道应该在什么时候链接。我还应注意,我已在app delegate中连接到fcm,并通过以下方式收到令牌:

InstanceID.InstanceID().InstanceID{(结果,错误)在
如果let error=error{
打印(“获取远程实例ID时出错:\(错误)”)
}
否则{
打印(“FCM标记=\(字符串(描述:result?.Token)))
打印(“远程实例ID标记:\(结果!.token)”)
//self.instanceIDTokenMessage.text=“远程InstanceID令牌:\(result.token)”
}
}
这是javascript:

“严格使用”;
const functions=require('firebase-functions');
const admin=require('firebase-admin');
admin.initializeApp();
/**
*当用户获得新跟随者并发送通知时触发。
*
*Followers向“/Followers/{followereduid}/{followerUid}”添加一个标志。
*用户将其设备通知令牌保存到`/Users/{followedUid}/notificationTokens/{notificationToken}`。
*/
exports.sendFollowerNotification=functions.database.ref('/users/{followerUid}/follower/{followerUid}'))
.onWrite(异步(更改、上下文)=>{
const followerUid=context.params.followerUid;
const followedUid=context.params.followedUid;
//如果不遵循,则退出该函数。
如果(!change.after.val()){
返回console.log('User',followerUid,'unfolloweruser',followerUid);
}
log('我们有一个新的followerUid:',followerUid',for user:',followerUid);
//获取设备通知令牌的列表。
const getDeviceTokenPromise=admin.database()
.ref(`/users/${followedUid}/notificationTokens`)。once('value');
//获取跟随者配置文件。
const getFollowerProfilePromise=admin.auth().getUser(followerUid);
//将快照复制到用户的令牌。
让我们一起射击;
//包含所有用户令牌的数组。
让代币;
const results=wait Promise.all([GetDeviceTokenPromise,getFollowerProfilePromise]);
tokensSnapshot=结果[0];
const follower=结果[1];
//检查是否有任何设备令牌。
如果(!tokensSnapshot.hasChildren()){
return console.log('没有要发送的通知令牌');
}
log('There',tokensSnapshot.numChildren(),'tokens to send notification to');
console.log('Fetched follower profile',follower);
//通知详情。
常数有效载荷={
通知:{
标题:“你有了一个新的追随者!”,
正文:`${followerUid.name}正在跟踪您`
}
};
//将所有令牌列为一个数组。
tokens=Object.keys(tokensSnapshot.val());
//向所有令牌发送通知。
const response=wait admin.messaging().sendToDevice(令牌、有效负载);
//对于每条消息,检查是否有错误。
常量tokensToRemove=[];
response.results.forEach((结果,索引)=>{
常量错误=result.error;
如果(错误){
console.error('Failure sending notification to',tokens[index],error);
//清理不再注册的令牌。
if(error.code==='消息传递/无效注册令牌'||
error.code===“未注册消息传递/注册令牌”){
tokensToRemove.push(tokensSnapshot.ref.child(tokens[index]).remove());
}
}
});
归还承诺。全部(tokensToRemove);
});

我找到了答案,javascript的一部分说:

const getDeviceTokenPromise=admin.database().ref(`/users/${followedUid}/notificationTokens`)。once('value');
需要以以下格式连接到数据库:

users:{
   $user_id:{
      notificationTokens:{
            $token: true
         }
   }
}
为了访问令牌,因为一个用户可以有多个登录实例,我以前将key'notificationTokens'的值设置为令牌-这就是它不起作用的原因