Flutter使用脚本打包

Flutter使用脚本打包

#!/bin/sh

# 使用方法:
# step1: 将该脚本放在工程的根目录下(跟.xcworkspace文件or .xcodeproj文件同目录)
# step2: 根据情况修改下面的参数
# step3: 打开终端,执行脚本。(输入sh,然后将脚本文件拉到终端,会生成文件路径,然后enter就可)

# =============项目自定义部分(自定义好下列参数后再执行该脚本)=================== #

# 是否编译工作空间 (例:若是用Cocopods管理的.xcworkspace项目,赋值true;用Xcode默认创建的.xcodeproj,赋值false)
is_workspace="true"

# .xcworkspace的名字,如果is_workspace为true,则必须填。否则可不填
workspace_name=""

# .xcodeproj的名字,如果is_workspace为false,则必须填。否则可不填
project_name=""

# 指定项目的scheme名称(也就是工程的target名称),必填
scheme_name=""

# 指定要打包编译的方式 : Release,Debug。一般用Release。必填
build_configuration="Release"

# method,打包的方式。方式分别为 development, ad-hoc, app-store, enterprise 。必填
method="enterprise"


#  下面两个参数只是在手动指定Pofile文件的时候用到,如果使用Xcode自动管理Profile,直接留空就好
# (跟method对应的)mobileprovision文件名,需要先双击安装.mobileprovision文件.手动管理Profile时必填
mobileprovision_name=""

# 项目的bundleID,手动管理Profile时必填
bundle_identifier=""


echo "--------------------脚本配置参数检查--------------------"
echo "\033[33;1mis_workspace=${is_workspace} "
echo "workspace_name=${workspace_name}"
echo "project_name=${project_name}"
echo "scheme_name=${scheme_name}"
echo "build_configuration=${build_configuration}"
echo "bundle_identifier=${bundle_identifier}"
echo "method=${method}"
echo "mobileprovision_name=${mobileprovision_name} \033[0m"


# =======================脚本的一些固定参数定义(无特殊情况不用修改)====================== #

# 获取当前脚本所在目录
script_dir="$( cd "$( dirname "$0"  )" && pwd  )"
# 工程根目录
project_dir=$script_dir

# 时间
DATE=`date '+%Y%m%d_%H%M%S'`
# 指定输出导出文件夹路径
export_path="$project_dir/Package/$scheme_name-$DATE"
# 指定输出归档文件路径
export_archive_path="$export_path/$scheme_name.xcarchive"
# 指定输出ipa文件夹路径
export_ipa_path="$export_path/"
# 指定输出ipa名称
ipa_name="${scheme_name}_${DATE}"
# 指定导出ipa包需要用到的plist配置文件的路径
export_options_plist_path="$project_dir/ExportOptions.plist"


echo "--------------------脚本固定参数检查--------------------"
echo "\033[33;1mproject_dir=${project_dir}"
echo "DATE=${DATE}"
echo "export_path=${export_path}"
echo "export_archive_path=${export_archive_path}"
echo "export_ipa_path=${export_ipa_path}"
echo "export_options_plist_path=${export_options_plist_path}"
echo "ipa_name=${ipa_name} \033[0m"

# =======================自动打包部分(无特殊情况不用修改)====================== #

echo "------------------------------------------------------"
echo "\033[32m开始构建项目  \033[0m"
# 进入项目工程目录
cd ${project_dir}

# 指定输出文件目录不存在则创建
if [ -d "$export_path" ] ; then
    echo $export_path
else
    mkdir -pv $export_path
fi

# 判断编译的项目类型是workspace还是project
if $is_workspace ; then
# 编译前清理工程
xcodebuild clean -workspace ${workspace_name}.xcworkspace \
                 -scheme ${scheme_name} \
                 -configuration ${build_configuration}

xcodebuild archive -workspace ${workspace_name}.xcworkspace \
                   -scheme ${scheme_name} \
                   -configuration ${build_configuration} \
                   -archivePath ${export_archive_path}
else
# 编译前清理工程
xcodebuild clean -project ${project_name}.xcodeproj \
                 -scheme ${scheme_name} \
                 -configuration ${build_configuration}

xcodebuild archive -project ${project_name}.xcodeproj \
                   -scheme ${scheme_name} \
                   -configuration ${build_configuration} \
                   -archivePath ${export_archive_path}
fi

