AppZung 码Push 的原生模块
阿普赞
阿普赞 是CodePush功能的有力解决方案,针对AppCenter的退休而创建. CodePush 允许您在您的 React Natural apps 中轻松添加动态更新体验 .
我们提供与原代码Push的特征均等,并引进以下先进能力:
- 托管
- 交付
- 分析
- 警卫
- 隐私
目前,AppZung被几个私人客户用于生产,服务于超过2M的最终用户.
AppZung未来可能或不会将范围扩大到CodePush特性之外.
现在加入平台:登录并订阅 AppZung 控制台。 。 。 .
怎么会这样?
反应原生应用程序由 JavaScript 文件及任何随附文件组成 图像,它们被捆绑在一起 地铁捆绑器 并作为特定平台二进制(即: .ipa 或者说 .apk 存档). 应用程序发布后,更新JavaScript代码(如制作错误修正,添加新功能)或图像资产,需要您重新编译并再分配整个二进制,这当然包括与您正在出版的商店相关的任何审查时间.
代码Push插件帮助在终端用户面前立即获得产品改进,方法是保持您的JavaScript和图像与您向代码Push服务器发布的更新同步. 这样,你的应用程序就能从离线移动体验中获得好处,以及一旦获得副载更新的"网状"敏捷性. 这是一个双赢!
为了保证您的终端用户总是有一个功能化的应用程序版本,CodePush插件维护了上一个更新的复制件,这样,如果您不小心推了包含崩溃的更新,就可以自动回滚. 这样,你可以放心,你新发现的发布敏捷性不会导致用户在有机会翻回服务器之前被屏蔽. 双赢!
注意: 任何产品更改, 触及本地代码( 例如修改您的本地代码) AppDelegate.mm编号 :MainActivity.kt 文件,添加新插件,或更改不使用的图像或视频 require() 语法)不能通过 CodePush 发行,因此必须通过适当的商店更新.
开始
如果你从 react-native-code-push,见下文 "迁入AppZung代码推"。 。 。 .
否则:
npm install --save @appzung/react-native-code-push
然后继续安装本地模块:
或者,如果您的应用程序由 Expo 框架管理,则安装和配置 @appzung/expo-config-code-push (英语)。 。 。 .
移动到 AppZung 代码Push
这个 @appzung/react-native-code-push 软件包旨在作为 react-native-code-push 来自微软的模块。 你可以看到下面的移民步骤.
该软件包将更新新功能,仅可在 @appzung/react-native-code-push v10+ (非原样) react-native-code-push 页:1.
这个软件包与v11+上的新架构(iOS和Android)兼容.
Windows (UWP) 在v10+上不会被积极支持,除非有需求(它会被卡在CodePush v9的基本特性上. 请联系 你好@appzung.com 帮助我们评估这一需求。 谢谢你的理解.
我们把"部署"改名为"放出渠道",以在实际放出部署与其放出渠道之间更加清晰.
迁移到 AppZung CLI
- 使用 AppZung CLI (英语)
@appzung/cli)代替了AppCenter的. 见npx @appzung/cli@1 welcome财务报告和审定财务报表npx @appzung/cli@1 --help - 从 AppCenter 自动移动您的应用程序, 以便保留您的大部分配置( 项目等级, 释放频道 公共 ID = 部署密钥... )
npx @appzung/cli@1 codepush migrate - 更改您的部署进程
npx @appzung/cli@1 releases deploy-react-native(见第三节) "发布最新消息" (见下文)
迁移到@appzung/ react-native-code-push v7,v8,v9或以下
如果您的应用不符合上个版本微软的要求 react-native-code-push (iOS 15.5, React Industrial 0.71+),本模块基于该模块,您仍然可以使用旧版本的 react-native-code-push 并具体说明 CodePushServerUrl 改为 https://codepush.appzung.com,因为我们的API与原始模块的特性相兼容.
您也可以使用我们基于 v5-v9 版本发布的版本, 只需最小的修改 :
- 替换
react-native-code-push版本为npm:@appzung/[email protected](或8.3.2, 7.1.1, 6.4.2, 6.3.1, 5.7.1) e."react-native-code-push": "npm:@appzung/react-native-code-push@^8.3.2", - 运行
npm install(或yarn视项目而定) - 运行
bundle exec pod install - 就这样! 在这些版本中,您保留了旧名词"部署Key"(vs new ReleaseChannelPublicId).
迁移到 @appzung/ react-native-code-push v10+
如果你不急的话,你可以去 @appzung/react-native-code-push v10+ 其中我们将在未来增加新的功能并积极支持该模块.
见 相应步骤。 。 。 .
兼容性表
我们尽力保持我们的插件与之前版本的React Industrial相容,但由于平台的性质,以及发行间出现突破变化,你可能需要使用代码Push插件的特定版本,以支持你正在使用的React Industrial的准确版本. 下表概述了哪些CodePush插件版本正式支持各自的回放原生版本:
| 反应原生版本 | 机器人 | iOS系统 | 旧拱门 | 新建拱门 | 支持代码Push版本 |
|---|---|---|---|---|---|
| < 0.59 (英语) | - 说吧 | - 说吧 | ✅ | ❌ | 不支持 |
| 页:1 | 4.1+ (1.2立方磅+) | 第7条 | ✅ | ❌ | v 5.7.1 国家 |
| v.60-v.61 (英语) | 4.1+ (1.2立方磅+) | 第7条 | ✅ | ❌ | 页:1 |
| v.62-v0.64 (英语) | 4.1+ (1.2立方磅+) | 第7条 | ✅ | ❌ | 页:1 |
| v.65-v.70 (英语) | 4.1+ (1.2立方磅+) | 第9条 | ✅ | ❌ | 页:1 |
| v.071-v.79 (中文(简体) ) | 4.1+ (1.2立方磅+) | 第9条 | ✅ | ❌ | 页:1 |
| v.071-v.79 (中文(简体) ) | 4.1+ (1.2立方磅+) | 15.5 (中文(简体) ) | ✅ | ❌ | 页:1 |
| 页:1 | 4.1+ (1.2立方磅+) | 15.5 (中文(简体) ) | ✅ | ❌ | v10+ 时间轴 |
| 页:1 | 4.1+ (1.2立方磅+) | 15.5 (中文(简体) ) | ✅ | ✅ | v11+ (英语) |
我们努力应对新的RN释放,但是它们偶尔会打破我们. 我们将用每个RN发布版本来更新这个图表,这样用户就可以检查一下我们的"官方"支持是什么.
Windows (UWP) 在v10+上不会被积极支持,除非有需求(它会被卡在CodePush v9的基本特性上. 请联系 你好@appzung.com 帮助我们评估这一需求。 谢谢你的理解.
使用量
有了CodePush插件下载和链接,你的应用程序要求CodePush从哪里得到正确的JS捆绑,唯一剩下的是将必要的代码添加到你的应用程序中来控制以下政策:
- 何时(和多久)检查更新? (例如应用启动,在设置页面中点击按钮时,在一定固定的间隔内定期启动)
- 当更新可用时,如何向最终用户展示?
最简单的方法是"代码Push-fy"您的应用的根组件:
import withCodePush from '@appzung/react-native-code-push';
const MyApp = () => {};
export default withCodePush(MyApp);
默认情况下,这被推荐给生产环境,CodePush将检查每个应用程序启动时的更新. 如果有更新可用,它将被静默地下载,并在下一次重启应用程序时安装(要么由终端用户明确,要么由OS),这保证了您的终端用户的入侵经验最少. 如果已有的更新是强制性的,则将立即安装,确保最终用户尽快得到.
如果您希望您的应用程序能更快地发现更新,您也可以选择在每次应用程序从背景恢复时与 CodePush 服务器同步.
import withCodePush, { CheckFrequency, InstallMode } from '@appzung/react-native-code-push';
withCodePush({
checkFrequency: CheckFrequency.ON_APP_RESUME,
})(MyApp);
对于更具攻击性的设置,您也可以选择在背景或应用程序恢复时安装更新. 注意,由于应用程序会在更新安装期间重新加载,除非您有机制在重启后返回到完全相同的应用程序状态,否则用户可能会被稍为困扰. 您可以使用 minimumBackgroundDuration。 。 。 .
在新Arch中的Android上,最好使用ON NEXT RESUME,而不是ON NEXT SUSPEND,因为看起来React Introduct在背景中初始化时网络请求会出故障.
import withCodePush, { CheckFrequency, InstallMode } from '@appzung/react-native-code-push';
import { Platform } from 'react-native';
withCodePush({
checkFrequency: CheckFrequency.ON_APP_RESUME,
installMode: Platform.OS === 'android' ? InstallMode.ON_NEXT_RESUME : InstallMode.ON_NEXT_SUSPEND,
minimumBackgroundDuration: 60 * 5, // if the app is suspended more than 5 minutes, install the update. If the app is restarted (killed and restarted) it will also install the update.
})(MyApp);
或者,如果想要精确控制检查发生时(如按下按钮或计时间隔),例如在中转环境中,可以拨打 CodePush.sync() 随时随地 SyncOptions,然后通过指定手册来关闭 CodePush 的自动检查 checkFrequency数字 :
import withCodePush, { CheckFrequency, InstallMode, sync } from '@appzung/react-native-code-push';
class MyApp extends Component {
onButtonPress() {
sync({
updateDialog: true,
installMode: InstallMode.IMMEDIATE,
});
}
render() {
return (
<View>
<TouchableOpacity onPress={this.onButtonPress}>
<Text>Check for updates</Text>
</TouchableOpacity>
</View>
);
}
}
export default withCodePush({ checkFrequency: CheckFrequency.MANUAL })(MyApp);
如果您想要显示更新确认对话框( “ 主动安装 ” ) , 在安装可用的更新时配置( 如强制立即重新启动) , 或以任何其他方式自定义更新经验 , 请参考 withCodePush() API 对于如何调整这一默认行为的信息参考.
发布更新
一旦你的应用程序被配置并分发给用户,并且你做了一些JS或资产修改,是时候发布它们了. 释放他们的建议方式是 appzung releases deploy-react-native 命令(或 appzung releases deploy-expo 如果使用 Expo ) 在 AppZung CLI 中,它会将您的 JavaScript 文件, 资产文件捆绑起来, 并将更新发布到 CodePush 服务器 .
当地
注意: 在您开始发布更新之前, 请通过运行 AppZung 登录 appzung auth login 命令.
以最基本的形式来说,这个命令是这样的:
appzung releases deploy-react-native
这个 appzung releases deploy-react-native 命令允许这样简单的工作流程,因为它提供了许多明智的默认(比如生成发布捆绑,假设您的应用程序在iOS上的条目文件要么) index.ios.js 或者说 index.js) (中文(简体) ). 然而,所有这些缺省都可以根据需要量身定做,以允许增量灵活性,从而使其与大多数设想方案相适应。 这里有常见的用例:
# Release a mandatory update with a changelog from the last git commit (useful for staging releases)
appzung releases deploy-react-native -m --description-from-current-git-commit
# Force using hermes since auto-detection is not always possible. There is the equivalent --use-jsc to force using JSC engine.
appzung releases deploy-react-native --use-hermes
# Auto detecting the release version might not be a good strategy in a production app with multiple environments so you can specify the version
appzung releases deploy-react-native --target-binary-version "1.1.2"
# See other flags
appzung releases deploy-react-native --help
代码Push客户端支持差异更新,所以尽管您正在发布您的JS捆绑和每次更新的资产,您的终端用户只会实际下载他们需要的文件. 服务会自动处理这个,这样你就可以专注于创建真棒的应用程序,我们可以担心优化终端用户下载.
欲了解更多详情 appzung releases deploy-react-native 命令的作品,以及它所暴露的各种参数,是指 appzung releases deploy-react-native --help 命令。 此外,如果你愿意处理运行 react-native bundle 因此,想要一个比 appzung releases deploy-react-native中,提及 appzung releases deploy --help 命令以获取更多细节.
如果你遇到任何问题,或有任何问题/评论/反馈,你可以检查一下 排除出问题 下面的细节或发电子邮件给我们 支持@appzung.com。 。 。 .
注:代码Push更新应当以除去bug模式以外的模式进行测试. 在调试模式下,React Industrial app总是下载由包机生成的JS捆,因此由CodePush下载的JS捆不适用.
在线上
您通常会在 CI 中发布更新, 因此命令需要发布频道和您之前创建的工程密钥 API appzung projects api-keys create。 。 。 .
appzung releases deploy-react-native --release-channel $APPZUNG_RELEASE_CHANNEL_ID_ANDROID --description-from-current-git-commit --use-hermes --disable-duplicate-release-error --api-key $APPZUNG_API_KEY
appzung releases deploy-react-native --release-channel $APPZUNG_RELEASE_CHANNEL_ID_IOS --description-from-current-git-commit --use-hermes --disable-duplicate-release-error --api-key $APPZUNG_API_KEY
我们将出版关于GitHub Actions和Bitrise的最佳做法和工作流程实例的指南.
高级用途
参见相应的文档文件 高级用途。 。 。 .
存储准则遵守情况
Android Google Play和iOS App Store都有相应的准则,在将CodePush解决方案整合到您的应用程序中之前,您应该了解这些准则.
谷歌游戏
第3段,第1行,第1行 设备和网络滥用 专题描述除了Google Play的更新机制之外,其他任何方法更新源代码都受到限制. 但这一限制并不适用于Javascript捆绑的更新.
这一限制不适用于在虚拟机中运行且对Android API有有限访问的代码(如网页视图或浏览器中的JavaScript).
这完全允许代码Push,因为它只是更新JS捆绑,无法更新本地代码部分.
应用程序存储
段 次 页 次 3.3.2 国家2015年代开始 苹果开发者程序许可协议 完全允许对 JavaScript 和资产进行空中更新 - 及其最新版本(20170605) 这里可下载 这一裁决更为宽泛:
被解释的代码可以下载到一个应用程序,但只能下载这样的代码:(a)不通过提供与提交App Store的应用程序的预期和广告目的不一致的特征或功能来改变应用程序的主要目的,(b)不为其他代码或应用程序创建商店或商店前端,(c)不绕过OS的签名,沙盒,或其他安全特征.
CodePush允许您完全遵守这些规则,只要您所推动的更新不会显著地偏离其App Store的最初批准意图.
为了进一步遵守苹果公司的准则,我们建议App Store分发的应用软件不能使用 updateDialog 选项 sync,因为 App Store 审查准则 它写道:
App不得强迫用户对App进行评分,审查App,下载其他App,或其他类似动作,以访问App的功能,内容,或使用.
情况不一定如此 updateDialog,因为它不会强迫用户下载新版本,但至少你应该知道,如果你决定显示它的话.
API 参考
调试/ 解决问题
这个 withCodePush编号 :sync 方法包括很多诊断记录的出箱,所以如果你在使用时遇到一个问题,那么首先尝试的最好办法是检查你的应用的输出日志. 这将告诉您该应用程序是否配置正确( 类似插件能否找到您的公共频道 ID ? ) , 如果该应用程序能够到达服务器, 如果正在发现可用的更新, 如果正在成功下载/ 安装更新等等 。 我们想继续改善伐木 尽可能直观和全面 所以请 告诉我们 如果你发现它 令人困惑或缺少任何东西.
启动 Chrome DevTools 控制台、 Xcode 控制台( iOS) 和/或 ADB logcat( Android) , 并查找前置信件 [CodePush]。 。 。 .
请注意, 默认情况下, React Industrial logs 在 iOS 构建中会被禁用, 因此, 如果您想要在 发布 构建中查看它们, 您需要做以下修改 AppDelegate.m 文件 :
-
添加一个
#import <React/RCTLog.h>语句 -
在您的顶部添加以下语句
application:didFinishLaunchingWithOptions方法 :RCTSetLogThreshold(RCTLogLevelInfo);
现在你可以在iOS或Android上看到调试或放出模式下的CodePush日志. 如果检查日志不能说明问题,请参考以下共同问题以补充解析想法:
| 问题/症状 | 可能的解决方案 |
|---|---|
| 编译出错 | 清理您的构建文件夹并双重检查您的版本 React Industrial 是 兼容 和您使用的代码Push版本. |
呼叫时网络超时/ 挂起 sync 或者说 checkForUpdate iOS 模拟器 | 尝试通过选择 Simulator -> Reset Content and Settings.. 菜单项目,然后重运行您的应用程序. |
服务器响应 a 404 调用时 sync 或者说 checkForUpdate | 重复检查您在您的公共频道中添加的 Info.plist (iOS), strings.xml 或者说 app/build.gradle (Android) 或者你正在传递给 sync编号 :checkForUpdate,事实上是正确的。 你们可以跑 appzung release-channels list 查看您的应用程序发布频道的正确公共ID. |
| 未发现更新 | 重复检查您运行的应用程序的版本( 如 1.0.0)匹配您在向 CodePush 发布更新时指定的版本。 此外, 请确定您正在将您的应用程序配置用于同步的同一发布频道释放 . |
| 重新启动后未显示更新 | 如果你没有使用与CodePush HOC或呼叫 sync 应用程序启动时( 如 componentDidMount ,然后需要明确调用 notifyAppReady 在应用程序启动时, 否则插件会认为您的更新失败并滚回 . |
| 我发布了iOS的更新,但我的Android应用程序也显示更新,它打破了它 | 确定每个平台的发布渠道不同,以便正确接收更新 |
| 我已经发布了新的更新,但是没有反映变化 | 请确定您正在运行非调试模式的应用程序 。 在调试模式下,React Industrial app总是下载由包机生成的JS捆,因此由CodePush下载的JS捆不适用. |
| 迁移到 AppZung 后 Android 编译失败, 错误“ 任务: app: check ReleaseAarMetadata FAILED ” 任务“ app: check ReleaseAarMetata” (类型“ CheckAarMetata Task ”) 的配置存在问题 . | 单位 android/settings.gradle 删除有关 CodePush 的行 。 一定要读另一个 移徙步骤 仔细检查你是否错过了其他人. |
appzung releases deploy-react-native pnpm 工作空间中的参数列表后“ 语法错误: 缺少 ” 失败 | 使用 --react-native-cli-path 指定 RN CLI JS 文件路径的旗帜 : --react-native-cli-path=./node_modules/react-native/cli.js |