返回博客首页
← 所有文章

将 NativeScript 应用更新发布到 iOS App Store 和 Google Play

2017 年 4 月 25 日 - 作者:TJ VanToll

本文将指导您如何发布已经发布到 iOS App Store 和 Google Play 的 NativeScript 应用的新版本。我将使用我最近更新的一个小型应用,Pokémon Types,作为具体示例来演示这些步骤。

与移动设备的大多数操作一样,iOS 和 Android 在处理更新方面拥有相似但略有不同的流程,因此我们将分别针对各个平台进行处理,首先是 Android。

注意:由于本文是关于升级现有应用,因此我假设您已经熟悉如何将 NativeScript 应用部署到应用商店。如果您需要此过程的帮助,请参考我们关于发布应用的文章

更新 Android 应用

升级应用的第一步,无论是 iOS 还是 Android,都是更新版本号。在 Android 上,这些版本号位于您的app/App_Resources/Android/AndroidManifest.xml文件中,因此请立即打开该文件。

在文件顶部,您会注意到两个配置变量:android:versionCodeandroid:versionName。Android 的versionCode是一个整数值,每次将新版本上传到 Google Play 时都必须递增。您可以根据需要任意增加此数字,但最常见的做法是将数字递增 1。

versionName是用户在 Google Play 中看到的版本号。Android 关于版本控制的文档对该值描述如下。

“该值为字符串,以便您可以将应用版本描述为<major>.<minor>.<point>字符串,或作为任何其他类型的绝对或相对版本标识符。versionName除了显示给用户外没有其他用途。”

因此,基本上您可以使用任何字符串,但大多数开发人员使用与您为其他任何软件版本使用的相同的<major>.<minor>.<point>语法。以下是我如何更改AndroidManifest.xml文件以准备 Pokémon Types 应用升级。

android-diff

版本更改到位后,下一步是构建应用的新 APK,以便部署到用户。您可以参考我们关于创建 Android 发布版本的文档,但本质上,您需要运行以下命令,将~path/to/tj-vantoll.jksmy-very-secure-passwordPokemonTypes替换为您的值。

tns build android --release
--key-store-path ~/path/to/tj-vantoll.jks
--key-store-password my-very-secure-password
--key-store-alias PokemonTypes
--key-store-alias-password my-very-secure-password

命令完成后,您将在应用的platforms/android/build/outputs/apk文件夹中找到一个发布版.apk文件。现在,您已准备好前往 Google Play 开发者控制台上传此新版本。

在 Google Play 中创建更新

play.google.com/apps/publish处打开控制台,并选择您要升级的应用。从那里,点击“管理生产”按钮开始创建新的生产版本的过程。

android-1

接下来,点击“创建版本”按钮。

android-2

在下一个屏幕上,您需要做几件事。首先,找到“上传 APK”按钮并点击它。您将看到以下屏幕。

android-3

使用“浏览文件”按钮上传您刚刚生成的 APK(请记住,它位于您的platforms/android/build/outputs/apk文件夹中),然后点击“保存草稿”按钮。

最后,向下滚动并找到“版本名称”部分。在这里,为您的应用命名(大多数人为了简单起见只是在这里提供他们的版本名称),然后提供更新说明。对更新说明更加谨慎,因为用户在 Google Play 中升级您的应用时会看到这段文本。以下是我为 Pokémon Types 使用的值。

android-4

就是这样!最后,点击“保存”按钮,然后点击屏幕顶部的“提交更新”按钮。如果一切顺利,您的用户将在一天左右的时间内开始看到更新。

Android 已经处理完毕,让我们继续讨论如何在 iOS 上进行相同的升级流程。

更新 iOS 应用

与 Android 上一样,您升级 iOS 的第一步是更新应用的版本号。在 iOS 上,这些版本号位于您的应用的app/App_Resources/iOS/Info.plist文件中,因此请立即打开该文件。

