在 Flutter iOS 开发中,我们经常会遇到以下场景:
在这种情况下,从 App Store 下载的正式版 App 和开发环境安装的 App 会相互覆盖,并且共用同一个 SQLite 文件,导致数据混合。
大部分时间我们使用模拟器调试,不会遇到这个问题。但当需要真机调试时,我们必须将两个环境隔离开来,避免数据混乱。
更重要的是,我们有时需要删除应用来测试初始化功能,如果数据混合就无法准确测试。
为了解决这个问题,我们需要为开发环境和生产环境设置不同的 Bundle ID,这样就可以在同一台手机上看到多个不同环境的相同 App。
这里我只展示两个,一个是真实发布的 Bundle ID,一个对应的是开发环境的 Bundle ID。
在开始配置之前,请确保你已经准备好以下环境:
下面我们开始设置 Xcode,配置不同环境对应不同的 Bundle ID。
首先打开我们的 Flutter 工程的 iOS 文件,使用 Xcode 打开。
我们可以看到最上面的正中间有一个 Runner。
这个在 Xcode 里面称为 Scheme。不同的 Scheme 会对应一个不同的打包逻辑,我们在 Flutter build iOS 的时候就可以通过指定 Scheme 的名字来实现不同的打包流程。
那我们如果不指定 Scheme 的话,它默认的就是第一个 Runner。
接着左边点一下 Runner 这个 Menu,然后点击里面 Project 下面的 Runner,继续点击 Info。
在 Configuration 模块我们可以看到 Debug/Release/Profile 分别对应不同环境下打包的一些参数。
我们在开发的时候就是默认 Debug,我们在发布的话默认就是 Release。
目前这里的 Debug、Release 和 Profile 它们配置的 Bundle ID 都是一个,所以你在开发环境使用调试,如果你发布到 App Store 里面再下载下来,就会覆盖你开发环境安装的应用,反之同理。
接着我们在 Configuration 模块,点击加号,选择 Duplicate Debug、Release。
然后我们再给它们分别改名,改叫 Debug_dev、Release_dev。
接着我们往左边看,看到 Project 下面有一个 Targets,Targets 我们依旧点击 Runner。
点击 Runner 之后我们可以看到上面的 Tab 有很多东西,接着我们点击 Build Settings。
接着点击加号,然后添加一个环境变量 APP_DISPLAY_NAME,根据不同 Build Configuration,设置不一样的名字。
注意这里只是注册了一个变量,并不会真正改变打包后的应用名字,我们还需要在 info.plist 里面进行修改。
现在我们在 Xcode 里面打开 Info.plist,然后找到 Bundle display name,修改其 value 如图所示,改成刚刚添加的变量名 $(APP_DISPLAY_NAME)
我们现在开始为不同的配置设置不同的 Bundle ID。点击旁边的 Targets → Runner,然后点击 General。
之后我们再去看到下面有个 Identity,我们看到有个 Bundle Identifier,然后旁边有一个箭头,我们点击一下。
点进去后,会看到有不同的 Bundle Identifier 配置项,我们为每个环境填入不同的 Bundle ID 即可。
Flutter 可以通过 --flavor 命令来调用不同的 Scheme,也就是我们最开始说过的。
我们只需要创建一个新的 Scheme 来对应新的 Configuration 就好了。
我们点击 Manage Scheme。
点击右下角的加号。
选择默认的 Runner,然后我们输入新的名字,比如 dev,然后点击 OK 创建。
然后我们退出来之后,我们再点击 Runner,点击 Edit Scheme。
我们先选择我们刚刚创建的 Scheme。
接着我们点击左边的 Run,Build Configuration 改成 Debug_dev。
下面的 Archive 也是一样的,切换成 Release_dev。
到现在为止,Xcode 的配置全部完毕。
为了方便在开发时切换不同的环境,我们需要在 VSCode 中配置不同的启动命令。
找到 VSCode 的 Debug 页面,点击这个设置按钮开始配置运行命令。
可以直接复制以下配置:
解释一下命令 --flavor dev
,这个是用来区分不同环境的,dev 对应的是 Scheme 的名字,如果没有指定就是默认的 Runner。
在打包的时候记住如果要区分也要指定 --flavor dev
:
通过以上配置,我们成功实现了在同一台 iOS 设备上安装不同环境的同一应用。主要步骤包括:
通过这种方式,我们就能有效避免开发环境和生产环境的数据混合问题,在同一台设备上安全地进行多环境测试。