#  检查是否构建成功
#  xcarchive 实际是一个文件夹不是一个文件所以使用 -d 判断
if [ -d "$export_archive_path" ] ; then
    echo "\033[32;1m项目构建成功 🚀 🚀 🚀  \033[0m"
else
    echo "\033[31;1m项目构建失败 😢 😢 😢  \033[0m"
    exit 1
fi
echo "------------------------------------------------------"

echo "\033[32m开始导出ipa文件 \033[0m"


# 先删除export_options_plist文件
if [ -f "$export_options_plist_path" ] ; then
    #echo "${export_options_plist_path}文件存在,进行删除"
    rm -f $export_options_plist_path
fi
# 根据参数生成export_options_plist文件
/usr/libexec/PlistBuddy -c  "Add :method String ${method}"  $export_options_plist_path
/usr/libexec/PlistBuddy -c  "Add :provisioningProfiles:"  $export_options_plist_path
/usr/libexec/PlistBuddy -c  "Add :provisioningProfiles:${bundle_identifier} String ${mobileprovision_name}"  $export_options_plist_path


xcodebuild  -exportArchive \
            -archivePath ${export_archive_path} \
            -exportPath ${export_ipa_path} \
            -exportOptionsPlist ${export_options_plist_path} \
            -allowProvisioningUpdates

# 检查ipa文件是否存在
if [ -f "$export_ipa_path/$scheme_name.ipa" ] ; then
    echo "\033[32;1mexportArchive ipa包成功,准备进行重命名\033[0m"
else
    echo "\033[31;1mexportArchive ipa包失败 😢 😢 😢     \033[0m"
    exit 1
fi

# 修改ipa文件名称
mv $export_ipa_path/$scheme_name.ipa $export_ipa_path/$ipa_name.ipa

# 检查文件是否存在
if [ -f "$export_ipa_path/$ipa_name.ipa" ] ; then
    echo "\033[32;1m导出 ${ipa_name}.ipa 包成功 🎉  🎉  🎉   \033[0m"
    open $export_path
else
    echo "\033[31;1m导出 ${ipa_name}.ipa 包失败 😢 😢 😢     \033[0m"
    exit 1
fi

# 删除export_options_plist文件(中间文件)
if [ -f "$export_options_plist_path" ] ; then
    #echo "${export_options_plist_path}文件存在,准备删除"
    rm -f $export_options_plist_path
fi

# 输出打包总用时
echo "\033[36;1m使用AutoPackageScript打包总用时: ${SECONDS}s \033[0m"

exit 0


东方盛慧科技大约 3 分钟flutterflutterios
ChatGpt帮助解决滑动相关控件问题

ChatGpt帮助解决滑动相关控件问题

一、下面是问的几个问题

  1. nestedscrollview 中放入 column overflow
  2. nestedscrollview中放入CustomScrollView
  3. flutter CustomScrollview中放入PageView
  4. flutter pageview自适应高度
  5. NestedScrollview 中Container内部单独滑动
  6. NestedScrollView中的 Container内部单独滑动
  7. SingleChildScrollView 使用ConstrainedBox
  8. Expanded 中放入singlechildscrollview
  9. SingleChildScrollView中放入Html
  10. expanded 中放入singlechildscrollview
  11. nestedscrollview中放入 singlechildscrollview
  12. 如何利用NestedScrollView中的controller属性来控制子singlechildscrollview的滚动行为。
  13. nestedscrollview singlechildscrollview customscrollview区别
  14. CustomScrollview中放入PageView
  15. CustomScrollview 嵌套CustomScrollView
  16. SliverFillViewport 中放入TabbarView
  17. ScrollController not attached to any scroll views. 怎么解决
  18. ScrollController 需要释放吗
  19. 怎么知道ScrollController是否被附加到别的组件上

东方盛慧科技大约 17 分钟flutterflutterchatgpt
flutter桌面版库问题

flutter桌面版库问题

  1. toast 采用bottoast
  2. 代理不能使用 http_proxy_override
  3. webview没有官方的桌面版和web版
  4. video_player没有官方的桌面版和web版
  5. 下载库需要跨平台
  6. 版本升级问题待解决

2023-3-9日补充

  1. 桌面版webview可以使用desktop_webview_window
  2. 拖动文件到app中desktop_drop
  3. 创建windows可以使用bitsdojo_window
  4. 桌面端的可以使用flutter_window_close
  5. video_player暂时没找到解决方案,只有分开的各个

东方盛慧科技大约 2 分钟flutterflutter桌面版
解决flutter desktop 网络请求失败

