(window.webpackJsonp=window.webpackJsonp||[]).push([[119],{461:function(t,s,a){"use strict";a.r(s);var e=a(14),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"一、概述"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#一、概述"}},[t._v("#")]),t._v(" 一、概述")]),t._v(" "),s("p",[t._v("近期将测试机升级至 "),s("code",[t._v("iOS14")]),t._v(" ，测试使用 "),s("code",[t._v("Flutter混合开发")]),t._v(" 的线上 "),s("code",[t._v("APP")]),t._v("，没发现什么问题，但是使用 "),s("code",[t._v("Xcode")]),t._v(" 安装"),s("code",[t._v("APP")]),t._v("的场景下，断开 "),s("code",[t._v("Xcode")]),t._v(" 后再运行却闪退了。")]),t._v(" "),s("p",[t._v("公司的 "),s("code",[t._v("APP")]),t._v(" 测试结果如下：")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("APP来源")]),t._v(" "),s("th",[t._v("是否闪退")]),t._v(" "),s("th",[t._v("模式")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("线上")]),t._v(" "),s("td",[t._v("否")]),t._v(" "),s("td",[t._v("release")])]),t._v(" "),s("tr",[s("td",[t._v("蒲公英")]),t._v(" "),s("td",[t._v("是")]),t._v(" "),s("td",[t._v("debug")])]),t._v(" "),s("tr",[s("td",[t._v("Xcode")]),t._v(" "),s("td",[t._v("是（断开 "),s("code",[t._v("Xcode")]),t._v(" 后再打开 "),s("code",[t._v("APP")]),t._v(" ）")]),t._v(" "),s("td",[t._v("debug")])])])]),t._v(" "),s("h3",{attrs:{id:"问题原因"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#问题原因"}},[t._v("#")]),t._v(" 问题原因")]),t._v(" "),s("p",[t._v("闪退的原因是因为 "),s("code",[t._v("Flutter SDK")]),t._v(",  "),s("code",[t._v("Flutter")]),t._v(" 官方的更新速度也是快，对 "),s("code",[t._v("iOS14")]),t._v(" 进行了说明：  "),s("a",{attrs:{href:"https://flutter.dev/docs/development/ios-14",target:"_blank",rel:"noopener noreferrer"}},[t._v("Flutter官网说明链接"),s("OutboundLink")],1)]),t._v(" "),s("p",[t._v("大致意思就是说，如果我们在 "),s("code",[t._v("iOS14")]),t._v(" 的真机上安装了 "),s("code",[t._v("debug模式")]),t._v(" 编译出来的 "),s("code",[t._v("flutter")]),t._v(" 应用，那么在断开编译安装连接后，将无法从桌面上打开该应用程序。")]),t._v(" "),s("h3",{attrs:{id:"解决方案"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#解决方案"}},[t._v("#")]),t._v(" 解决方案")]),t._v(" "),s("ol",[s("li",[t._v("再次是使用 "),s("code",[t._v("Xcode")]),t._v(" 或 "),s("code",[t._v("flutter run")]),t._v(" 来运行。")]),t._v(" "),s("li",[t._v("设置 "),s("code",[t._v("Flutter")]),t._v(" 模块的编译模式为 "),s("code",[t._v("profile")]),t._v(" 或 "),s("code",[t._v("release")])])]),t._v(" "),s("h3",{attrs:{id:"补充说明"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#补充说明"}},[t._v("#")]),t._v(" 补充说明")]),t._v(" "),s("ol",[s("li",[t._v("该闪退的情况只发生在真机，并且在模拟器运行的时候， "),s("code",[t._v("Flutter")]),t._v(" 模块的编译模式需要为 "),s("code",[t._v("debug")]),t._v("， 如果设置了 "),s("code",[t._v("release")]),t._v("，编译将会报错。")]),t._v(" "),s("li",[t._v("官方指出如果是 "),s("code",[t._v("纯Flutter项目")]),t._v(" 可以直接使用 "),s("code",[t._v("master channel")]),t._v(" 的 "),s("code",[t._v("Flutter版本")]),t._v(" 秒杀这个问题，但对混合开发并没有该说明，加上我们是使用闲鱼的 "),s("code",[t._v("flutter_boost")]),t._v(" 实现的混合开发，限制了 "),s("code",[t._v("Flutter")]),t._v(" 的版本，所以我也就没有去实践该方案对我们是否可行")])]),t._v(" "),s("h2",{attrs:{id:"二、尝试解决"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#二、尝试解决"}},[t._v("#")]),t._v(" 二、尝试解决")]),t._v(" "),s("p",[t._v("根据自己的实际情况，我选择了上述的第二个解决方案。")]),t._v(" "),s("h3",{attrs:{id:"配置"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置"}},[t._v("#")]),t._v(" 配置")]),t._v(" "),s("p",[t._v("用 "),s("code",[t._v("Xcode")]),t._v(" 打开工程项目，在 "),s("code",[t._v("Build Settings")]),t._v(" 的最下方找到 "),s("code",[t._v("User-Defined")]),t._v("，点击 "),s("code",[t._v("+")]),t._v(" 按钮，添加一个键为 "),s("code",[t._v("FLUTTER_BUILD_MODE")]),t._v(" ，值为 "),s("code",[t._v("release")]),t._v(" 的配置。")]),t._v(" "),s("p",[s("img",{attrs:{src:"https://cdn.jsdelivr.net/gh/FullStackAction/PicBed@resource/image/20210110221341.png",alt:""}})]),t._v(" "),s("p",[s("img",{attrs:{src:"https://cdn.jsdelivr.net/gh/FullStackAction/PicBed@resource/image/20210110221358.png",alt:""}})]),t._v(" "),s("h3",{attrs:{id:"运行"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#运行"}},[t._v("#")]),t._v(" 运行")]),t._v(" "),s("p",[t._v("再次运行到真机上，断开 "),s("code",[t._v("Xcode")]),t._v(" 运行也不会崩溃了")]),t._v(" "),s("h3",{attrs:{id:"问题"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#问题"}},[t._v("#")]),t._v(" 问题")]),t._v(" "),s("p",[t._v("真机的问题看似是解决了，但是会有问题")]),t._v(" "),s("p",[t._v("问题一："),s("code",[t._v("release")]),t._v(" 或 "),s("code",[t._v("profile")]),t._v(" 模式下，"),s("code",[t._v("Flutter")]),t._v(" 使用的是 "),s("code",[t._v("AOT")]),t._v("，一些功能不能使用，如：代码断点调试，热重载")]),t._v(" "),s("p",[t._v("问题二：上面也提到了，模拟器只能运行在 "),s("code",[t._v("debug")]),t._v(" 模式下，而我们无法避免会在真机和模拟器之间反复切换运行，每次切换就需要手动调整 "),s("code",[t._v("FLUTTER_BUILD_MODE")]),t._v(" 的值，十分麻烦")]),t._v(" "),s("p",[t._v("那有什么好的办法解决上面遇到的问题呢？")]),t._v(" "),s("h2",{attrs:{id:"三、优化方案"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#三、优化方案"}},[t._v("#")]),t._v(" 三、优化方案")]),t._v(" "),s("p",[t._v("其实，真机上的 "),s("code",[t._v("APP")]),t._v(" 在断开 "),s("code",[t._v("Xcode")]),t._v(" 后无法运行，这个对我们开发者来说不是什么问题，问题是给到测试人员就必须要可以打开才行，包括蒲公英上的包，所以为了节省这些不必要的时间，我们需要自己动手撸一个帮助我们切换 "),s("code",[t._v("Flutter编译模式")]),t._v(" 的脚本。")]),t._v(" "),s("p",[t._v("在修改 "),s("code",[t._v("FLUTTER_BUILD_MODE")]),t._v(" 的值时，我从 "),s("code",[t._v("git")]),t._v(" 中发现，实际上是修改了 "),s("code",[t._v("项目.xcodeproj")]),t._v("，那目前有什么工具可以帮助我们修改 "),s("code",[t._v("xcodeproj")]),t._v(" 文件呢？")]),t._v(" "),s("p",[t._v("这里我找到了"),s("a",{attrs:{href:"https://github.com/kronenthaler/mod-pbxproj",target:"_blank",rel:"noopener noreferrer"}},[t._v("mod-pbxproj"),s("OutboundLink")],1),t._v("，安装和使用在该库的 "),s("code",[t._v("wiki")]),t._v(" 上写的很清楚，这里就不再赘述了，直接上代码")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" getopt\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" sys\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" pbxproj "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" XcodeProject\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" __name__ "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"__main__"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n    argv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("argv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n    "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 处理flutter_build_mode")]),t._v("\n    flutter_build_mode "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("False")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"release"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n    "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# target名称")]),t._v("\n    target_name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("None")]),t._v("\n\n    "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n        opts"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" args "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" getopt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("getopt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("argv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"p:m:t:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"path=, mode=, target="')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n    "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("except")]),t._v(" getopt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("GetoptError"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n        "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('\'switch_flutter_build_mode.py -p "plist文件路径" -m "模式(release|debug)" -t "target名称"\'')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n        sys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("exit"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n    "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" opt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arg "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" opts"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n        "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" opt "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-p"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"--path"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n            project_path "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arg\n            "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("len")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("project_path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n                "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'请输入项目的地址'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n                sys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("exit"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n        "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" opt "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-m"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"--mode"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n            flutter_build_mode "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("True")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arg "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("len")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("arg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"release"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n        "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" opt "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-t"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"--target"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n            target_name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" arg\n\n    "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 处理flutter")]),t._v("\n    "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" flutter_build_mode"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n        fileName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" project_path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("split"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n        "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("not")]),t._v(" fileName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("endswith"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"xcodeproj"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n            "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"请使用-p指定.xcodeproj文件的路径"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n            sys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("exit"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n        project "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" XcodeProject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("load"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("project_path "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'/project.pbxproj'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n        "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 设置 User-Defined (如果target_name是None，则每个target都会设置flag)")]),t._v("\n        project"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("set_flags"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'FLUTTER_BUILD_MODE'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" flutter_build_mode"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" target_name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n        project"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("save"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("使用也很简单，终端直接输入如下命令")]),t._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[t._v("python switch_flutter_build_mode.py "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'xxx/项目.xcodeproj'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-t")]),t._v(" target名称 "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-m")]),t._v(" release\n")])])]),s("p",[t._v("各参数说明")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("参数")]),t._v(" "),s("th",[t._v("用途")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("-p")]),t._v(" "),s("td",[s("code",[t._v("xcodeproj")]),t._v(" 文件的路径")])]),t._v(" "),s("tr",[s("td",[t._v("-t")]),t._v(" "),s("td",[s("code",[t._v("target")]),t._v(" 名称")])]),t._v(" "),s("tr",[s("td",[t._v("-m")]),t._v(" "),s("td",[t._v("编译模式 ( "),s("code",[t._v("release")]),t._v("、"),s("code",[t._v("debug")]),t._v("、"),s("code",[t._v("profile")]),t._v(" )")])])])]),t._v(" "),s("p",[t._v("PS: 脚本基于 "),s("code",[t._v("Python3")])]),t._v(" "),s("p",[t._v("我们是使用 "),s("code",[t._v("Jenkins")]),t._v(" 进行打包并自动上传至蒲公英的，所以只需要在 "),s("code",[t._v("Jenkins")]),t._v(" 中配置打包前调用该脚本即可。")]),t._v(" "),s("p",[t._v("最后再结合 "),s("a",{attrs:{href:"http://fitztrev.github.io/shuttle/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Shuttle"),s("OutboundLink")],1),t._v(" 这个软件，就可以实现以界面的方式去切换编译模式了")]),t._v(" "),s("p",[s("img",{attrs:{src:"https://cdn.jsdelivr.net/gh/FullStackAction/PicBed@resource/image/20210110221411.png",alt:""}})]),t._v(" "),s("h2",{attrs:{id:"四、最后说两句"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#四、最后说两句"}},[t._v("#")]),t._v(" 四、最后说两句")]),t._v(" "),s("p",[t._v("本文是基于 "),s("code",[t._v("Flutter混合开发")]),t._v(" 进行说明的，如果有什么不对或不足的地方，欢迎指正，感谢大家的阅读")])])}),[],!1,null,null,null);s.default=n.exports}}]);