如何使用发布渠道将 Expo 应用发布到应用商店
让我们揭开发行渠道的神秘面纱!
2017 年,当我开始使用 Expo 为自己开发应用程序时,我唯一的目标就是让我的应用程序在 App Store 和 Play Store 上架。
当时我觉得最快的方法就是直接用 `Git push master` 😮,没有分支,没有拉取请求,也没有预发布环境……应用开发完成后,我得用 Expo CLI 分别构建 Apple 和 Android 版本。最后,终于拿到了应用.apk,.ipa然后通过了 App Store 和 Play Store 漫长而又令人焦虑的审核流程(这又是另一个话题了)。结果,它成功了……
几天后,假设我需要修复一个 bug 或添加一个新功能。我该怎么做呢?我不得不重复之前的所有步骤……也就是说,我需要修改代码,推送到主分支,构建独立应用,然后提交到应用商店,这样用户几天后才能看到新版本(前提是应用商店审核通过)。哦,对了,他们只有在手机上更新了我的应用后才能看到这些更改!
等等……事实并非如此。用户立即就能使用新版本。这怎么可能?
我上网搜索了一下,发现了OTA更新(OTA是Over The Air的缩写)。那是什么?
以下是世博会对此的表态:
OTA 更新允许您发布新版本的应用程序 JavaScript 和资源,而无需构建新版本的独立应用程序并重新提交到应用商店。
哇,好吧,这对我来说可是新鲜事!所以Expo的意思是,我只要写个命令就能修改我的应用,用户马上就能看到变化?这简直太方便了,要知道以前修改应用都要等好几天才能(可能)获得批准!
OTA 的工作原理是什么?简而言之,您可以对 JavaScript 应用进行任何所需的更改,然后只需输入命令expo publish。之后,您的应用将被压缩,并将两个版本的代码(iOS 和 Android)上传到 Expo CDN。
好的,但这跟用户手机上的应用有什么关系呢?问得好!Expo 在文档中是这样写的:
默认情况下,Expo 会在应用启动时自动检查更新,并尝试获取最新发布的版本。如果有新的软件包可用,Expo 会在启动应用前尝试下载。
就是这样!每次用户打开应用时,Expo 都会检查并获取您使用命令上传的最新代码版本expo publish(更多详情请点击此处)!因此,无需为每个应用商店重新上传独立的应用版本并再次经历审核流程!(不过,也有一些例外情况,详情请点击此处)
这个发现让我大吃一惊!我立刻就开始使用了!能够修复问题并直接在用户手机上看到效果,真是太棒了!
好的,朱利安,但是发行渠道呢?!
让我们回到正题!我是如何接触到发布渠道的?为什么单靠OTA更新对我来说还不够?一年前,我接了一个自由职业项目,客户开发一款已经上线应用商店的应用,需要添加一些新功能、改进设计并修复一些bug。他们还需要一种方法来查看我正在开发的版本,类似于一个测试环境(他们当时还没有这样的环境)。
我无法直接expo publish向他们展示开发中的版本,因为这会影响用户。就在这时,我发现了发布渠道!你可以把它们想象成不同的服务器,每个服务器都有一个特定的名称,你可以把应用上传到这些服务器上。例如,当你编写代码时expo publish,你还可以添加一个标志--release-channel <your-channel>(例如expo publish --release-channel staging:),这样你的应用就会发布到这个特定的渠道。你可以根据需要添加任意数量的渠道。
想象一下这个简单的工作流程:
- 你的应用正式版可在以下平台获取:
--release-channel production - 一个可在以下平台找到的测试版本:
--release-channel staging
但用户如何才能在手机上获得正确的版本呢?
假设你想开发一个应用并将其上传到应用商店,你会执行 `npm install`expo build:android 或 expo build:ios`npm install`,对吧?默认情况下,Expo 会自动为你添加一个通道,也就是 ` defaultnpm install`。
还记得 OTA 更新吗?因此,新生成的二进制文件只会拉取通过该通道发布的更新。这样,每次你使用 `npm install` 发布应用(不指定通道)时,Expo 都会将其发布到 ` defaultnpm install` 通道,你的用户就可以访问新版本了。expo publishdefault
我们还可以通过添加不同的渠道来改进这个工作流程!从现在开始,您无需再像以前那样发布应用而不指定渠道,只需production使用命令发布应用版本即可expo publish --release-channel production。这个新版本会自动订阅该production渠道并监听更新。
您只需在首次发布时将其上传到应用商店即可。
现在,假设你想开发一个新版本的应用程序,并将其展示给一些测试用户,而不影响正式production版本。
你只需要创建一个新的频道,比如一个测试频道expo publish --release-channel staging,并构建一个新的二进制文件来订阅这个特定的staging频道(例如,你可以将此构建版本上传到TestFlight,每次你在这个频道上发布新的更改时,你的 TestFlight 用户都可以看到正在进行中的开发!对于 Android,你可以将此二进制文件上传到测试版本)。
当您对测试环境应用感到满意时,无需创建新版本。您可以通过将版本提升到新渠道,将更改部署到生产环境应用。
什么?!每次发布应用时,都会创建两项内容:
版本发布,以 标识,适用
publicationId于 Android 和 iOS 平台。版本发布指的是发布时您打包的源代码和资源。指向频道中该版本的链接
staging,以 标识channelId。这类似于 git 分支上的提交。
要查看您发布的所有内容,只需执行以下操作 expo publish:history。您将看到类似这样的内容:
让我们回到推广的话题!如果你想把你的staging应用推广给目标production用户,你只需要确定publicationId你想推广的对象并采取行动expo publish:set --publish-id <publicationId> --release-channel production。
好了,您的更改已生效production!您可以expo publish:history再次操作以查看频道是否已更改!
如果你这样做导致用户出现重大退步怎么办?
别担心,只需回滚该promotion通道即可expo publish:rollback --channel-id <channelId>(注意,是回滚 `<version>` channelId,而不是 `<version> publicationId` 😉)!
就这么简单,你的版本就会恢复到之前的staging通道 :)
您可以设想任何适合您需求的工作流程,例如,您production可以设置多个渠道,分别对应应用程序的不同版本,并分别维护每个版本!
还有一件事!
既然你已经了解了发布渠道的几乎所有知识,那么如何直接在代码中访问渠道呢?
例如,这可以用来根据渠道设置环境变量。您可以在 清单对象的releaseChannel 字段中访问此信息。
以下是世博会的例子:
您可以创建一个函数,查找特定版本并设置正确的变量。
function getApiUrl(releaseChannel) {
if (releaseChannel === undefined) return App.apiUrl.dev // since releaseChannels are undefined in dev, return your default.
if (releaseChannel.indexOf('prod') !== -1) return App.apiUrl.prod // this would pick up prod-v1, prod-v2, prod-v3
if (releaseChannel.indexOf('staging') !== -1) return App.apiUrl.staging // return staging environment variables
}
如果您想了解更多关于发布渠道的信息,我邀请您查看 Expo 文档:发布渠道和高级发布渠道。
对了,如果您有任何疑问或者我遗漏了什么,请随时在下面的评论中告诉我!
如果你对我的下一篇文章感兴趣,别忘了在这里关注我哦;)
文章来源:https://dev.to/jcoulaud/how-to-publish-an-expo-app-to-the-stores-with-release-channels-1e3n



