hejianhao
2026-08-28 cc31d303d12f9c7cd2c4574351b67db04069ae0d
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
const OPENINSTALL_APP_KEY = 'ag8spw'
const OPENINSTALL_WEB_SDK_URL = 'https://res.opstatistics.com/openinstall-ag8spw.js'
 
let openinstallSdkPromise = null
 
/**
 * H5 环境下按需加载 openinstall Web SDK。
 */
const loadOpeninstallWebSdk = () => {
    if (typeof window === 'undefined') {
        return Promise.resolve(null)
    }
    if (window.OpenInstall) {
        return Promise.resolve(window.OpenInstall)
    }
    if (openinstallSdkPromise) {
        return openinstallSdkPromise
    }
    openinstallSdkPromise = new Promise((resolve, reject) => {
        const script = document.createElement('script')
        script.src = OPENINSTALL_WEB_SDK_URL
        script.async = true
        script.onload = () => {
            if (window.OpenInstall) {
                resolve(window.OpenInstall)
                return
            }
            reject(new Error('openinstall sdk unavailable'))
        }
        script.onerror = () => reject(new Error('openinstall sdk load failed'))
        document.head.appendChild(script)
    })
    return openinstallSdkPromise
}
 
/**
 * 构造 openinstall 透传参数,保留当前页面关键信息。
 */
const buildOpeninstallData = (extraData = {}) => {
    if (typeof window === 'undefined') {
        return {
            ...extraData
        }
    }
    const parsedParams = window.OpenInstall && typeof window.OpenInstall.parseUrlParams === 'function'
        ? window.OpenInstall.parseUrlParams()
        : {}
    return {
        ...(parsedParams || {}),
        ...extraData
    }
}
 
/**
 * H5 分享页通过 openinstall 执行唤醒或安装。
 */
export const wakeupOrInstallByOpeninstall = async (extraData = {}) => {
    if (typeof window === 'undefined') {
        return false
    }
    try {
        const OpenInstall = await loadOpeninstallWebSdk()
        if (!OpenInstall) {
            return false
        }
        const wakeupData = buildOpeninstallData(extraData)
        await new Promise((resolve, reject) => {
            let readyHandled = false
            try {
                new OpenInstall({
                    appKey: OPENINSTALL_APP_KEY,
                    fastInstall: false,
                    onready: function () {
                        if (readyHandled) {
                            return
                        }
                        readyHandled = true
                        try {
                            this.wakeupOrInstall()
                            resolve(true)
                        } catch (error) {
                            reject(error)
                        }
                    }
                }, wakeupData)
            } catch (error) {
                reject(error)
            }
        })
        return true
    } catch (error) {
        console.log('H5 openinstall 拉起失败', error)
        return false
    }
}