在 UniApp 開發企業微信小程序時,若需在頁面銷毀或小程序關閉前調用 API 接口,需結合頁面生命周期和應用生命周期實現。以下是具體實現方案及注意事項:
一、在頁面銷毀前調用 API(頁面級)
通過頁面生命周期鉤子 onUnload
觸發銷毀前的操作,這是頁面卸載的最后時機:
export default {onUnload() {// 調用銷毀前的 APIthis.cleanupBeforeDestroy();},methods: {async cleanupBeforeDestroy() {try {await uni.request({url: '***你的API地址',method: 'POST',data: { action: 'log_close_event' }});console.log('銷毀前接口調用成功');} catch (error) {console.error('接口調用失敗:', error);}}}
}
二、在小程序關閉前調用 API(應用級)
通過應用生命周期鉤子 onHide
監聽小程序進入后臺(包括關閉、切換應用等操作),此時可執行清理邏輯:
// App.vue
export default {onHide() {// 統一處理全局關閉事件this.globalCleanup();},methods: {async globalCleanup() {if (this.isEnterpriseWechat) { // 判斷企業微信環境await uni.request({url: '***你的全局API地址',method: 'POST',data: { event: 'app_close' }});}}}
}
三、增強可靠性的技巧
-
同步請求優先
使用uni.request
的async/await
確保請求發送,但需注意:小程序關閉時可能強制終止未完成的異步任務,建議接口設計為快速響應的輕量級請求。 -
雙保險策略
同時監聽onUnload
(頁面級)和onHide
(應用級),覆蓋以下場景:- 頁面跳轉銷毀 → 觸發
onUnload
- 小程序完全關閉 → 觸發
onHide
(應用級)
- 頁面跳轉銷毀 → 觸發
-
環境判斷
企業微信環境下可能需要特殊處理:// 判斷是否在企業微信中運行 const isEnterpriseWechat = uni.getSystemInfoSync().environment === 'wxwork';
四、注意事項
-
生命周期執行順序
小程序關閉時,先觸發頁面級onUnload
,再觸發應用級onHide
。若需避免重復調用 API,可通過狀態標識控制。 -
請求超時設置
添加超時邏輯防止阻塞銷毀過程:uni.request({timeout: 3000, // 3秒超時// ... });
-
敏感操作限制
企業微信可能限制關閉前的網絡請求,需在真機測試驗證接口可行性。
完整代碼示例
// 頁面邏輯
export default {data() {return {isApiCalled: false // 防止重復調用}},onUnload() {if (!this.isApiCalled) {this.callDestoryApi('page_unload');this.isApiCalled = true;}},methods: {async callDestoryApi(eventType) {try {await uni.request({url: 'https://api.example.com/log',method: 'POST',data: { event_type: eventType },timeout: 2000});} catch (e) {console.error('埋點失敗:', e);}}}
}// App.vue 應用級邏輯
export default {onHide() {if (uni.getSystemInfoSync().environment === 'wxwork') {this.callDestoryApi('app_hide');}}
}
通過上述方案,可覆蓋頁面銷毀和小程序關閉兩種場景。建議在真機環境下測試不同操作(如直接關閉小程序、返回桌面、頁面跳轉等)對生命周期的觸發影響。