Cloud Function for Firebase sendToDevice 未在 ios 上显示为通知

Cloud Function for Firebase sendToDevice not showing as notification on ios

通过 Cloud Functions for Firebase 发送成功通知后,该通知不会在 ios 设备上显示为推送通知。我发现了几个类似的问题,但 none 提供了一个明确的解决方案。

云函数:

exports.sendInitialNotification = functions.database.ref('branches/{branchId}/notifications/{notifId}').onWrite(event => {
  const data = event.data.val()
  if (data.finished) return
  const tokens = []
  const notifId = event.params.notifId
  const getPayload = admin.database().ref(`notifications/${notifId}`).once('value').then(snapshot => {
    const notif = snapshot.val()
    const payload = {
      notification: {
        title: notif.title,
        body: notif.message,
      },
      data: {
        'title': notif.title,
        'message': notif.message,
        'id': String(notif.id),
      }
    }
    if (notif.actions) {
      payload.data['actions'] = JSON.stringify(notif.actions)
    }
    console.log('payload:', payload)
    return payload
  }, (error) => {
    console.log('error at sendInitialNotification getPayload():', error)
  })
  const getTokens = admin.database().ref(`notifications/${notifId}/users`).once('value').then(snapshot => {
    const users = snapshot.forEach((data) => {
      let promise = admin.database().ref(`users/${data.key}/profile/deviceToken`).once('value').then(snap => {
        if (tokens.indexOf(snap.val()) !== -1 || !snap.val()) return
        return snap.val()
      }, (error) => {
        console.log('error retrieving tokens:', error)
      })
      tokens.push(promise)
    })

    return Promise.all(tokens)
  }, (error) => {
      console.log('error at sendInitialNotification getTokens()', error)
    }).then((values) => {
      console.log('tokens:', values)
      return values
  })

  return Promise.all([getTokens, getPayload]).then(results => {
    const tokens = results[0]
    const payload = results[1]
    if (payload.actions) {
      payload.actions = JSON.stringify(payload.actions)
    }
    const options = {
      priority: "high",
    }
    admin.messaging().sendToDevice(tokens, payload, options)
      .then(response => {
        data.finished = true
        admin.database().ref(`notifications/${notifId}`).update({success: true, successCount: response.successCount})
        console.log('successfully sent message', response)
      }).catch(error => {
        data.finished = true
        admin.database().ref(`notifications/${notifId}`).update({success: false, error: error})
        console.log('error sending message:', error)
      })
  })
})

...以及 firebase 控制台中的日志:

successfully sent message { results: [ { error: [Object] } ],
canonicalRegistrationTokenCount: 0, failureCount: 1, successCount: 0, multicastId: 7961281827678412000 }

tokens: [ 'eS_Gv0FrMC4:APA91bEBk7P1lz...' ]

payload: { notification: { title: 'test07', body: 'test07' }, data: { title: 'test07', message: 'test07', id: '1502383526361' } }

...但是 iphone 上没有显示任何通知。我确定我在这里遗漏了 OOO(操作顺序)的某些内容,但不确定障碍在哪里。如果有人能指出我的缺点,欢迎公开批评。

一如既往地提前感谢您,感谢您的任何指导!

我看到的问题是由于 xcode 中的反向域 ID 与 firebase 中的不匹配。

Typo