常见问题
复制一个包含安装步骤和完整 Markdown 指南的配置提示
如果您在这里找不到答案,请问!既可以提交问题,也可以在 工作室 中提问。
什么是“code push”?
什么是“code push”?Code 推送,也被称为“即时更新”(OTA)是一项云服务,允许Capacitor开发者在生产环境中将更新部署到他们的应用中。Capgo目前支持Android、iOS和Electron。
“Code推送”是React Native社区中使用的部署功能名称的引用 Microsoft 和 Expo,它们都支持Capacitor
什么是捆绑包和发布的区别?
标题:什么是捆绑包和发布的区别?我们使用“发布”一词来指代为应用商店准备二进制文件。在稍后生成捆绑包Capgo需要知道准确的二进制文件被发送到应用商店。
我们使用“捆绑包”一词来指代可以应用于发布以更新它以支持新code的补丁。 npx @capgo/cli@latest bundle upload code命令用于生成捆绑包,从您的新本地code开始,然后将其发送到您的用户。
我们是什么时候发布的路线图?
关于我们是什么时候发布的路线图的部分我们的项目板也公开,位于: https://github.com/orgs/Cap-go/projects
我们的团队也公开工作,所以你可以随时看到我们在做什么。我们很乐意回答关于我们的路线图或优先级的任何问题,通过Github问题或 Discord.
我可以用Capgo与我的团队一起工作吗?
关于我可以用Capgo与我的团队一起工作吗的部分是的!所有计划都支持无限开发者。我们只限制应用指标(MAU、存储和带宽)到每个组织。
查看 团队 查看更多信息。
是否Capgo存储我的源code?
标题:是否Capgo存储我的源code?不。Capgo服务器永远不会看到你的源code。当你运行 npx @capgo/cli@latest bundle upload,Capgo存储一个zip文件,包含最小化/编译后的code - 与浏览器接收的相同code,而不是你的源code。
为了额外的安全性,你有两个选项:
- 端到端加密:在上传之前对你的包进行加密,保护它在存储和传输过程中,并防止第三方使用你的私钥生成有效的加密更新。这并不使已发布的Web资产无法逆向工程,因为公共密钥已经包含在分发的应用程序中。
- 外部URL上传:将包存储在自己的服务器上,只向Capgo提供下载链接和选项
--external <url>
请参见我们的隐私政策: https://capgo.app/privacy
我可以从我的CI系统中使用Capgo吗?
标题为“我可以从我的CI系统中使用Capgo吗?”的部分是的,Capgo旨在从CI系统中使用。我们已经发布了一个指南 Android和Github Actions 和 iOS,以及 GitLab。其他CI系统应该类似
如果您遇到任何问题,请随时通过 GitHub 或 Discord 联系我们。
这与 Firebase Remote Config 或 Launch Darkly 有什么关系?
标题:这与 Firebase Remote Config 或 Launch Darkly 有什么关系?Code 推送允许在设备上添加新的 code 或替换 code。 Firebase Remote Config 和 Launch Darkly 都是配置系统。它们允许您在不需要发布新版本的情况下更改应用程序的配置。它们并不是用来替换 code 的。
这会增加多少依赖项的脚步?
标题:这会增加多少依赖项的脚步?我们尚未进行最新的测量,但我预计 code 推送库将在 Capacitor 应用程序中添加小于 1MB 的依赖项。我们知道如何在此成为优先事项时减小它。如果大小是一个阻碍,请告诉我们!
Capgo 在 iOS 18.4 模拟器上是否可用?
标题:Capgo 在 iOS 18.4 模拟器上是否可用?由于 iOS 18.4 Simulator 上游问题,Capgo 在此环境下运行不稳定。请在真实设备或使用不同 iOS 模拟器版本进行测试。
查看 React Native 问题详细信息: facebook/react-native#50510
code push 与大型应用程序兼容吗?
大型应用程序是否可以使用 code push 进行更新?是的。code push 无法更新的应用程序大小限制。如 下文所述,__CAPGO_KEEP_0__ push 可以更改您的应用程序中的任何 JS __CAPGO_KEEP_1__,无论大小如何。, Capgo can change any JS code in your application regardless of size.
我可以使用 __CAPGO_KEEP_0__ __CAPGO_KEEP_1__ push 进行什么?
Capgo code push 的使用场景是什么?
Section titled “Capgo code 可以推送什么内容?”我们看到各种使用场景,包括:
- 紧急修复生产应用程序。
- 将 bug 修复推送给使用较旧版本的应用程序的用户。
- 持续推送(例如每小时一次)。
Note that most app stores prohibit shipping code that changes the behavior of the app in a significant way. Please see 下文 了解更多信息。
What counts as a “MAU” for Capgo?
Section titled “What counts as a “MAU” for Capgo?”MAU(每月活跃用户)指的是一个月内活跃的设备。在 Capgo 的背景下,这实际上指的是一个月内活跃的设备。我们将任何在过去 30 天内与我们的服务器联系过的设备视为 MAU。我们不计算在过去 30 天内没有与我们的服务器联系过的设备。
重要: 从插件版本 v5.10.0, v6.25.0 和 v7.25.0, 设备ID现在在应用重装时会持续存在。 在这些版本之前,每次应用重装都会生成一个新的设备ID并计算为一个新的MAU。
使用当前版本:
- 设备ID在应用重装时会持续存在(在iOS中存储在Keychain中,Android中存储在加密SharedPreferences中)
- 更新应用不会创建一个新的设备ID
- 在开发过程中,如果您正在使用一个较旧的插件版本(< v5.10.0 / v6.25.0 / v7.25.0),每次重装仍会创建一个新的MAU
注意:TestFlight下载和Android的频道切换可能仍会根据您的配置生成新的设备注册
我们建议在首次设置后,禁用开发设备和模拟器以减少设备的重复数量。
我们不能使用 Capgo code 来推送什么?
关于我们不能使用 Capgo code 推送什么的部分如上所述,Capgo 不应用于违反应用商店政策。 请参阅 以下 内容了解更多信息。
此外,Capgo 不支持更改本机 code(例如在 Android 上使用 Java/Kotlin 或在 iOS 上使用 Objective-C/Swift)。 如果您尝试更新并且更改了本机 code,工具将会向您发出警告。
是否可以通过 Capgo 更新 capacitor.config.ts 的更改?
关于是否可以通过 Capgo 更新 capacitor.config.ts 的更改的部分不。 capacitor.config.ts 不能通过Capgo实时更新。Capacitor配置文件在本机构建时读取并编译到本机应用程序二进制文件中。这意味着任何对 capacitor.config.ts (例如插件配置、应用程序ID、服务器设置或本机插件选项)的更改都需要通过App Store或Google Play推出新的本机版本。
Capgo只能在运行时更新Web资产(HTML、CSS、JavaScript)。如果您需要更改Capacitor配置,请执行以下操作:
- 更新
capacitor.config.ts本地 - 重新构建您的本机应用程序(
npx cap sync后续的本机构建) - 将新二进制文件提交到应用商店
Capgo会为我提交到应用商店吗?
标题:Capgo会为我提交到应用商店吗?Capgo目前不支持代表您提交应用商店。我们计划在未来添加此功能,但目前您需要继续使用现有的流程来提交应用商店。
您可以使用我们的 CI指南 Android 来自动化这个过程并 CI指南 iOS.
什么是Capgo在磁盘上存储的内容以及存储位置?
标题为“什么是Capgo在磁盘上存储的内容以及存储位置?”的部分The Capgo updater (included in your application when you build your app) caches the latest downloaded bundle in the only directory that capacitor allow to load code. On Android, this is located in /data/user/0/com.example.app/code_cache/capgo_updater 尽管该路径的基础由Android系统提供并且可以在运行时动态更改。 在iOS设备上,数据存储在 Library/Application Support/capgo.
Capgo命令行工具(例如 npx @capgo/cli@latest bundle upload)在磁盘上安装在npm缓存中,登录信息存储在您的主目录中在 ~/.capgo.
Capacitor热重载与此如何相关?
关于如何与Capacitor热重载相关的内容Capacitor的热重载是一个仅在开发时可用的功能。Code推送是用于生产环境的。
Capacitor的热重载是一个允许您在开发时更改code的特性。它需要在本地机器上建立一个代理来连接Capacitor应用。
Code推送是一个允许您在生产环境中更改code的特性。我们将使用各种不同的技术来实现这一点,具体取决于平台。
直接链接到Capgo code推送支持的更改类型
Capgo可以更改您的应用中的任何JScode。这包括应用__CAPGO_KEEP_2__和生成的__CAPGO_KEEP_3__。您还可以更新依赖项Capgo can change any JS code in your application. This includes app code and generated code. You can also update dependencies in package.json 我们没有计划支持更改nativecode(例如Android上的Java/Kotlin或iOS上的Objective-C/Swift),并且工具将警告您如果它检测到您更改了native__CAPGO_KEEP_1__,因为它们不会包含在捆绑包中。
We do not have plans to support changing native code (e.g. Java/Kotlin on Android or Objective-C/Swift on iOS), and the tool will warn you if it detects that you have changed native code as it will not be included in the bundle.
直接链接到是否支持Web?
标题:Does this support Web?Code push 不需要在 web 上,因为 web 已经支持这种方式。当用户打开一个 web 应用时,它会从服务器下载最新版本,如果需要。
如果您有使用 code push 与 web 的场景,我们很想知道!
这个会在 iOS、Android、Mac、Windows、Linux 等设备上工作吗?
标题:Will this work on iOS, Android, Mac, Windows, Linux, etc?是。
我们目前主要关注 Android、iOS 和 Electron 支持,code push 在这三个平台上已经是生产就绪的。
什么操作系统版本 Capgo 支持?
标题:What OS versions does Capgo support?Capgo 支持的 Android 版本与 Capacitor 支持的版本相同。
Capacitor 目前支持 Android API 22+ 和 iOS 13.0+: https://capacitorjs.com/docs/main/reference/support-policy
Capgo 支持哪些版本的 Capacitor?
Section titled “What versions of Capacitor does Capgo support?”Capgo 目前只支持 Capacitor 的最新稳定版本。我们也可以支持 Capacitor 的旧版本,但我们还没有建立必要的基础设施来维护这些旧版本。我们打算在未来支持更多的 Capacitor 版本,包括我们的企业客户的任何版本。 https://github.com/Cap-go/capgo/issues/1100
Capgo 跟踪 Capacitor 的稳定版本,并在稳定版本发布后几小时内进行更新。我们的更新系统是自动化的,更新时间约为几分钟。我们还进行了额外的手动验证步骤,最后才发布到我们的服务器上。
__CAPGO_KEEP_0__ 与 App/Play Store 审核流程或政策相关吗?
__CAPGO_KEEP_0__ 与 App/Play Store 审核流程或政策相关开发者在选择使用这些商店时,必须遵守与商店提供商的协议。Code推送是为了让开发者能够更新他们的应用程序,同时仍然遵守iOS、Android和Electron分发渠道的商店政策。 __CAPGO_KEEP_0__推送与React Native类似,提供了多种商业产品来实现此功能(例如, 微软).
微软还发布了一份指南,说明他们的解决方案如何遵守应用商店的规定: https://github.com/microsoft/react-native-code-push#store-guideline-compliance
Code推送是应用商店中广泛使用的技术。所有我知道的大型应用程序都使用code推送。需要注意的主要政策是,不要改变应用程序的行为方式。请参见 以下 更多信息。
Capgo是否遵守Play Store指南?
标题为“Capgo是否遵守Play Store指南?”的部分是
Google Play商店对更新工具有两个限制。
- 更新必须使用解释器或虚拟机(Capgo在WebView中使用JavaScript)。 https://support.google.com/googleplay/android-developer/answer/9888379?hl=en
An app distributed via Google Play may not modify, replace, or update itself using any method other than Google Play's update mechanism. Likewise, an app may not download executable code (such as dex, JAR, .so files) from a source other than Google Play. *This restriction does not apply to code that runs in a virtual machine or an interpreter* where either provides indirect access to Android APIs (such as JavaScript in a webview or browser).
Apps or third-party code, like SDKs, with interpreted languages (JavaScript, Python, Lua, etc.) loaded at run time (for example, not packaged with the app) must not allow potential violations of Google Play policies.- 应用程序的更改不得欺骗性(例如,通过更新改变应用程序的目的)。 https://support.google.com/googleplay/android-developer/answer/9888077 请与您的用户清晰地说明您提供的内容,并不要通过Capgo的使用引入显著的行为变化,违反用户的期望。
Capgo旨在与Google Play商店的指南兼容。然而,Capgo是一个工具,像任何工具一样,可以被滥用。故意滥用Capgo以违反Google Play商店指南的行为违反了Capgo 服务条款 这可能导致您的帐户被终止。
最后,code推送服务在行业中广泛使用(我所知的大型应用程序都使用它们),并且有多个其他code推送服务公开可用(例如,expo.dev和appcenter.ms)。这是一个被踩踏的路径。
微软还发布了一份指南,说明他们的react native“codepush”库如何遵守应用商店的指南: https://github.com/microsoft/react-native-code-push#store-guideline-compliance
是否Capgo遵守App Store指南?
是否Capgo遵守App Store指南?Yes.
类似于Google Play商店,App Store同样提供技术和政策限制。
3.2.2... interpreted code may be downloaded to an Application but only so long assuch code:(a) does not change the primary purpose of the Application by providingfeatures or functionality that are inconsistent with the intended andadvertised purpose of the Application as submitted to the App Store,(b) does not create a store or storefront for other code or applications, and(c) does not bypass signing, sandbox, or other security features of the OS.Capgo通过在iOS中使用JavaScript在WebView中来遵守解释器限制的更新。只要您的应用程序不通过更新进行欺骗性行为(例如,通过更新改变应用程序的目的),则通过Capgo(或任何其他code推送解决方案)进行更新是标准行业实践,并且遵守App Store指南。
故意利用Capgo来违反App Store指南是违反Capgo的 服务条款 并可能导致您的帐户被终止。
微软还发布了一份关于他们的react native“codepush”库如何遵守应用商店的指南: https://github.com/microsoft/%E6%95%88%E6%9E%9F%E5%8F%98%E5%8C%96-%E6%8F%90%E4%BA%A7code-push#store-guideline-compliance
Can I use Capgo in my country?
Capgo 在我国是否可用?我们没有试图限制对任何国家的访问Capgo。
我们了解到一些国家对从该国内部访问的网址有所限制。 Capgo 目前使用 Cloudflare 云来进行托管,包括 R2 存储和 Cloudflare 工作者。
以下 URL 由 Capgo 使用:
- https://api.capgo.app — 由 Capgo 使用
npx @capgo/cli命令行工具用于与Capgo服务器以及Capgo更新器在用户设备上检查更新。 - https://*.r2.cloudflarestorage.com — 由 Capgo 使用
npx @capgo/cli命令行工具用于上传和下载捆绑包
如果您国家的所有这些URL都可访问,那么Capgo应该可以正常工作。
如果您的地区需要阻止访问任何这些URL,请告知我们,我们可以与您合作找到解决方案。代理服务器是其中一种选择。
我可以自行托管Capgo吗?
标题:我可以自行托管Capgo吗?是的,您可以自行托管Capgo。指南尚未编写,但code是开源的,位于 https://github.com/cap-go/capgo
code推送是否需要互联网才能工作?
标题:code推送是否需要互联网才能工作?是的。可以想象运行一个服务器来分发更新,独立于公共互联网,但某种形式的网络连接是必需的,以便将更新传输到设备。
Capgo在没有网络连接的情况下会受到什么影响?
标题为“Capgo在没有网络连接的情况下会受到什么影响?”的部分当您使用Capgo构建应用程序时,Capgo更新器(包含在您的应用程序中)旨在对网络连接问题具有抵抗力。
在默认的更新行为中,当应用程序启动时,它会警告Capgo更新器,后者会在单独的线程中发出网络请求到Capgo的服务器并要求更新。我们故意使用单独的线程以避免阻塞应用程序可能正在执行的其他任务。如果网络请求失败或超时,更新器将简单地尝试下次应用程序启动时再次检查。
Capgo命令行工具(例如Capgo)需要网络连接才能正常工作。如果您正在使用Capgo来分发您的应用程序,则应确保您的CI系统具有网络连接。 npx @capgo/cli@latest bundle upload) require network connectivity to function. If you are using Capgo to distribute your app, you should ensure that your CI system has network connectivity.
直接链接到如果用户长时间未更新并错过更新会发生什么?
我们的实现始终发送一个针对设备的更新,设备是请求更新的设备。更新请求者始终会更新到最新的版本。因此,如果用户长时间未更新,他们将会“错过”中间的更新。__CAPGO_KEEP_0__ command line tools (e.g. __CAPGO_KEEP_0__) require network connectivity to function. If you are using __CAPGO_KEEP_0__ to distribute your app, you should ensure that your CI system has network connectivity.
The update server could be changed to support responding with either the next incremental version or the latest version depending on your application’s needs. Please let us know if alternative update behaviors are important to you.
Capgo与Capacitor之间的关系如何?
标题:Capgo与Capacitor之间的关系?Capgo是为Capacitor添加code推送功能的插件。Capgo不是Capacitor的替代品。您可以继续使用您已经熟悉的Capacitor工具。
我们跟踪Capacitor的最新稳定版本,并更新code推送插件以与其兼容。
更新何时发生?
标题:更新何时发生?By default, the Capgo updater checks for updates on app startup. It runs on a background thread and does not block the UI thread. Any updates will be installed while the user is using the app and will be applied the next time the app is restarted.
It is also possible to run the Capgo updater manually using the @capgo/capacitor-updater 包手动运行Capgo更新器,通过它可以在任何时候触发更新,包括通过推送通知。
The Capgo 升级器是设计成,当网络不可用,或者服务器宕机或无法访问时,应用程序仍然可以正常运行。即使您选择从我们的服务器删除更新,所有客户端也会继续正常运行。
我们添加了回滚补丁的功能。最简单的方法是简单地将之前的包附加到您的频道中来撤销。
您需要保留 app_id 密钥吗?
标题:是否需要保留 app_id 密钥?不。 app_id 包含在您的应用程序中的
是安全的,可以公开。您可以将其添加到版本控制(甚至公开)中,不用担心有人访问它。 app_id can fetch the latest version of your app from Capgo servers, but they cannot push updates to your app or access any other aspect of your Capgo account.
可以从 Capgo 服务器上获取最新版本的应用程序,但他们无法推送应用程序的更新或访问您的 __CAPGO_KEEP_1__ 账户的任何其他方面。
直接链接到什么信息会发送到 Capgo 服务器?尽管Capgo已连接到网络,但它不会发送任何个人识别信息。包括Capgo在内的内容不应影响您对Play Store或App Store的声明。
应用程序向Capgo服务器发送的请求包括:
- app_id (指定的
capacitor.config.json) - channel (可选的在
capacitor.config.json) - release_version (从AndroidManifest.xml或Info.plist中获取的CFBundleShortVersionString或
capacitor.config.json如果设置,则为CapacitorUpdater.version) - version_number (作为
npx @capgo/cli@latest bundle upload) - os_version (例如 ‘11.2.1’
- platform (e.g. ‘android’, needed to send down the right patch) That’s it. The code for this is in
updater/library/src/network.rs - That’s it。__CAPGO_KEEP_0__的原因在于
- device_id (在设备上首次运行时生成,用于去重设备安装并允许我们根据已安装用户(例如每月活跃用户)而不是总补丁或总补丁安装来收费)
What platforms does Capgo support?
Capgo 支持哪些平台?目前,Capgo 支持 Android、iOS 和 Electron。所有这些都是生产就绪的。
您可以独立决定使用 Capgo 进行 iOS、Android 或 Electron 开发。您可以根据需要为 Android 和 App Store 构建ipa文件,也可以为 Electron 构建通道。
如果您需要支持桌面或嵌入式目标,Capgo 可以(相对容易地)支持这些目标。如果这些目标对您很重要,请告诉我们。
Capgo 如何与 Google Play 测试跟踪或 Apple TestFlight 交互?
Capgo 与 Google Play 测试跟踪或 Apple TestFlight 的交互方式是什么?每个应用商店都有自己的机制来将应用分发给有限的用户组(例如“内部测试”、“闭 beta”等)。这些机制都是为了将用户分成组,并将特定版本的应用分发给每个组。
遗憾的是,这些机制并不是所有的都允许第三方检测应用是否安装在任何特定的测试跟踪或 TestFlight 中。因此,我们无法可靠地看到这些组的组成,并且无法可靠地根据这些组来控制对 Capgo 补丁的访问。 https://stackoverflow.com/questions/53291007/can-an-android-application-identify-the-test-track-within-google-play https://stackoverflow.com/questions/26081543/how-to-tell-at-runtime-whether-an-ios-app-is-running-through-a-testflight-beta-i
如果您想Capgo包的可用性分段化,有4种潜在选项:
- 使用单独的频道为每个组。这种方法最直接,但需要您管理多个频道。您可能已经有dev频道和prod频道,各有不同的可用性。您可以更新dev频道,验证后再单独更新prod频道。我们建议使用分支/标签在版本控制中帮助跟踪与每个发布相关的源代码。
- 跟踪自己的优惠用户列表,禁用自动更新,并仅在特定用户上触发更新。
@capgo/capacitor-updaterpackage. 这种方法今天有效,但需要您管理自己的优惠用户列表。 - Capgo允许在设备级别创建自己的优惠机制(类似于Test Tracks或TestFlight,只是平台无关)。这使得您的QA团队可以在他们被推广到公众之前优惠Capgo包。
- Capgo支持基于百分比的滚动发布。这种方法不允许您选择要发送的设备,但可以帮助您逐步发布并在出现问题时回滚。
账单
账单如何升级或降级我的计划?
如何升级或降级我的计划?您可以在任何时候在您的控制台中升级或降级您的计划: https://console.capgo.app/settings/organization/plans
什么时候我的账单周期会重置?
账单周期重置Billing periods are reset automatically every month on the month you first subscribed to Capgo. For example, if you subscribed on the 15th of the month, your billing period will reset on the 15th of every month.
如何取消我的订阅?
取消订阅您可以在任何时候在您的控制台中取消您的订阅: https://console.capgo.app/settings/organization/plans
是否可以预付一年费用?
关于是否可以预付一年费用是的,您可以在任何时候在您的控制台中: https://console.capgo.app/settings/organization/plans
统计和分析
关于统计和分析您的控制台中的统计数据每天凌晨UTC更新。 统计数据基于 月活跃用户 指已安装在您的设备上的
设备 ID 是如何生成的
设备 ID 是如何生成的设备 ID 在首次运行设备时生成,用于去重设备安装和根据已安装用户(例如每月活跃用户)来收费,而不是根据总数或总数的安装数。
MAU 比安装数量更好的解决方案来定价 Capgo, 因为它更准确,反映了每设备的实际成本 Capgo。
设备 ID 持久性(更新于 v6.25.0 和 v7.25.0):
- 当前行为:设备 ID 现在在 app 重装时持久化。它被安全存储在设备的 Keychain (iOS) 或 EncryptedSharedPreferences (Android),允许我们在卸载/重新安装后跟踪相同的设备。
- 之前行为 (在 v6.25.0/v7.25.0 之前): 由于苹果和谷歌商店的隐私政策原因,设备 ID 在 app 重装时被重置,无法跟踪相同的设备。
隐私规则由苹果和谷歌强制执行,Capgo 的实现遵循了他们的最佳实践。
设备 ID 将不会出现在您的设备列表中,直到他们安装了第一个补丁。
为什么我的设备数量与MAU不符?
标题:为什么我的设备数量与MAU不符?目前,设备列表并非像MAU那样频繁更新。
设备列表仅在设备安装更新时才会更新。
而MAU则在每次应用启动时都会更新。这是平台当前的限制。我们的分析平台不支持原始更新,因此我们使用传统数据库来存储设备列表。
为了限制数据库查询的数量,我们只在应用更新时更新行。
将来会移除此限制。
如何根据平台有不同的更新?
标题:如何根据平台有不同的更新?您可以为每个平台创建一个频道,并在每个频道中禁用平台特定的更新。
在 ios 通道中禁用 android 更新,并在 android 通道中禁用 ios 更新。
然后将每个通道的包上传到各个平台以获得不同的更新。
如果您需要在两个平台上获得相同的更新,可以将一个包链接到多个通道。无需重复上传包。