zoukankan      html  css  js  c++  java
  • ios 微信小程序分析

    小程序启动下载逻辑相关:

    https://game.weixin.qq.com/cgi-bin/h5/static/commlib/index.html

     这个是实时的。 但是貌似本地也会存储,存储路径: /var/mobile/Containers/Data/Application/B1E7B553-B1EC-4679-A4C1-ED81541F0D44/Library/WechatPrivate/WePkg/Data/commlib/9192/pkg.dat

    这个dat格式和wxapkg格式有一点差别, 暂时还没有找到怎么解压它的方法。

    下载小程序相关逻辑:

    function (e, t, n) {
        var i = n(4),
          o = n(0);
        (i.downloadAppInternal =
          i.downloadAppInternal ||
          function (e, t) {
            e = e || {};
            var n = o.clientVersion(!0);
            o.versionCompare(n, "6.5.6") >= 0
              ? i.invoke("downloadAppInternal", e, t)
              : (t && t.call(i, {}), (window.location.href = e.appUrl));
          }),
          (e.exports = i);
      }
            downloadApp: {
              ios: function (e) {
                var t = e.appitem,
                  n = e.callback,
                  i = e.config || {};
                T.detail.launchApp({
                  appitem: t,
                  config: i,
                  callback: function (e) {
                    e.err_msg.indexOf(":ok") > -1 || e.err_msg.indexOf(":yes") > -1
                      ? n(e)
                      : (function (e, t) {
                          var n = e.DownloadInfo,
                            r = o.versionCompare(o.clientVersion(1), "6.5.5") > 0;
                          if (
                            !i.downloadInternal ||
                            !r ||
                            v.getQueryStr("isFromWeappEntry")
                          )
                            return (
                              (location.href = n.DownloadURL),
                              void t({ err_msg: "downloadAppInternal:ok" })
                            );
                          a.downloadAppInternal(
                            { appUrl: n.DownloadURL },
                            function (e) {
                              t(e);
                            }
                          );
                        })(t, n);
                  },
                });
              },
              android: function (e) {
                var t = e.appitem,
                  n = e.callback,
                  i = e.config || {},
                  s = t.AppID,
                  l = t.DownloadInfo,
                  u =
                    o.versionCompare(o.clientVersion(1), "6.5.7") >= 0
                      ? "addDownloadTaskStraight"
                      : "addDownloadTask",
                  d = "number" == typeof l.DownloaderType ? l.DownloaderType : 1,
                  p =
                    "boolean" == typeof l.use_downloader_widget &&
                    l.use_downloader_widget,
                  f = "boolean" == typeof l.download_in_wifi && l.download_in_wifi,
                  g = i.isAutoDownload ? 3 : 1,
                  m = l.android_section_md5_list || [];
                function h() {
                  a.invoke(
                    u,
                    {
                      appid: s,
                      task_name: t.Name || t.PackageName,
                      package_name: t.PackageName,
                      task_url: l.DownloadURL,
                      file_md5: l.AndroidApkMd5,
                      task_size: l.AndroidApkSize,
                      alternative_url: l.AlternativeDownloadURL,
                      downloader_type: d,
                      download_type: g,
                      use_downloader_widget: p,
                      download_in_wifi: f,
                      scene: i.sceneid,
                      uiarea: i.uiarea,
                      fileSectionMd5: m,
                      extInfo: encodeURIComponent(
                        JSON.stringify({
                          gameid: s,
                          noticeid:
                            parseInt(t.Noticeid) ||
                            parseInt(v.getQueryStr("noticeid") || 0) ||
                            0,
                        })
                      ),
                    },
                    function (e) {
                      E(t, i, e, "add"),
                        n && n(e),
                        p &&
                          o.versionCompare(o.clientVersion(1), "7.0.3") >= 0 &&
                          r.trigger("addToDownloaderWidget", { appid: s });
                    }
                  );
                }
                i.showDownloadConfirmAlert && o.isAndroid
                  ? c.alert("即将为你下载 ".concat(t.Name), {
                      confirmCb: function () {
                        h();
                      },
                      style: "twoBtn",
                      closeCb: function () {},
                    })
                  : h();
              },
            },
            launchApp: function (e) {
              var t = e.appitem,
                n = e.callback,
                i = e.config || {},
                r = t.AppID,
                s = t.DownloadInfo;
              if (t.has_sp_launch_privilege)
                new l({
                  appid: r,
                  ssid: i.sceneid,
                  success: function (e) {
                    d({ extern_info: e.extern_info });
                  },
                  fail: function () {
                    d();
                  },
                  cancel: function () {},
                });
              else {
                var c = p.getKeyValue("first_launch_game_privilege");
                (!c || (c && -1 === c.indexOf(r || ""))) &&
                o.isAndroid &&
                t &&
                4 !== t.AppType
                  ? ((c = c ? JSON.parse(c) : []).push(r),
                    p.setKeyValue("first_launch_game_privilege", JSON.stringify(c)),
                    new u({
                      appid: r,
                      appitem: t,
                      scene: "",
                      uiarea: "",
                      success: function (e) {
                        console.log("success"), d();
                      },
                      cancel: function () {
                        console.log("cancel");
                      },
                    }))
                  : d();
              }
              function d(e) {
                var c =
                    o.versionCompare(o.clientVersion(1), "6.5.5") >= 0
                      ? "launchApplication"
                      : "launch3rdApp",
                  l =
                    (e = e || {}).extern_info ||
                    t.launch_info ||
                    (o.isAndroid ? i.launchAndroidAppText : i.launchIOSAppText);
                a.invoke(
                  c,
                  {
                    appID: r,
                    messageExt: l,
                    extInfo: l,
                    showLaunchFailToast: !1,
                    installSchemeUrl: s.DownloadURL,
                    installAction: 1,
                  },
                  function (e) {
                    n && n(e);
                  }
                );
              }
            },
            installApp: function (e) {
              var t = e.appitem,
                n = e.callback,
                i = e.config || {},
                o = t.AppID,
                r = i.isAutoDownload ? 3 : 1;
              a.queryDownloadTask({ appid: o }, function (e) {
                e.state.indexOf("_succ") > -1
                  ? a.installDownloadTask(
                      { download_id: e.download_id, download_type: r },
                      function (e) {
                        n(e);
                      }
                    )
                  : n({
                      err_msg:
                        "(installApp -> queryDownloadTask):" + JSON.stringify(e),
                    });
              });
            },
            launchAppOrH5: function (e) {
              var t = e.appitem,
                n = e.callback,
                i = e.config || {},
                o = T.detail;
              o.launchApp({
                appitem: t,
                callback: function (e) {
                  e.err_msg.indexOf(":ok") > -1 ? n(e) : o.launchH5(t, n);
                },
                config: i,
              });
            },


    这些都是比较核心的逻辑。

    appitem是很关键的数据结构, 小程序的下载地址为: appitem.DownloadInfo.DownloadURL


    微信小程序和微信APP的交互,全靠window.WeixinJSBridge 这个是很关键的东西。 
  • 相关阅读:
    10: Django + Uwsgi + Nginx 的生产环境部署
    04:应用管理
    发送消息的时候,会指定用户,其实还可以定义媒介为脚本,让用户执行这个脚本
    解决zabbix使用中文是出现乱码的问题
    inotify 工具 是一种强大的、细粒度的、异步文件系统监控机制
    rsync 远程同步工具
    vsftpd:非常安全的ftp服务端程序
    Varnish是一款高性能的开源HTTP加速器
    keepalived 高可用(IP飘移)
    dns域名解析
  • 原文地址:https://www.cnblogs.com/dzqdzq/p/14770068.html
Copyright © 2011-2022 走看看