前言

ZwiftOffline是一个开源社区自制的 Zwift 的 server 端,可以在没有网络的情况下进行 Zwift 课程或路线训练,多平台支持。

本教程将详细介绍如何在 Windows 系统上安装和配置 Zwift 单机版,包括基础安装、账号配置、Strava 同步、训练课程上传以及移动端 Companion 配置等完整流程。

一、准备工作

1.1 下载必要文件

  1. ZwiftOffline 主程序

  2. 配置辅助工具

  3. Zwift 官方客户端

    • 前往Zwift 官网,拉到页面底部,下载并安装 Zwift 软件
    • 重要:记住安装路径,后续配置需要用到(例如:C:\Program Files (x86)\Zwift

1.2 创建运行目录

创建一个目录用于存放 ZwiftOffline 相关文件,例如新建zwiftoffline目录。

二、基础安装与配置

2.1 初始化 ZwiftOffline

  1. 将下载的zoffline.exe文件保存到zwiftoffline目录
  2. 运行zoffline.exe,程序会在同目录下自动创建storage目录(用于保存 Zwift 进度)
  3. 看到storage目录生成后,按Ctrl+C关闭 zoffline,稍后进行配置

Responsive Image

2.2 安装并更新 Zwift 客户端

  1. 运行刚安装的 Zwift 程序,客户端会开始更新游戏本体
    • ⚠️ 重要提示:必须在配置网络之前完成此步骤,因为后续配置会修改 hosts 文件,导致无法连接到 Zwift 服务器下载游戏本体

Responsive Image

2.3 配置网络连接

  1. 将下载的zoffline-helper.zip解压到zwiftoffline目录
  2. 进入zwiftoffline/zoffline-helper目录
  3. 右键点击configure_client.bat,选择以管理员身份运行
  4. 脚本会自动配置 zoffline,期间会弹窗让你选择 Zwift 安装目录(即之前记住的路径)

Responsive Image

  1. 配置完成后,会显示如下结果:

Responsive Image

2.4 启动并验证

  1. 进入zwiftoffline目录,双击运行zoffline.exe(文件名可能因版本而异,如zoffline_1.0.140279.exe

Responsive Image

  1. 启动原版 Zwift 程序,检查登录界面
    • 成功标志:显示 ZwiftOffline 的登录页面(如下图)

Responsive Image

  • 失败标志:如果显示官方原版登录界面,说明配置失败

Responsive Image

  1. ⚠️ 重要提示
    • 如果显示的是原版登录页面,检查是否开启了代理,关闭代理后重试
    • 将输入法切换为微软英文输入法,点击Start Zwift开始游戏
    • 使用搜狗输入法等第三方输入法可能会卡在登录页面

三、高级配置

3.1 同步原有账号信息

如果不配置此项,使用 Zwift offline 时会显示为新账号,而不是你原来的账号信息。

配置步骤:

  1. 在登录页面点击设置按钮进入设置界面

Responsive Image

  1. 填写你的 Zwift 邮箱和密码,勾选所有选项,点击 Submit 提交

Responsive Image

  1. 配置完成后,再次登录 Zwift 时就会显示为原来的账号了

3.2 配置 Strava 自动上传

3.2.1 申请 Strava API

  1. 登录Strava API 设置页面
  2. 创建新应用,填写以下信息:
    • 应用名称:自定义(如:ZwiftOffline)
    • 类别:其他
    • 授权回调域launcher.zwift.com
    • 网站:可留空或填写个人网站

Responsive Image

  1. 申请完成后,记录下Client IDClient Secret

Responsive Image

3.2.2 在 ZwiftOffline 中配置 Strava

  1. 在登录页面进入设置,填写Client IDClient Secret

Responsive Image

Responsive Image

点击Submit提交:

Responsive Image

3.2.3 授权 Strava 访问

这一步可以省略,如果通过上面的步骤没法上传,再尝试这个步骤手动配置

  1. 右键以管理员身份运行zoffline-helper/disable_zoffline.bat,清除 hosts 配置

  2. 在命令行中运行以下命令(替换CLIENT_IDCLIENT_SECRET为你的实际值):

    zoffline-helper/strava_auth.exe --client-id CLIENT_ID --client-secret CLIENT_SECRET
    
  3. 浏览器会自动打开或手动访问localhost:8000进行授权

Responsive Image

Responsive Image

  1. 授权完成后,将生成的strava_token.txt文件移动到storage/1目录下
  2. 右键以管理员身份运行zoffline-helper/configure_client.bat,重新配置 hosts

3.3 上传自定义训练课程

如果你习惯在 Intervals ICU 等平台创建训练课程,可以手动上传到 Zwift 单机版。

上传步骤:

  1. 将你的.zwo训练课程文件保存到以下目录:

    Documents/Zwift/Workouts/1
    

Responsive Image

  1. ⚠️ 注意:不是zwiftoffline\storage\1\customworkouts目录,如果放错位置会导致课程无法上传

Responsive Image

3.4 配置 Garmin Connect

Garmin Connect 可以同步你的 Zwift 活动数据到 Garmin 设备。

3.4.1 配置账号

  1. PC 端配置

    • 在 ZwiftOffline 登录窗口点击"Settings - Garmin"按钮
    • 输入你的 Garmin Connect 账号和密码
  2. 安卓端配置

    • 访问 https://<zoffline_ip>/garmin/zoffline/
    • 输入你的 Garmin Connect 账号和密码
    • <zoffline_ip>替换为运行 zoffline 的电脑 IP 地址

3.4.2 多因素认证(MFA)

如果你的账号启用了多因素认证,需要额外配置:

  1. 使用 Python 脚本(推荐)

    • 运行garmin_auth.py脚本
    • 脚本会在运行目录下生成garth文件夹
    • garth文件夹移动到storage/1目录下
  2. 使用 Windows 可执行文件

    • 如果未安装 Python,可以从zoffline-helper Release 页面下载garmin_auth.exe
    • 运行garmin_auth.exe,同样会生成garth文件夹
    • garth文件夹移动到storage/1目录下

3.5 配置 Intervals.icu

Intervals.icu 是一个强大的训练分析平台,可以同步 Zwift 活动数据。

3.5.1 获取 API 凭证

  1. 登录 Intervals.icu 设置页面
  2. 进入"Developer Settings"(开发者设置)部分
  3. 复制以下信息:
    • Athlete ID(运动员 ID)
    • API Key(API 密钥)

3.5.2 配置账号

  1. PC 端配置

    • 在 ZwiftOffline 登录窗口点击"Settings - Intervals"按钮
    • 输入之前复制的 Athlete ID 和 API Key
  2. 安卓端配置

    • 访问 https://<zoffline_ip>/intervals/zoffline/
    • 输入 Athlete ID 和 API Key
    • <zoffline_ip>替换为运行 zoffline 的电脑 IP 地址

3.6 启用多人游戏

多人游戏功能允许多个用户同时连接到同一个 zoffline 服务器进行骑行。

3.6.1 基本配置

  1. storage目录下创建multiplayer.txt文件(文件内容为空)

3.6.2 远程服务器配置

如果 zoffline 运行在与 Zwift 客户端不同的 PC 上:

  1. storage目录下创建server-ip.txt文件
  2. 文件内容填写运行 zoffline 的 PC 的 IP 地址
  3. 端口要求:确保以下端口在运行 zoffline 的 PC 上开放:
    • TCP 端口:80, 443, 3025
    • UDP 端口:3024

3.6.3 创建账号

  1. 启动 Zwift,创建新账号
  2. ⚠️ 注意:此账号仅存在于你的 zoffline 服务器上,与官方 Zwift 账号无关

3.6.4 启用密码重置功能(可选)

  1. storage目录下创建gmail_credentials.txt文件
  2. 文件内容格式:
<gmail 账号>
<应用密码>
<恢复 URL 主机(可选)>
  1. 获取应用密码
  2. 恢复 URL 主机(可选):
    • 第三行可以填写恢复 URL 的主机地址
    • 如果不填写,将使用服务器 IP 地址作为默认值

3.7 启用 Ghosts(幽灵)

Ghosts 功能可以保存你之前的骑行记录,并在相同路线上显示为"幽灵"与你一起骑行。

3.7.1 启用功能

  1. PC 端

    • 在 zoffline 启动器窗口中勾选"Enable ghosts"
  2. 安卓端

    • 访问 https://<zoffline_ip>/user/zoffline/
    • 勾选"Enable ghosts"
    • 点击"Start Zwift"保存设置

3.7.2 使用说明

  1. 保存幽灵:当你保存活动时,幽灵会自动保存在storage/<player_id>/ghosts/<world>/<route>目录下
  2. 加载幽灵:下次骑行相同路线时,幽灵会自动加载
  3. 重新编组:在聊天中输入.regroup命令可以重新编组幽灵

3.7.3 自定义装备

  1. storage目录下创建ghost_profile.txt文件
  2. 可以使用find_equip.py脚本来自动填充此文件

3.8 启用 Bots(机器人)

Bots 功能可以将保存的幽灵转换为持续骑行的机器人,无论你选择什么路线,它们都会继续骑行。

3.8.1 启用功能

  1. storage目录下创建enable_bots.txt文件
  2. 可选:文件内容可以包含一个倍数(如:2表示双倍机器人数量)
    • ⚠️ 警告:如果机器人数量过多,可能导致性能问题或功能失效

3.8.2 控制命令

在聊天中使用以下命令控制机器人:

  • .group:编组机器人
  • .groupall:编组所有机器人(包括使用倍数时的重复机器人)
  • .autogroup:自动编组(当你改变路线时)
  • .autogroupall:自动编组所有机器人
  • .stopautogroup:停止自动编组
  • .disperse:随机化机器人位置

3.8.3 自定义机器人

  1. storage目录下创建bot.txt文件
  2. 可以自定义机器人的名称、国籍和装备
  3. 可以使用get_pro_names.py脚本来自动填充此文件
  4. 随机机器人:如果需要随机机器人,可以参考zoffline-bots 仓库

3.9 配置 RoboPacers(机器人配速员)

RoboPacers 是使用功率模拟器保存的幽灵,可以创建完美的循环配速员。

3.9.1 获取 RoboPacers

  1. 可以从zoffline-bots 仓库下载预制的 RoboPacers

3.9.2 创建要求

要创建可用的 RoboPacer,需要满足以下条件:

  1. 更新频率:必须使用 1 秒的更新频率录制(默认是 3 秒)
  2. 循环要求:活动必须从同一位置和速度开始和结束,否则机器人无法平滑循环
  3. 配置文件要求
    • 必须包含唯一的玩家 ID
    • 必须包含路线 ID
    • 这样当你加入机器人时,会在交叉路口走相同的转弯

3.9.3 编辑工具

  1. bot_editor.py 脚本:可以用于修改以下文件:
    • profile.bin:设置名称、玩家 ID 和路线 ID
    • route.bin:裁剪多余的点以创建完美循环

3.9.4 创建动态 RoboPacer

要创建动态 RoboPacer(在上坡时增加功率,下坡时减少功率):

  1. 使用 standalone_power.py 脚本
  2. 硬件要求

3.10 使用 Bookmarks(书签)

书签功能可以保存你的位置,方便快速跳转到特定地点。

3.10.1 自动保存书签

当你完成活动时,你的最后位置会自动保存为书签。

3.10.2 手动保存书签

在聊天中使用以下命令保存书签:

.bookmark <名称>

例如:.bookmark 起点

3.10.3 使用书签

  1. 从书签开始新活动

    • 在主页屏幕选择"Join a Zwifter"
    • 选择你想要的书签
  2. 传送到书签

    • 使用操作栏上的传送图标
    • 选择目标书签进行传送

3.11 启用历史排行榜

历史排行榜功能可以覆盖 60 分钟的实时结果和 90 天的个人记录,显示所有时间的最佳成绩。

3.11.1 启用功能

  1. storage目录下创建all_time_leaderboards.txt文件(文件内容可以为空)

3.11.2 功能说明

  • 排行榜:显示所有时间的最佳成绩,而不仅仅是最近 60 分钟或 90 天的记录
  • 荣誉衫:仍然有效期为 60 分钟,但只有在创造新的历史记录时才会授予

3.12 解锁装备

可以解锁特殊装备或所有装备。

3.12.1 解锁特殊装备

  1. storage目录下创建unlock_entitlements.txt文件(文件内容可以为空)
  2. 这将解锁需要特殊权限的装备

3.12.2 解锁所有装备

  1. storage目录下创建unlock_all_equipment.txt文件(文件内容可以为空)
  2. 这将解锁所有可用装备

3.13 配置 CDN 代理

CDN 代理功能可以从 Zwift 官方服务器获取地图时间表和更新文件。

3.13.1 启用 CDN 代理

  1. storage目录下创建cdn-proxy.txt文件(文件内容可以为空)
  2. ⚠️ 限制:此功能只能在 zoffline 运行在与 Zwift 客户端不同的机器上时使用

3.13.2 禁用代理

默认情况下,zoffline 会尝试使用 Google 公共 DNS 来解析 Zwift 主机名,即使 zoffline 与 Zwift 客户端运行在同一台机器上也能工作。

  1. 如果要禁用此代理功能,在storage目录下创建disable_proxy.txt文件

3.13.3 从 zoffline 提供更新文件

  1. 运行get_gameassets.py脚本下载游戏文件
  2. 这样 zoffline 可以直接提供更新文件,而不需要从 Zwift 服务器获取

四、移动端 Companion 配置

Zwift Companion 是配套的移动端社交软件,可用于与骑友互动、配对设备、点赞、使用道具等功能。使用离线版 Zwift 需要重新打包 Companion 应用。

4.1 准备工作

官方原版 Companion 会对网络连接和证书做严格验证,需要对其进行"打补丁并重签名"才能连接到本地 zoffline 服务器。

4.2 替换 APK 证书并重新签名

4.2.1 安装 apk-mitm

  1. 安装 Node.js(如果尚未安装)
  2. 使用以下命令全局安装 apk-mitm:
npm install -g apk-mitm
  1. 其他系统可参考apk-mitm 项目 README自行安装

4.2.2 修改 apktool 配置

  1. 使用npm root -g查找 apk-mitm 的实际安装路径
  2. 打开apk-mitm/dist/tools/apktool.js文件
  3. 修改decode方法,添加-resmdummy参数:
    decode(inputPath, outputPath) {
        return this.run([
            'decode',
            '-resm', // add this
            'dummy', // add this
            inputPath,
            '--output',
            outputPath,
            '--frame-path',
            this.options.frameworkPath,
        ], 'decoding');
    }

4.2.3 生成修改后的 APK

  1. Zwift Offline 仓库下载以下文件:

    • ssl/cert-zwift-com.pem(证书文件)
    • zwift-offline-companion.apk(原始 APK 文件)
  2. 将这两个文件复制到同一目录(如:C:\Users\Administrator\Desktop\zwift-offline-companion

  3. 在该目录下运行以下命令:

apk-mitm --certificate cert-zwift-com.pem zwift-offline-companion.apk
  1. 命令执行完成后,会生成zwift-offline-companion-patched.apk文件,将其拷贝到手机安装即可

4.3 配置域名重定向

4.3.1 安装 Virtual Hosts

  1. 下载virtual hosts软件
  2. 安装到手机中

4.3.2 创建 hosts 文件

  1. 创建hosts.txt文件,内容如下(将<zoffline ip>替换为你运行 zoffline 的电脑 IP 地址):
<zoffline ip> us-or-rly101.zwift.com
<zoffline ip> secure.zwift.com
  1. ⚠️ 重要提示:如果在 PC 上配置过 hosts 文件,可能包含以下映射:
127.0.0.1 cdn.zwift.com

此映射不要添加到手机端的 hosts 文件中!

  1. hosts.txt文件复制到手机,放在便于访问的位置

4.3.3 启用域名重定向

  1. 打开 Virtual Hosts 软件
  2. 选择之前创建的hosts.txt文件
  3. 启用域名重定向功能

4.4 使用 Companion

  1. 使用离线版的账号登录 Companion,即可正常使用
  2. 验证连接:在打开和登录 Companion 时,观察 PC 端运行的 Zwift offline 命令行窗口是否有日志输出
    • 如果有日志输出,说明连接正常
    • 如果没有任何输出,说明请求未成功转发,需要检查 IP 地址配置是否正确

五、安卓设备直接使用 Zwift Offline

除了在 PC 上使用 Zwift Offline,你也可以直接在安卓设备上运行 Zwift 并连接到 zoffline 服务器。这种方式不需要 root 权限,但需要在每次安装或更新 Zwift 后重新打补丁。

5.1 安装必要应用

5.1.1 下载并安装 ZofflineObb

  1. GitHub Release 页面下载ZofflineObb.apk
  2. 安装到安卓设备上(需要允许安装未知来源应用)

5.1.2 下载并安装 Virtual Hosts

  1. GitHub Release 页面下载app-Github-release.apk
  2. 安装到安卓设备上

5.2 配置域名重定向

5.2.1 创建 hosts.txt 文件

  1. 创建hosts.txt文件,可以使用文本编辑器应用或在线工具(如在线文本编辑器

  2. 文件内容如下(将<zoffline ip>替换为运行 zoffline 的电脑 IP 地址):

    <zoffline ip> us-or-rly101.zwift.com
    <zoffline ip> secure.zwift.com
    <zoffline ip> cdn.zwift.com
    

    ⚠️ 注意:与 Companion 配置不同,安卓设备直接使用需要包含cdn.zwift.com的映射

  3. hosts.txt文件保存到手机,放在便于访问的位置

5.2.2 关闭 Private DNS

  1. 进入安卓设备的设置 > 网络和互联网 > 高级 > Private DNS
  2. 选择关闭自动

5.2.3 配置 Virtual Hosts

  1. 打开 Virtual Hosts 应用
  2. 选择之前创建的hosts.txt文件
  3. 启用域名重定向功能(确保按钮处于开启状态)

5.2.4 替代方案:使用 DNS 配置

如果你不想使用 Virtual Hosts 应用,也可以使用以下方法:

  1. 在运行 zoffline 的 PC 上,在storage目录下创建fake-dns.txt文件
  2. 在手机的 Wi-Fi 设置中,将DNS 1设置为运行 zoffline 的 PC 的 IP 地址
  3. 注意:如果你的路由器支持,也可以在路由器层面配置 DNS 记录,这样所有设备都可以自动使用

5.3 安装并打补丁 Zwift

5.3.1 安装 Zwift

  1. 从 Google Play 商店安装或更新 Zwift
  2. ⚠️ 重要:安装或更新后,不要立即启动 Zwift
  3. 如果已经启动过 Zwift,需要先清除数据:
    • 进入设置 > 应用 > Zwift > 存储 > 清除数据
    • 或者卸载后重新安装

5.3.2 运行 ZofflineObb 打补丁

  1. 打开ZofflineObb应用
  2. 运行补丁程序(允许访问存储权限)
  3. 等待补丁过程完成(通常需要 5-10 分钟)
  4. 补丁完成后,应用会提示完成

原理说明:ZofflineObb 会修改 Zwift 应用,使其接受 zoffline 服务器的自签名证书,这是连接离线服务器的关键步骤。

5.4 运行 Zwift

  1. 确保 Virtual Hosts 按钮处于开启状态
  2. 启动 Zwift 应用
  3. 使用任意邮箱和密码登录,或创建新用户(如果启用了多人游戏功能)
  4. Zwift 应该能够正常验证下载并运行

5.5 重要提示

  • 每次更新后需要重新打补丁:无论是从 Google Play 更新 Zwift,还是重新安装,都需要重新运行 ZofflineObb 打补丁
  • 保持网络连接:确保安卓设备与运行 zoffline 的 PC 在同一局域网内
  • 防火墙设置:确保 PC 的防火墙允许 zoffline 的端口访问

六、常见问题

6.1 卡在蓝色登录界面

症状: 登录时卡在蓝色界面,无法进入游戏

Responsive Image

解决方法:

  1. 在任务管理器中关闭 Zwift 进程
  2. 将输入法切换为微软英文输入法
  3. 重新启动 Zwift 并登录

Responsive Image

6.2 配置后无法更新 Zwift

原因: configure_client.bat会修改 Hosts 文件,导致无法连接到 Zwift 服务器

解决方法:

  1. 关闭正在运行的zoffline
  2. 进入zwiftoffline/zoffline-helper目录
  3. 右键点击disable_zoffline.bat,选择以管理员身份运行,清除网络配置
  4. 打开 Zwift 进行更新
  5. 更新完成后,重新运行configure_client.bat恢复配置

6.3 无法自动上传活动到 Strava

可能原因及解决方法:

  1. 检查strava_token.txt文件是否已正确放置在storage/1目录下
  2. 确认 Strava API 的Client IDClient Secret配置正确
  3. 检查网络连接,确保 zoffline 可以访问 Strava API
  4. 查看 zoffline 命令行窗口的错误日志,根据具体错误信息进行排查
  5. 检查在申请 API 时填写的授权回调域是否正确

6.4 安卓客户端无法登录

可能原因及解决方法:

对于 Companion 应用:

  1. 检查 Virtual Hosts 是否已正确启用
  2. 确认 hosts 文件中的 IP 地址是否正确(应为运行 zoffline 的电脑 IP,而非 127.0.0.1)
  3. 确保手机和电脑在同一局域网内
  4. 检查防火墙设置,确保 zoffline 的端口未被阻止
  5. 重新安装修改后的 APK 文件

对于直接使用 Zwift 应用:

  1. 确认已关闭 Private DNS 设置
  2. 检查 Virtual Hosts 是否已正确启用,按钮必须处于开启状态
  3. 确认 hosts.txt 文件包含所有三个域名映射(包括cdn.zwift.com
  4. 检查是否在安装/更新 Zwift 后运行了 ZofflineObb 打补丁
  5. 如果已启动过 Zwift,尝试清除应用数据后重新打补丁
  6. 确认手机和运行 zoffline 的 PC 在同一局域网内
  7. 检查 PC 防火墙设置,确保 zoffline 端口未被阻止