liujie
2026-09-17 819124be8f16794d409a67f58d5257aef37d9b64
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import { GUIDE_LOGIN_KEY } from '../constants/mock'
import { request } from '../utils/request'
 
let listenersRegistered = false
 
export function initializePush() {
  // #ifdef APP-PLUS
  registerPushListeners()
  return registerPushClient()
  // #endif
  return Promise.resolve(false)
}
 
function registerPushClient(attempt = 0) {
  const loginState = uni.getStorageSync(GUIDE_LOGIN_KEY)
  if (!loginState || !loginState.token) return Promise.resolve(false)
  const clientInfo = plus.push.getClientInfo()
  const cid = clientInfo && clientInfo.clientid
  if (!cid) {
    if (attempt >= 5) return Promise.resolve(false)
    return new Promise((resolve) => {
      setTimeout(() => resolve(registerPushClient(attempt + 1)), 2000)
    })
  }
  return request({
    url: '/guide/push-device',
    method: 'PUT',
    data: {
      cid,
      platform: plus.os && plus.os.name ? plus.os.name : 'UNKNOWN'
    }
  }).then(() => true).catch(() => false)
}
 
function registerPushListeners() {
  if (listenersRegistered) return
  listenersRegistered = true
  plus.push.addEventListener('click', (message) => {
    const payload = parsePayload(message && message.payload)
    if (!payload.targetUrl) return
    uni.navigateTo({ url: payload.targetUrl })
  })
}
 
function parsePayload(payload) {
  if (!payload) return {}
  if (typeof payload === 'object') return payload
  try {
    return JSON.parse(payload)
  } catch (error) {
    return {}
  }
}