相关链接,如有需要请移步:
Flutter-已有iOS工程中加入Flutter之Cocoapods+Flutter环境方式集成
Flutter-已有iOS工程中加入Flutter之远程Pod产物方式集成
Flutter-远程Pod集成Flutter脚本优化
最近,我研究了下不依赖flutter开发环境的方式集成,推送到远程pod仓库,以Framework形式在cocoapods中集成。
开始
1. 创建flutter_module:flutter create -t module flutter_module
KKdeMacBook-Pro:remotepod kaye$ flutter create -t module flutter_module
Creating project flutter_module... androidx: true
flutter_module/test/widget_test.dart (created)
flutter_module/flutter_module.iml (created)
flutter_module/.gitignore (created)
flutter_module/.metadata (created)
flutter_module/pubspec.yaml (created)
flutter_module/README.md (created)
flutter_module/lib/main.dart (created)
flutter_module/flutter_module_android.iml (created)
flutter_module/.idea/libraries/Flutter_for_Android.xml (created)
flutter_module/.idea/libraries/Dart_SDK.xml (created)
flutter_module/.idea/modules.xml (created)
flutter_module/.idea/workspace.xml (created)
Running "flutter pub get" in flutter_module... 1.7s
Wrote 12 files.
All done!
Your module code is in flutter_module/lib/main.dart.
添加依赖库,比如:
dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^0.1.2
shared_preferences: ^0.5.6
运行flutter pub get
安装依赖库
KKdeMacBook-Pro:flutter_module kaye$ flutter pub get
Running "flutter pub get" in flutter_module... 0.4s
KKdeMacBook-Pro:flutter_module kaye$
build获取产物
KKdeMacBook-Pro:flutter_module kaye$ flutter build ios --debug --no-codesign
Warning: Building for device with codesigning disabled. You will have to manually codesign
before deploying to device.
Building com.example.flutterModule for device (ios)...
Running Xcode build...
├─Assembling Flutter resources... 6.8s
└─Compiling, linking and signing... 4.5s
Xcode build done. 17.6s
Built /Users/kaye/Desktop/remotepod/flutter_module/build/ios/iphoneos/Runner.app.
产物路径:
我们先将各个产品,手动copy出来,放到一个文件夹ios_frameworks
中备用。
note:这里我们先不用脚本,手动获取,验证一下pod能不能成功
2. 创建Pod:pod lib create KKFlutterPod
KKdeMacBook-Pro:remotepod kaye$ pod lib create KKFlutterPod
Cloning `https://github.com/CocoaPods/pod-template.git` into `KKFlutterPod`.
Configuring KKFlutterPod template.
------------------------------
To get you started we need to ask a few questions, this should only take a minute.
If this is your first time we recommend running through with the guide:
- https://guides.cocoapods.org/making/using-pod-lib-create.html
( hold cmd and double click links to open in a browser. )
What platform do you want to use?? [ iOS / macOS ]
> ios
What language do you want to use?? [ Swift / ObjC ]
> objc
Would you like to include a demo application with your library? [ Yes / No ]
> no
Which testing frameworks will you use? [ Specta / Kiwi / None ]
> none
Would you like to do view based testing? [ Yes / No ]
> no
What is your class prefix?
> KK
Running pod install on your new library.
Analyzing dependencies
Fetching podspec for `KKFlutterPod` from `../`
Downloading dependencies
Installing KKFlutterPod (0.1.0)
Generating Pods project
Integrating client project
[!] Please close any current Xcode sessions and use `KKFlutterPod.xcworkspace` for this project from now on.
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
[!] Automatically assigning platform `ios` with version `9.3` on target `KKFlutterPod_Tests` because no platform was specified. Please specify a platform for this target in your Podfile. See `https://guides.cocoapods.org/syntax/podfile.html#platform`.
Ace! you're ready to go!
We will start you off by opening your project in Xcode
open 'KKFlutterPod/Example/KKFlutterPod.xcworkspace'
To learn more about the template see `https://github.com/CocoaPods/pod-template.git`.
To learn more about creating a new pod, see `http://guides.cocoapods.org/making/making-a-cocoapod`.
KKdeMacBook-Pro:remotepod kaye$
将上一步的ios_frameworks
文件夹移动到Pod仓库中,目录结构如下:
3. 创建远程Pod对应的Git仓库
3.1 创建仓库
这里自己测试使用的是GitHub,创建过程就不描述了。
3.2 关联仓库
tip:或者你也可以先把远程的Pod仓库创建好,clone下来,然后把创建的KKFlutterPod里面除了.git之外的所有文件拷贝到你clone的git仓库中,从而省去关联的关系
KKdeMacBook-Pro:flutter_module kaye$ cd ../KKFlutterPod/
KKdeMacBook-Pro:KKFlutterPod kaye$ git remote add origin https://github.com/yuyangkk/flutterpod.git
修改KKFlutterPod.podsepc
文件,在其末尾添加如下:
s.static_framework = true
p = Dir::open("ios_frameworks")
arr = Array.new
arr.push('ios_frameworks/*.framework')
s.ios.vendored_frameworks = arr
3.3 提交Pod到远程
git add .
git commit -m "初始化"
git pull origin master
git push -u origin master
git tag -m "v0.1.0" -a 0.1.0
git push --tags
3.4 使用
pod 'KKFlutterPod', :git => 'https://github.com/yuyangkk/KKFlutterPod.git'
4. 脚本化
每次我们修改了flutter代码,都要重新打包出来Framework,然后打上tag推送到远程,这个过程虽然简单,但是重复性很强,所以考虑写成脚本实现,以免有漏掉某些步骤!
ps:脚本有点不太规范,是一边看语法,一遍写的,所以,有问题还请指出来
4.1. 编译Framework并导出到指定位置
#cd ~/Desktop/remotepod/flutter_module
#获取当前脚本目录
projectURL=$(cd $(dirname $0); pwd)
#echo $projectURL
cd ${projectURL}
#out是指将编译号的文件copy到指定的位置的路径
if [ -z $out ]; then
out='../KKFlutterPod/KKFlutterPod/ios_frameworks'
fi
echo "准备输出所有文件到目录: $out"
echo "清除所有已编译文件"
#find . -d -name build | xargs rm -rf
flutter clean
rm -rf $out
rm -rf build
flutter packages get
echo "编译flutter"
flutter build ios --debug --no-codesign
#如果是release包,将debug改为release
#flutter build ios --release --no-codesign
echo "编译flutter完成"
mkdir $out
cp -r build/ios/Debug-iphoneos/*/*.framework $out
cp -r .ios/Flutter/App.framework $out
cp -r .ios/Flutter/engine/Flutter.framework $out
#本地Pod库中提交代码,并修改version,打上标签,标签和version保持一致,自增
#上传到pod,请执行脚本push_pod_spec.sh
4.2. 将导出的Framework上传到远程pod仓库
projectURL=$(cd $(dirname $0); pwd)
#echo $projectURL
cd ${projectURL}
cd ../KKFlutterPod
echo "准备更新本地仓库"
git pull
if [ $? -eq 0 ]; then
echo "拉取远程代码成功"
else
echo "拉取远程代码失败"
exit 1
fi
cd ${projectURL}
#修改KKFlutterPod.podspec中s.version = '0.1.0'
# 读取KKFlutterPod.podspec的第11行
# a=`cat KKFlutterPod.podspec |head -ne12`
# echo $a
a=`sed -n 11p KKFlutterPod.podspec `
# echo $a #s.version = '0.1.4'
# echo "删除最右边.开始向及其左边的数据"
vs=${a##*.}
# echo $vs
oldNum=${vs%%\'*}
# echo '当前版本:'$oldNum
newNum=$((oldNum+1))
# echo '新版本:'$newNum
# echo "替换版本号"
v=0.1.$newNum
version=" s.version = '$v'"
echo $version
sed -i '' "s/$a/$version/" KKFlutterPod.podspec
# echo "add 并且commit"
# git status
git rm --cached
git add .
git commit -m "修改版本$v"
# echo "添加tag"
git tag -a $v -m "$v"
# echo "连同tag推送到远程"
git push
git push --tags
自此,差不多应该可以跑起来,run一下试试,如果遇见build错误,请查看一下Xcode的bitcode是否打开了,如果打开请关闭。
5. 问题
5.1 undefined symbol:OBJC_CLASS$_GeneratedPluginRegistrant
这个问题,是因为导出的包是不支持模拟器的,因为通过flutter开发环境导出的包,是可以支持模拟器的,所以猜测是我写的脚本有问题,等待后续优化下,目前是只支持真机。
5.2 有关Framework包的大小
通过flutter build ios-framework --output=导出包路径
,获取到debug、profile、release三种情况下的包,其中包含的Flutter.framework的包大小分别是95MB、66.8MB、369.8MB,如果用release的包,推送到远程pod库的时候,会超过git的100MB限制,可能会失败,所以我们暂时只用了debug模式下的包,推送到远程。
当然也有可能是我使用的命令有缺陷,如果有什么可以解决release环境下,包过大的问题,请务必留言给我,感谢~~~
错误待续。。。