与 Android 一样,iOS 也拥有两个版本号,CFBundleShortVersionStringCFBundleVersion。第一个,CFBundleShortVersionString,是最终用户看到的版本号,因此您可能希望使用与 Android 应用相同的<major>.<minor>.<point>约定。

CFBundleVersion值与 Android 的versionCode非常相似,每次将版本上传到 iTunes Connect 时,都必须递增CFBundleVersion。在大多数情况下,您可以为CFBundleShortVersionStringCFBundleVersion提供相同的值。例如,当我升级 Pokémon Types 时,我正是这样做的。

ios-diff

但是,如果您需要提交使用相同版本号的应用的多个版本(例如,如果您让用户通过 TestFlight 测试您的应用,或者如果 Apple 拒绝您的应用,您必须提交一个新版本),那么您必须在将新版本上传到 iTunes Connect 之前递增CFBundleVersion

在这些情况下,最常见的是为CFBundleVersion使用<major>.<minor>.<point>.<build>约定。例如,我可以将我的第一个 Pokémon Types 版本 1.1.0 的CFBundleVersion设为1.1.0.0,并将后续版本的CFBundleVersion设为1.1.0.11.1.0.2等。

将您要使用的版本号到位后,您需要为这个新版本执行您的发布版 iOS 版本构建。您可以参考我们的关于创建 iOS 发布版本的文档以了解详细信息,但本质上,您需要运行以下命令,并进行适当的代码签名更改(如果您不记得,请参考文档了解具体内容)。

tns build ios --release --for-device
--provision abdc-use-you-own-uuid

该命令完成后,您将在platforms/ios/build/device文件夹中找到所需的.ipa文件。现在,您已准备好前往 iTunes Connect 上传此新版本。

在 iTunes Connect 中创建更新

首先在https://itunesconnect.apple.com/处打开 iTunes Connect,点击“我的应用”,然后选择您要更新的应用。

从那里,找到“+ 版本或平台”链接并点击它。

ios-1

接下来,为您的应用提供一个版本号,然后点击“创建”按钮。(您在这里提供的版本号应与您之前使用的CFBundleShortVersionString匹配。)

ios-2

现在您已创建了新版本,您需要提供另外两条信息。第一是您的更新说明,您在屏幕顶部的最上面输入这些说明。我通常复制粘贴我为 Android 使用的相同说明。

ios-3

您必须提供的第二件事是更新的.ipa文件。如果您向下滚动到 iTunes Connect 中,您会发现此新版本的“版本”部分为空。

ios-4

将版本上传到 iTunes Connect 有几种不同的方法,但 NativeScript 应用的首选方法是使用 NativeScript CLI 的tns publish命令。

tns publish ios --ipa <path to your ipa file>

提示:请记住,您的 .ipa 文件位于应用的platforms/ios/build/device文件夹中。对于 Pokémon Types,我运行的完整命令是tns publish ios --ipa platforms/ios/build/device/pokemontypes.ipa

该命令会询问您的 iTunes Connect 电子邮件地址和密码,然后上传您的版本。请注意:Apple 需要几分钟(有时需要几个小时)才能处理您的版本,因此如果您的版本没有立即显示在 iTunes Connect 仪表盘中,请不要惊慌。相反,请刷新收件箱,直到您看到以下邮件,表明您的版本已准备就绪。

ios-5

此时,请返回 iTunes Connect,选择您的新版本,然后点击屏幕顶部的“提交审核”按钮。

ios-6

就这样,您已完成所有设置。iOS 应用商店更新仍然需要经过 Apple 的审核流程,因此请查看http://appreviewtimes.com/以了解您需要等待多长时间才能让应用通过审核并最终提供给用户。对于 Pokémon Types,我等待了一天多一点,然后我的设备上出现了以下内容 😄

ios-7

总结

更新 iOS 和 Android 应用可能很棘手,但它远没有首次将应用上传到应用商店那么困难。在您完成这些步骤几次后,您应该能够在一个小时内完成整个过程。如果您遇到问题,NativeScript 社区论坛 是一个很好的求助场所。