From 2078407608422d80150388b5f8582e8aa931a882 Mon Sep 17 00:00:00 2001 From: cyan Date: Mon, 17 Feb 2025 14:53:10 +0100 Subject: [PATCH] Migrate to .xcframework (#2006) * add libmd to linked libraries * ios 16 fixes, new moneroc, simulator support * update app version [skip ci] * update monero.com as well [skip ci] * migrate away from {Monero,Wownero,Zano}Wallet.framework Generate .xcframework dynamically Fix mweb requiring manual steps in xcode * fix app_config.sh when .dylib are not yet present * fix typo in model_generator.sh --------- Co-authored-by: OmarHatem --- cw_mweb/ios/.gitignore | 4 +- cw_mweb/ios/cw_mweb.podspec | 3 +- ios/.gitignore | 1 + ios/MoneroWallet.framework/Info.plist | Bin 793 -> 0 bytes ios/Runner.xcodeproj/project.pbxproj | 28 ++-- ios/WowneroWallet.framework/Info.plist | Bin 811 -> 0 bytes ios/ZanoWallet.framework/Info.plist | Bin 802 -> 0 bytes ios/monero_libwallet2_api_c.dylib | 1 - ios/wownero_libwallet2_api_c.dylib | 1 - ios/zano_libwallet2_api_c.dylib | 1 - model_generator.sh | 2 +- scripts/ios/app_config.sh | 3 +- scripts/ios/app_env.sh | 8 +- scripts/ios/build_monero_all.sh | 14 +- scripts/ios/build_mwebd.sh | 2 +- scripts/ios/gen_framework.sh | 182 ++++++++++++++++++++----- tool/download_moneroc_prebuilds.dart | 1 + 17 files changed, 184 insertions(+), 67 deletions(-) delete mode 100644 ios/MoneroWallet.framework/Info.plist delete mode 100644 ios/WowneroWallet.framework/Info.plist delete mode 100644 ios/ZanoWallet.framework/Info.plist delete mode 120000 ios/monero_libwallet2_api_c.dylib delete mode 120000 ios/wownero_libwallet2_api_c.dylib delete mode 120000 ios/zano_libwallet2_api_c.dylib diff --git a/cw_mweb/ios/.gitignore b/cw_mweb/ios/.gitignore index 0c885071e..7912ef55a 100644 --- a/cw_mweb/ios/.gitignore +++ b/cw_mweb/ios/.gitignore @@ -35,4 +35,6 @@ Icon? /Flutter/Generated.xcconfig /Flutter/ephemeral/ -/Flutter/flutter_export_environment.sh \ No newline at end of file +/Flutter/flutter_export_environment.sh + +Mwebd.xcframework \ No newline at end of file diff --git a/cw_mweb/ios/cw_mweb.podspec b/cw_mweb/ios/cw_mweb.podspec index 4a1903bae..19857c5ee 100644 --- a/cw_mweb/ios/cw_mweb.podspec +++ b/cw_mweb/ios/cw_mweb.podspec @@ -16,11 +16,12 @@ A new Flutter plugin project. s.source_files = 'Classes/**/*' s.dependency 'Flutter' s.platform = :ios, '11.0' + s.libraries = 'resolv' # Flutter.framework does not contain a i386 slice. s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } s.swift_version = '5.0' - s.ios.vendored_frameworks = 'Mwebd.xcframework' + s.vendored_frameworks = 'Mwebd.xcframework' s.preserve_paths = 'Mwebd.xcframework/**/*' end diff --git a/ios/.gitignore b/ios/.gitignore index 4f85acc8d..87057e358 100644 --- a/ios/.gitignore +++ b/ios/.gitignore @@ -32,3 +32,4 @@ Runner/GeneratedPluginRegistrant.* !default.perspectivev3 Mwebd.xcframework +*Wallet.xcframework \ No newline at end of file diff --git a/ios/MoneroWallet.framework/Info.plist b/ios/MoneroWallet.framework/Info.plist deleted file mode 100644 index 8858589f7070c754a01b0519387f9cab5f664005..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 793 zcmZXQ&rcIU6vtUcNFuadk3vEj@Mp#?9$l6SH&kckVuTD5sjMYb$}%;&g-9bW<~Q zZM}D^YevHoE&4RdtOSg=OldOi)#x7O!nLX6S7?U`$CO6nT8(<$D3gq+BC&RuLrZ$} z+R}_NCw^OacJCKcO2$~3Si7V{jeR%FrsAx=BRs!9QTILObWRro*A2_G6_4zi(o{?q zoVL)I<%d#;xBpMnSX|G)pjP0MZQfgPRoE`$)H9`YwNRnY1Lo0IxFoaaDsjm+HkkGv_d;rn^AA8S~!N+h|T!EDJ4$U?sLt)zkO#Du`Hc+9O4IFXu{|T z6m>O=!l9n16V9pMWbRJ*6kT;$&Km0Cf>O(<`HZSmsPjavWft<8Otuj>8EeJ*x~|H~ z;Y@>-dtgb|mt@71W-MXL#C189!&_uRSLS@rmMu=4j;xx>;q5B%?4|IRh)DH_w(tcP z)~+X?7WL`geF;lo^fcAg#e7D|5@;n~s#4=rimJ4sc9VcYt*J9fhK@bPu>)Q3 z1uR$~A=C{j5@LbGiXDHzhEG7OSn>lbaNL+uF`Ikm-h0kH_iTHDw*poDPDU^s>p6bn zWa`xE-ZOn?`^muI(D1pD^A|?P#wR8(Ub=kc>h!gl*&8?SD0j!I*_GwctqHb99ri#s z4Sltfm36aX%NlzaSC&IAY8DwyW_8wPLV6B!gALZ;(zQr`(kn5)6<3C0RDs$}?y_|w z{%z@IQP7|+eW$aPR>hJy)HJJ2s&zKzsbX#;z%u2`Og83Gi*vxORCn5J)Ejp6hEK5DQ%>@rQ zi|9##yW9z#b>n}=d@Ztr*E#dIHuDGI73y%YYmtG&v%9!z*Wa$Q1BonyH(VNoeq=)b zAt;`DRF+R&=F2h_f(2FXHKogBOIuVjrZzvPmeN`-t*IN#y|0zhbGdXnQ%Q!*l|p&d z&=hrls=|vM;JRTfDC$v8i%i+lQK;t$rbJonNlOu;?I^aOZbQ*5b^rP%^__)iXN0%N zcn49JffUl-@s%SQ-`%=RFafh8v8>JK(rShpOG`^Ag%**H)=&vi^c=lJ@6l)U75&6L zcpBfsI<|2ezrcI=6aIp~;UD-H{tXyX&&~^6+hK%PTGn33Ny%gom`ujD*nKY3~eIZhLE|C9?1j zXbf@V!i5PWZe6+aAGq-+7*}rm18$6+G8Gc<=A3)Z`M&d=uNDa2j8yeI>BDfUqx1Bc z+}W;k=Pz9BCi$M;OPBku^bZuS4h~%#zJ6nLZ2ac!J9i%_4-1>~3v;pW3bsr=_SCRU zW3iQ046Eu$mu;k#xtI&rCIi{5!FHLDfyex4jWxLRZPK0f$}DWAmEIJ!M4fH!vlTP_ zZ5h_8piy0hUTcd@dNbH6b#`cjS$jcJEo4=5TZU1a(TqawH%>O=AV}KG%_y5T8Oo3) zzb*~#M2Qp{?)?+hll6-)m=i~|CR!)XOE2Jpg*F*nFRiiXF%OxW9LXIvPXk)xf=8Ss z^kj+q+>5;x^MA&Yo7lnYoP}HKr6ceH^|;uxN&fikHg2=+Z`;{?Cd=dvpGI+*n9zL; zN~bn9s4pv22o`PfU|af3HnkaL($c0T)UvJ>bxmDk{u8aNPZV{1vYHK93rm$nQ&ZG~ zkt$zp0ar|OT2W6B+GNC$oNgb4Ru68i)6knv7A9bu^tTXo z8A&0XolrSecX;nU!33<9xQaGa)YVC9&d$!F9GXD}T1I6=(Mzc!zhe{0y;c~8o2NbB)oz*un%wH9ehCP O1AG*b+K%l2hkpS-#`e7c diff --git a/ios/monero_libwallet2_api_c.dylib b/ios/monero_libwallet2_api_c.dylib deleted file mode 120000 index 528ecd4a3..000000000 --- a/ios/monero_libwallet2_api_c.dylib +++ /dev/null @@ -1 +0,0 @@ -../scripts/monero_c/release/monero/aarch64-apple-ios_libwallet2_api_c.dylib \ No newline at end of file diff --git a/ios/wownero_libwallet2_api_c.dylib b/ios/wownero_libwallet2_api_c.dylib deleted file mode 120000 index 35e4e98e9..000000000 --- a/ios/wownero_libwallet2_api_c.dylib +++ /dev/null @@ -1 +0,0 @@ -../scripts/monero_c/release/wownero/aarch64-apple-ios_libwallet2_api_c.dylib \ No newline at end of file diff --git a/ios/zano_libwallet2_api_c.dylib b/ios/zano_libwallet2_api_c.dylib deleted file mode 120000 index 767071f7d..000000000 --- a/ios/zano_libwallet2_api_c.dylib +++ /dev/null @@ -1 +0,0 @@ -../scripts/monero_c/release/zano/aarch64-apple-ios_libwallet2_api_c.dylib \ No newline at end of file diff --git a/model_generator.sh b/model_generator.sh index c43f60a31..f3950e2b1 100755 --- a/model_generator.sh +++ b/model_generator.sh @@ -10,7 +10,7 @@ do bash -c "cd $cwcoin; flutter pub get; dart run build_runner build --delete-conflicting-outputs; cd .." fi done -for cwcoin in cw_{polygon,ethereum,mwebd}; +for cwcoin in cw_{polygon,ethereum,mweb}; do if [[ "x$1" == "xasync" ]]; then diff --git a/scripts/ios/app_config.sh b/scripts/ios/app_config.sh index 35bbe7b74..d118370b5 100755 --- a/scripts/ios/app_config.sh +++ b/scripts/ios/app_config.sh @@ -10,8 +10,7 @@ if [ -z "$APP_IOS_TYPE" ]; then echo "Please set APP_IOS_TYPE" exit 1 fi -./gen_framework.sh -cd .. # go to scipts +cd .. ./gen_android_manifest.sh cd .. # go to root cp -rf ./ios/Runner/InfoBase.plist ./ios/Runner/Info.plist diff --git a/scripts/ios/app_env.sh b/scripts/ios/app_env.sh index 0e6ed285e..304b95b5b 100644 --- a/scripts/ios/app_env.sh +++ b/scripts/ios/app_env.sh @@ -13,13 +13,13 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN) APP_IOS_TYPE=$1 MONERO_COM_NAME="Monero.com" -MONERO_COM_VERSION="1.20.0" -MONERO_COM_BUILD_NUMBER=110 +MONERO_COM_VERSION="1.20.1" +MONERO_COM_BUILD_NUMBER=111 MONERO_COM_BUNDLE_ID="com.cakewallet.monero" CAKEWALLET_NAME="Cake Wallet" -CAKEWALLET_VERSION="4.23.0" -CAKEWALLET_BUILD_NUMBER=293 +CAKEWALLET_VERSION="4.23.1" +CAKEWALLET_BUILD_NUMBER=295 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet" HAVEN_NAME="Haven" diff --git a/scripts/ios/build_monero_all.sh b/scripts/ios/build_monero_all.sh index 79a3c61f8..69d4f006b 100755 --- a/scripts/ios/build_monero_all.sh +++ b/scripts/ios/build_monero_all.sh @@ -18,11 +18,17 @@ cd "$(dirname "$0")" for COIN in monero wownero zano; do pushd ../monero_c - rm -rf external/ios/build ./build_single.sh ${COIN} aarch64-apple-ios -j$MAKE_JOB_COUNT + ./build_single.sh ${COIN} aarch64-apple-iossimulator -j$MAKE_JOB_COUNT popd done -unxz -f ../monero_c/release/monero/aarch64-apple-ios_libwallet2_api_c.dylib.xz -unxz -f ../monero_c/release/wownero/aarch64-apple-ios_libwallet2_api_c.dylib.xz -unxz -f ../monero_c/release/zano/aarch64-apple-ios_libwallet2_api_c.dylib.xz +unxz -fk ../monero_c/release/monero/aarch64-apple-ios_libwallet2_api_c.dylib.xz +unxz -fk ../monero_c/release/wownero/aarch64-apple-ios_libwallet2_api_c.dylib.xz +unxz -fk ../monero_c/release/zano/aarch64-apple-ios_libwallet2_api_c.dylib.xz + +unxz -fk ../monero_c/release/monero/aarch64-apple-iossimulator_libwallet2_api_c.dylib.xz +unxz -fk ../monero_c/release/wownero/aarch64-apple-iossimulator_libwallet2_api_c.dylib.xz +unxz -fk ../monero_c/release/zano/aarch64-apple-iossimulator_libwallet2_api_c.dylib.xz + +./gen_framework.sh \ No newline at end of file diff --git a/scripts/ios/build_mwebd.sh b/scripts/ios/build_mwebd.sh index e13c4931c..5bdd32e15 100755 --- a/scripts/ios/build_mwebd.sh +++ b/scripts/ios/build_mwebd.sh @@ -14,7 +14,7 @@ git clone https://github.com/ltcmweb/mwebd cd mwebd git reset --hard 555349415f76a42ec5c76152b64c4ab9aabc448f gomobile bind -target=ios . -mv -fn ./Mwebd.xcframework ../../../ios/ +mv -fn ./Mwebd.xcframework ../../../cw_mweb/ios/ # cleanup: cd .. rm -rf mwebd \ No newline at end of file diff --git a/scripts/ios/gen_framework.sh b/scripts/ios/gen_framework.sh index e9cc44801..e1c237f87 100755 --- a/scripts/ios/gen_framework.sh +++ b/scripts/ios/gen_framework.sh @@ -1,47 +1,159 @@ #!/bin/sh -# Assume we are in scripts/ios +set -e + IOS_DIR="$(pwd)/../../ios" -DYLIB_NAME="monero_libwallet2_api_c.dylib" -DYLIB_LINK_PATH="${IOS_DIR}/${DYLIB_NAME}" -FRWK_DIR="${IOS_DIR}/MoneroWallet.framework" +DYLIB_PATH="$(pwd)/../../scripts/monero_c/release" +TMP_DIR="${IOS_DIR}/tmp" -if [ ! -f $DYLIB_LINK_PATH ]; then - echo "Dylib is not found by the link: ${DYLIB_LINK_PATH}" - exit 0 -fi +rm -rf "${IOS_DIR:?}/MoneroWallet.xcframework" "${IOS_DIR:?}/WowneroWallet.xcframework" "${IOS_DIR:?}/ZanoWallet.xcframework" +rm -rf "${IOS_DIR:?}/MoneroWallet.framework" "${IOS_DIR:?}/WowneroWallet.framework" "${IOS_DIR:?}/ZanoWallet.framework" +rm -rf "$TMP_DIR" +mkdir -p "$TMP_DIR" -cd $FRWK_DIR # go to iOS framework dir -lipo -create $DYLIB_LINK_PATH -output MoneroWallet +write_info_plist() { + framework_bundle="$1" + framework_name="$2" + target="$3" + plist_path="${framework_bundle}/Info.plist" -echo "Generated ${FRWK_DIR}" -# also generate for wownero -IOS_DIR="$(pwd)/../../ios" -DYLIB_NAME="wownero_libwallet2_api_c.dylib" -DYLIB_LINK_PATH="${IOS_DIR}/${DYLIB_NAME}" -FRWK_DIR="${IOS_DIR}/WowneroWallet.framework" + if [[ "x$target" = "xiossimulator" ]]; then + platform="iPhoneSimulator" + dtplatformname="iphonesimulator" + dtsdkname="iphonesimulator17.4" + else + platform="iPhoneOS" + dtplatformname="iphoneos" + dtsdkname="iphoneos17.4" + fi -if [ ! -f $DYLIB_LINK_PATH ]; then - echo "Dylib is not found by the link: ${DYLIB_LINK_PATH}" - exit 0 -fi + cat > "$plist_path" < + + + + BuildMachineOSBuild + 23E224 + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${framework_name} + CFBundleIdentifier + com.fotolockr.${framework_name} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${framework_name} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ??? + CFBundleSupportedPlatforms + + ${platform} + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 21E210 + DTPlatformName + ${dtplatformname} + DTPlatformVersion + 17.4 + DTSDKBuild + 21E210 + DTSDKName + ${dtsdkname} + DTXcode + 1530 + DTXcodeBuild + 15E204a + MinimumOSVersion + 16.0 + UIDeviceFamily + + 1 + 2 + + UIRequiredDeviceCapabilities + + arm64 + + + +EOF + plutil -convert binary1 "$plist_path" +} -cd $FRWK_DIR # go to iOS framework dir -lipo -create $DYLIB_LINK_PATH -output WowneroWallet +create_framework() { + wallet="$1" + framework_name="$2" + target="$3" + out_dir="$4" -echo "Generated ${FRWK_DIR}" + echo "Creating ${framework_name}.framework for target ${target} in ${out_dir}..." -# also generate for zano -IOS_DIR="$(pwd)/../../ios" -DYLIB_NAME="zano_libwallet2_api_c.dylib" -DYLIB_LINK_PATH="${IOS_DIR}/${DYLIB_NAME}" -FRWK_DIR="${IOS_DIR}/ZanoWallet.framework" + framework_bundle="${out_dir}/${framework_name}.framework" + + rm -rf "$framework_bundle" + mkdir -p "$framework_bundle" -if [ ! -f $DYLIB_LINK_PATH ]; then - echo "Dylib is not found by the link: ${DYLIB_LINK_PATH}" - exit 0 -fi + input_dylib="${DYLIB_PATH}/${wallet}/aarch64-apple-${target}_libwallet2_api_c.dylib" + if [[ ! -f "$input_dylib" ]]; then + echo "Error: Input dylib not found: $input_dylib" + exit 1 + fi -cd $FRWK_DIR # go to iOS framework dir -lipo -create $DYLIB_LINK_PATH -output ZanoWallet + lipo -create "$input_dylib" -output "${framework_bundle}/${framework_name}" + echo "Created binary: ${framework_bundle}/${framework_name}" -echo "Generated ${FRWK_DIR}" + write_info_plist "$framework_bundle" "$framework_name" "$target" +} + +create_xcframework() { + framework_name="$1" + device_framework="$2" + simulator_framework="$3" + xcframework_output="$4" + + echo "Creating ${xcframework_output} by bundling:" + echo " Device framework: ${device_framework}" + echo " Simulator framework: ${simulator_framework}" + + xcodebuild -create-xcframework \ + -framework "$device_framework" \ + -framework "$simulator_framework" \ + -output "$xcframework_output" + + echo "Created XCFramework: ${xcframework_output}" +} + +wallets=("monero" "wownero" "zano") +framework_names=("MoneroWallet" "WowneroWallet" "ZanoWallet") + +for i in "${!wallets[@]}"; do + wallet="${wallets[$i]}" + framework_name="${framework_names[$i]}" + + device_out="${TMP_DIR}/${framework_name}_device" + simulator_out="${TMP_DIR}/${framework_name}_simulator" + rm -rf "$device_out" "$simulator_out" + mkdir -p "$device_out" "$simulator_out" + + create_framework "$wallet" "$framework_name" "ios" "$device_out" + create_framework "$wallet" "$framework_name" "iossimulator" "$simulator_out" + + device_framework="${device_out}/${framework_name}.framework" + simulator_framework="${simulator_out}/${framework_name}.framework" + xcframework_output="${IOS_DIR}/${framework_name}.xcframework" + rm -rf "$xcframework_output" + + create_xcframework "$framework_name" "$device_framework" "$simulator_framework" "$xcframework_output" +done + +echo "All XCFrameworks created successfully." + +rm -rf "$TMP_DIR" diff --git a/tool/download_moneroc_prebuilds.dart b/tool/download_moneroc_prebuilds.dart index 22384e84a..394f2edbc 100644 --- a/tool/download_moneroc_prebuilds.dart +++ b/tool/download_moneroc_prebuilds.dart @@ -24,6 +24,7 @@ final List triplets = [ // "x86_64-host-apple-darwin", // not available on CI (yet) "aarch64-host-apple-darwin", // apple silicon macbooks (local builds) "aarch64-apple-ios", + "aarch64-apple-iossimulator", ]; Future main() async {