不再需要每次创建和上传新版本。 这样,您就可以避免再次经历App Store漫长而痛苦的审核过程。
在2017年,当我开始使用Expo为自己开发应用程序时,我想要做的就是在App Store和Play Store上直播一个应用程序。
我当时认为是最快的方法是Git push master branch,没有分支,没有拉取请求,没有登台ENV ...当应用程序准备好后,我不得不使用Expo CLI为Apple和Android搭建它。 最后,通过我的.apk
和.ipa
,我可以通过对App Store和Play Store进行漫长而紧张的审查过程来发布它(这是另一个主题) 。 它奏效了...
几天后,假设我有一个要修复的错误或要添加的功能。 我最近怎么样? 我必须再次重复相同的过程...所以我正在做更改,继续使用master,构建独立的应用程序,然后将其提交给商店,以便几天后用户可以看到新版本(前提是App Store的评论被接受)。 哦,他们只有在手机上更新了我的应用后,才能看到更改!
但是,请稍等...事实并非如此。 用户可以立即访问新版本。 那怎么可能?
我做了一些谷歌搜索,然后发现了OTA更新 (OTA代表Over The Air)。 那是什么?
这就是世博会所说的 :
OTA更新允许您发布新版本的应用程序JavaScript和资产,而无需构建新版本的独立应用程序并重新提交给应用商店
哇,好,那对我来说真是新东西! 因此,Expo告诉我要在我的应用程序上进行更改,我只需编写一个命令,人们就会立即看到它? 当您通常需要等待几天才能(可能)获得批准时,这似乎是一个梦想!
OTA如何运作? 简而言之,您可以在javascript应用中进行所需的任何更改,只需编写expo publish
命令。 然后,您的应用将被缩小,并且您的代码的2个版本(iOS和Android)将被上传到Expo CDN。
好的,但是这与我的用户手机上的应用程序有什么关系? 好问题! Expo在文档中写的是:
默认情况下,Expo将在您启动应用程序时自动检查更新,并尝试获取最新发布的版本。 如果有可用的新捆绑包,Expo将在尝试启动体验之前尝试下载它。
而已! 每次用户打开应用程序时,Expo都会检查并获取您使用expo publish
命令上传的代码的最新版本( 此处有更多详细信息 )! 因此,无需上载新的独立应用程序版本,也无需为每个商店再次进行审核! ( 但是,您可以在此处找到一些例外 )
对我来说,这个发现令人震惊! 我立即开始使用它! 修复某些问题并直接在用户的手机上看到它真是一种荣幸!
好的,朱利安,但是发行频道呢?
让我们回到他们身边! 我如何遇到发行渠道,为什么OTA更新本身对我来说还不够? 一年前,我有一个针对客户的自由项目。 这是一个已经在商店中发布的应用程序,需要通过添加一些功能/设计和错误修复来进行改进。 他们还需要一种方法来查看我正在开发的版本,例如分阶段的ENV(目前暂时没有)。
我无法编写expo publish
向他们展示WIP,因为它会影响用户。 那就是我遇到发行渠道的时候! 您可以将它们想像成可以在其中上传应用程序的不同服务器,每个服务器都有一个特定的名称。 因此,例如,当您编写expo publish
,您还可以添加--release-channel
标志(例如: expo publish --release-channel staging
),这样,您的应用程序便会发布到该特定频道。 您可以根据需要添加任意数量的频道。
想象一下这个简单的工作流程:
--release-channel production
--release-channel staging
可用的暂存版本 但是,用户将如何在手机上获得正确的版本?
假设您要构建一个应用程序并将其上传到商店,您可以执行expo build:android
或expo build:ios
,对吗? 默认情况下,Expo将自动为您添加一个默认频道。
还记得OTA更新吗? 因此,新生成的二进制文件将仅提取通过default
通道发布的更新。
这样,每次您使用expo publish
(不指定通道)发布应用程序时,expo都会在default
通道上发布它,并且您的用户将有权访问新版本。
我们还可以通过添加不同的渠道来改善此工作流程! 从现在开始,而不是没有指定频道的发布,你可以发布一个production
的应用版本与命令expo publish --release-channel production
。
这个新版本将订阅production
频道并收听新的更新。
您只需要在第一时间将其上传到商店。
现在,假设您想使用新版本的应用程序并将其展示给一些测试用户,而不会与实时production
版本混淆。
您只需要创建另一个频道,例如expo publish --release-channel staging
并构建一个新的二进制文件即可订阅该特定的staging
信道( 例如, 您可以在 Testflight 上上传此版本, 并且每次您要在这个频道,您的Testflight用户将可以看到“进行中的工作!”对于Android,您可以将此二进制文件上传到 测试版本中 ) 。
当您对登台应用程序感到满意时,无需创建新的构建版本。 您可以通过促进释放到一个新的通道上部署生产应用程序的更改。
什么!? 每次发布应用程序时,都会创建两件事:
由Android和iOS平台的publicationId标识的版本。 发布是指发布时捆绑的源代码和资产。
到登台通道中版本的链接,由channelId标识。 这就像在git分支上的提交。
为了查看您已发布的所有内容,只需执行expo publish:history
。 您将看到如下内容:
让我们回到促销活动! 如果你想推广你的staging
应用到production
一个,你只需要确定的publicationId
要促进和做expo publish:set --publish-id
。
就是这样,您的更改现在已经投入production
! 您可以再次执行expo publish:history
来查看频道已更改!
如果您向这样做的用户添加了较大的回归,该怎么办?
无需担心,只需回滚执行expo publish:rollback --channel-id
的promotion
频道expo publish:rollback --channel-id
(请注意,回滚channelId
,而不是publicationId
)!
就是这么简单,您的发行版将返回到staging
频道:)
您可以想象任何适合您需求的工作流程,例如具有多个production
渠道的工作流程,这些production
渠道对应于您应用程序的不同版本,您可以在其中分别维护每个版本!
还有一件事!
既然您已经了解了有关发行渠道的所有知识,那么直接在代码中访问渠道又如何呢?
例如,这可以用于基于通道设置ENV变量。 您可以在清单对象的releaseChannel字段中访问此信息。
这是Expo的示例:
您可以创建一个查找特定版本并设置正确变量的函数。
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
From: https://hackernoon.com/how-to-publish-your-expo-application-to-the-app-stores-using-release-channels-un7a32ms