解决flutter desktop 网络请求失败

使用了dio,模拟器和web都没问题,只有desktop不能调接口 需要在macos/Runner/DebugProfile.entitlements文件中添加com.apple.security.network.client。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>com.apple.security.app-sandbox</key>
	<true/>
	<key>com.apple.security.cs.allow-jit</key>
	<true/>
	<key>com.apple.security.network.server</key>
	<true/>
	<key>com.apple.security.network.client</key>
	<true/>
</dict>
</plist>


东方盛慧科技小于 1 分钟flutterflutter桌面版
Flutter桌面版屏幕适配

Flutter桌面版屏幕适配

class SizeChangesListener with WidgetsBindingObserver {
  @override
  void didChangeMetrics() {
    super.didChangeMetrics();
      ScreenUtil.init(
        BoxConstraints(
            maxWidth: width,//new width 
            maxHeight: height//new height
        ),
        designSize:Size(411.42857142857144, 683.4285714285714),
        orientation: Orientation.portrait,
      );
    print('changed size');
  }
}
void main() async {
  runApp(MyApp());
  if (Platform.isWindows || Platform.isLinux||Platform.isMacOS) {
    WidgetsBinding.instance!.addObserver(SizeChangesListener());
  }
}


东方盛慧科技小于 1 分钟flutterflutter桌面版
Flutter版本IOS兼容一:集成苹果登录

Flutter版本IOS兼容一:集成苹果登录

做个一个推广大师的App,第一个安卓版本基本完成,软著也已经下来,作为一个未曾真正开发过苹果app的开发人员,下面梳理整理一下针对Ios发布所做的相应兼容及功能添加

前期必须注册一个域名和服务器以及https证书部署 ios universal links填写需要,涉及三方登录和分享使用

功能范围

  1. 苹果登录(只要含有三方登录,苹果要求必须有苹果登录)
  2. 支付(只要有支付,苹果必须有kb支付)
  3. 推送功能集成
  4. 三方登录(未安装不能显示入口 否则审核会拒,配置universal links、scheme)
  5. 软著是否需要申请

东方盛慧科技大约 2 分钟flutterflutterios
Flutter开发踩坑经历

Flutter开发踩坑经历

  1. flutter混合开发时 有个库需要升级android 编译sdk到31,但是升到31 又不识别MODULE,gradle需要配置jdk11进行编译,但是compileOptions中的java_version 不能用11 得用8 (2022.06.23)
  2. 网络请求校验串实现
  3. 依赖库升级问题
  4. webview库不能首次加入cookie问题
  5. webview升级问题
  6. webview js交互问题
  7. android项目运行问题 .android目录需要指定kotlin版本
  8. ios运行启动崩溃问题,单例不好使,采用了强引用解决
  9. ios启动页面问题
  10. 极光推送sdk 代码混淆useProguard,得用customProxxxx,否则不支持主包7.0+的gradle,会报xxx.android()不匹配类型;修改发布私服的方式解决

东方盛慧科技小于 1 分钟flutterflutter
Flutter自定义库之四:三方库代码同步问题解决

Flutter自定义库之四:三方库代码同步问题解决

以flutter_html库为例

flutter_html依赖官方webview库,所以当自定义了webview库之后,flutter_html对webview的依赖地址也必须更换,同时需要及时更新代码,这样就需要一个flutter_html的私有库,既能小部分修改,又可以保持代码同步

  1. 私有地址:git@git.koolearn-inc.com:android/flutter_html.git
  2. 官方地址:git@github.com:Sub6Resources/flutter_html.git

东方盛慧科技小于 1 分钟flutterflutter
Flutter自定义库之三:官方库代码同步问题解决

Flutter自定义库之三:官方库代码同步问题解决

flutter官方库并不能完全满足需求,需要自定义,通常在某个时间点clone了官方库并自定义后,就完全脱离了官方库原有的代码更新,不能及时的同步官方更新和升级迭代,升级维护的重任彻底落在了自己身上,这显然是不现实的,本文就是要解决此问题。

思路: 本地仓库需要跟踪两个数据源, 修改官方仓库,但是又需要及时跟踪官方仓库;

重点:

  1. flutter官方插件仓库所有的库是在一个git工程下面,应该用的git 子库的方式维护,如下图webview_flutter所示,是官方仓库的子目录,所以本地git项目只跟踪指定目录,如有需要再打开指定目录 xx

东方盛慧科技大约 1 分钟flutterflutter
2