From 633a8bc687439568b6788571f2bad0820d14db42 Mon Sep 17 00:00:00 2001 From: renna <576157508@qq.com> Date: Thu, 15 May 2025 10:15:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9iOS=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E6=89=BE=E5=88=B0UnityLibrary?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 356 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 201 insertions(+), 155 deletions(-) diff --git a/README.md b/README.md index 729f39c..e2b7e6a 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # ar_tourism_flutter_unity +### 1.文字渐变 -### 1.文字渐变 ShaderMask( shaderCallback: (Rect bounds) { return const LinearGradient( @@ -16,52 +16,59 @@ color: Colors.white, fontSize: 18)), ), -# flutter打包后的文件 build/app/outputs/flutter-apk/app-debug.apk -# *****不要忘记:online_time_service文件修改ws部署地址***** -# ndroid/app/src/main/res/xml 目录下创建 network_security_config.xml 文件:创建网络安全配置文件82.156.153.112 -# flutter run --release 运行打包文件 -# flutter build apk --target-platform android-arm,android-arm64,android-x64 --split-per-abi 可以减小打包体积 -# flutter build apk -# 使用flutter analyze命令检查代码中的潜在问题,确保没有冗余的代码和依赖。 +# flutter 打包后的文件 build/app/outputs/flutter-apk/app-debug.apk +# **\***不要忘记:online_time_service 文件修改 ws 部署地址**\*** +# ndroid/app/src/main/res/xml 目录下创建 network_security_config.xml 文件:创建网络安全配置文件 82.156.153.112 +# flutter run --release 运行打包文件 + +# flutter build apk --target-platform android-arm,android-arm64,android-x64 --split-per-abi 可以减小打包体积 + +# flutter build apk + +# 使用 flutter analyze 命令检查代码中的潜在问题,确保没有冗余的代码和依赖。 + +# git 大文件上传报错 https://blog.csdn.net/qq_22903677/article/details/138123394 -# git大文件上传报错 https://blog.csdn.net/qq_22903677/article/details/138123394 git lfs install git add . git commit -m "" -# git push报错 -错误batch response: LFS only supported repository in paid or trial enterpri + +# git push 报错 + +错误 batch response: LFS only supported repository in paid or trial enterpri rm .git/hooks/pre-push - git push -u origin "master" +git push -u origin "master" +#接口调用 +import '../../apis/app.dart'; +userApi.getLoginCode(data).then((result) { +if (result['code'] == 200) { +print("发送成功"); +Navigator.pushNamed(context, '/tabs'); +} else { +print("发送失败"); +} +}); - #接口调用 - import '../../apis/app.dart'; - userApi.getLoginCode(data).then((result) { - if (result['code'] == 200) { - print("发送成功"); - Navigator.pushNamed(context, '/tabs'); - } else { - print("发送失败"); - } - }); # formData 上传文件 - // 构建实名认证信息对象 - var infoMsg = { - "user_name": _phoneController.text, - "real_name": _nameController.text, - "id_card": _idCardController.text - }; - // 将 infoMsg 转换为 JSON 字符串 - var infoMsgJson = jsonEncode(infoMsg); - // 获取文件对象 - File frontFile = File(_frontImage!.path); - print("frontFile: $frontFile"); - File backFile = File(_backImage!.path); - print("backFile: $backFile"); + +// 构建实名认证信息对象 +var infoMsg = { +"user_name": \_phoneController.text, +"real_name": \_nameController.text, +"id_card": \_idCardController.text +}; +// 将 infoMsg 转换为 JSON 字符串 +var infoMsgJson = jsonEncode(infoMsg); +// 获取文件对象 +File frontFile = File(\_frontImage!.path); +print("frontFile: $frontFile"); +File backFile = File(\_backImage!.path); +print("backFile: $backFile"); // 创建 FormData FormData formData = FormData.fromMap({ @@ -72,10 +79,10 @@ rm .git/hooks/pre-push "realNameAuthenticationDto": infoMsgJson, // 添加 JSON 字符串 }); - + print("请求数据: $formData"); - + // 调用实名认证API userApi.getRealNameAuth(formData).then((result) { if (result['code'] == 200) { @@ -87,157 +94,183 @@ rm .git/hooks/pre-push builder: (context) => const AuthSuccessPage(), ), ); - } + } }); + # 格式化时间 -String _formatDateTime(String dateTimeString) { - DateTime dateTime = DateTime.parse(dateTimeString).toLocal(); - return '${dateTime.year}-${dateTime.month}-${dateTime.day} ${dateTime.hour}:${dateTime.minute}:${dateTime.second}'; // 格式化为 年月日 时分秒 + +String \_formatDateTime(String dateTimeString) { +DateTime dateTime = DateTime.parse(dateTimeString).toLocal(); +return '${dateTime.year}-${dateTime.month}-${dateTime.day} ${dateTime.hour}:${dateTime.minute}:${dateTime.second}'; // 格式化为 年月日 时分秒 } # 跳转到底部导航页 - Navigator.pushNamedAndRemoveUntil( - context, - '/tabs', - (route) => false, - arguments: {'initialIndex': 1}, // 传递参数,设置初始选中的tab - ); - # 集成unity - 1.baseProjectTemplate.gradle文件 - classpath 'com.android.tools.build:gradle:7.3.0', - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0" - 2.NDK版本21.3 - #运行清除缓存 adb shell pm clear com.example.ar_tourism_flutter_unity +Navigator.pushNamedAndRemoveUntil( +context, +'/tabs', +(route) => false, +arguments: {'initialIndex': 1}, // 传递参数,设置初始选中的 tab +); +# 集成 unity - # unityLibrary 文件夹 - 1.添加.so文件 src/main/jniLibs/arm64-v8a/libEasyAR.so libc++_shared.so +1.baseProjectTemplate.gradle 文件 +classpath 'com.android.tools.build:gradle:7.3.0', +classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0" +2.NDK 版本 21.3 +#运行清除缓存 adb shell pm clear com.example.ar_tourism_flutter_unity +# unityLibrary 文件夹 - ### 每次从unity 导入flutter时要检查: - 1.unity--->Player Company Name: com.example Product Name: ar_tourism_flutter_unity - 2.unity--> build Settings Export Project 勾选;IL2CPP Code Generation:Faster(smaller)builds - 3.unity--> Player -->otherSettings OpenGLES3下都取消勾选 Auto Graphics API 勾选 - 4.unity--> Player -->otherSettings Package Name:com.example.ar_tourism_flutter_unity - 5.unity--> Player -->Minimum APl Level:Android 5.1 'Lollipop'(APl level 22);Target APl Level:APllevel 34 - 6.unity--> Player -->Scripting Backend:IL2CPP 勾选ARM64 - 7.unity-->Project Settings-->EasyAR/Sence EasyAR Sence License Key:URzW8VUPzu1NaWbUsPbv6VUBDY95e6AyZGz+imEu4NpVPubHYTPxii5/tJAnabCYJWWynSIdtJ4nc+bHeX+pink89txxL87NbRThii5sqYp4NObNei7g2zZn3tM2P/DGcDHg4XAup5JPAKmKYjz3wXUz8ds2Z96KdzLoxWEz7Nxtf9iENi3pyWA76tp5LqeST3/ywXo56t9nf6mKeTzmiklxp8V7OfDEcS6nkk9/9s16LuCGXTDkz3EJ98l3NuzGc3+pimc469txc8bEeyjh+nE+6s96NPHBezOnhDYu4MZnOKv6cT7q2nA06882cafbcTP2zToS58JxPvH8Zjzmw30z4oo4f/bNei7ghkco9851PuD8Zjzmw30z4oo4f/bNei7ghkct5NpnONbYdSnsyXgQ5Ng2cafbcTP2zToQ6tx9Muv8Zjzmw30z4oo4f/bNei7ghlA469txDvXJYDTkxFk89Yo4f/bNei7ghlccwfxmPObDfTPiiklxp81sLezacQnsxXEO8cl5LaeSeijpxDh/7NtYMubJeH+/znUx9s1pcf6KdijrzHg4zMxnf7/zNj7qxTo4/cl5LenNOjz392Ay8Np9Luj3cjHw3GA49/dhM+zcbX/YhDYr5Np9POvcZ3+/8zY+6sV5KOvBYCSn9Th/9cR1KePHZjD2ii4Gp8l6OffHfTmn9Th/6MdwKOnNZ3+/8zYu4MZnOKvheTzizUAv5Mt/NOvPNnGn23Ez9s06HunHYTnXzXcy4sZ9KezHen+pimc469txc9fNdzL3zH0z4oo4f/bNei7ghls/7813KdHadT7uwXo6p4Q2LuDGZzir+2Ev48l3ONHadT7uwXo6p4Q2LuDGZzir+2Q899txDvXJYDTkxFk89Yo4f/bNei7ghlky8cF7M9HadT7uwXo6p4Q2LuDGZzir7HEz9s1HLeTcfTzp5XUtp4Q2LuDGZzir61UZ0dp1Pu7Bejqn9Th/4NBkNPfNQDTozUcp5MVkf7/GYTHphDY09uR7PuTENmfjyXgu4NU4JqfKYTPhxHEU4ds2Z96KNgCpimI898F1M/HbNmfeincy6MVhM+zcbX/YhDYt6clgO+raeS6nkk9/7Mdnf9iENjDqzGEx4Ns2Z96KZzjr23FzzMV1OuD8Zjzmw30z4oo4f/bNei7ghlcx6t1wD+DLezrrwWA06sY2cafbcTP2zToP4Mt7L+HBejqnhDYu4MZnOKvndjfgy2AJ98l3NuzGc3+pimc469txc9bdZjvky3EJ98l3NuzGc3+pimc469txc9bYdS/2zUct5Nx9POnldS2nhDYu4MZnOKvleynsx3oJ98l3NuzGc3+pimc469txc8HNei7g+2Q88cF1McjJZH+pimc469txc8bpUAn3yXc27MZzf9iENjj92H0v4Px9MOD7YDzo2DZn6914MamKfS7Jx3c86YouO+TEZzj49WkSI2M48hCn8PXdlAW8gkVUod0xa+37dOiHJxzEZnb9Yo3mYzP6LHO7eF7u11thk3qJcxk7MRjQFuOc+9AjiOyoEoW+vErOoVFolgphuBc4A2Q05Nd1hEFpx/3xG0ZbuQS5+Uo0hNtfZAiKmM+1XFy9KD3wXluPLXmrZC916jAjwZgp2p0nbsiJEvj57xlXrA7F+IRuCMrgMMav+zdcrMuUAN/8ANbYqXlj6T86dgZqSmkI22nX6P1lYbGJTb0YkvMPDLYaBK5TPfzqnZkb6m647L82gb7nzVCPvLOucFjVAjMG0kwF2xBJ+aEIFbNUBsLN3Dq8YPT4n0I5+SwUXYWo (此key为EasyAR申请 名字和key要对应) - # 因购买EASY AR 使用unity中的即可 无需替换 +1.添加.so 文件 src/main/jniLibs/arm64-v8a/libEasyAR.so libc++\_shared.so - 8.Player-->publishing Settings-->build下的都勾选 - 9.MyCamera-->GPS勾选 +### 每次从 unity 导入 flutter 时要检查: +1.unity--->Player Company Name: com.example Product Name: ar_tourism_flutter_unity +2.unity--> build Settings Export Project 勾选;IL2CPP Code Generation:Faster(smaller)builds +3.unity--> Player -->otherSettings OpenGLES3 下都取消勾选 Auto Graphics API 勾选 +4.unity--> Player -->otherSettings Package Name:com.example.ar_tourism_flutter_unity +5.unity--> Player -->Minimum APl Level:Android 5.1 'Lollipop'(APl level 22);Target APl Level:APllevel 34 +6.unity--> Player -->Scripting Backend:IL2CPP 勾选 ARM64 +7.unity-->Project Settings-->EasyAR/Sence EasyAR Sence License Key:URzW8VUPzu1NaWbUsPbv6VUBDY95e6AyZGz+imEu4NpVPubHYTPxii5/tJAnabCYJWWynSIdtJ4nc+bHeX+pink89txxL87NbRThii5sqYp4NObNei7g2zZn3tM2P/DGcDHg4XAup5JPAKmKYjz3wXUz8ds2Z96KdzLoxWEz7Nxtf9iENi3pyWA76tp5LqeST3/ywXo56t9nf6mKeTzmiklxp8V7OfDEcS6nkk9/9s16LuCGXTDkz3EJ98l3NuzGc3+pimc469txc8bEeyjh+nE+6s96NPHBezOnhDYu4MZnOKv6cT7q2nA06882cafbcTP2zToS58JxPvH8Zjzmw30z4oo4f/bNei7ghkco9851PuD8Zjzmw30z4oo4f/bNei7ghkct5NpnONbYdSnsyXgQ5Ng2cafbcTP2zToQ6tx9Muv8Zjzmw30z4oo4f/bNei7ghlA469txDvXJYDTkxFk89Yo4f/bNei7ghlccwfxmPObDfTPiiklxp81sLezacQnsxXEO8cl5LaeSeijpxDh/7NtYMubJeH+/znUx9s1pcf6KdijrzHg4zMxnf7/zNj7qxTo4/cl5LenNOjz392Ay8Np9Luj3cjHw3GA49/dhM+zcbX/YhDYr5Np9POvcZ3+/8zY+6sV5KOvBYCSn9Th/9cR1KePHZjD2ii4Gp8l6OffHfTmn9Th/6MdwKOnNZ3+/8zYu4MZnOKvheTzizUAv5Mt/NOvPNnGn23Ez9s06HunHYTnXzXcy4sZ9KezHen+pimc469txc9fNdzL3zH0z4oo4f/bNei7ghls/7813KdHadT7uwXo6p4Q2LuDGZzir+2Ev48l3ONHadT7uwXo6p4Q2LuDGZzir+2Q899txDvXJYDTkxFk89Yo4f/bNei7ghlky8cF7M9HadT7uwXo6p4Q2LuDGZzir7HEz9s1HLeTcfTzp5XUtp4Q2LuDGZzir61UZ0dp1Pu7Bejqn9Th/4NBkNPfNQDTozUcp5MVkf7/GYTHphDY09uR7PuTENmfjyXgu4NU4JqfKYTPhxHEU4ds2Z96KNgCpimI898F1M/HbNmfeincy6MVhM+zcbX/YhDYt6clgO+raeS6nkk9/7Mdnf9iENjDqzGEx4Ns2Z96KZzjr23FzzMV1OuD8Zjzmw30z4oo4f/bNei7ghlcx6t1wD+DLezrrwWA06sY2cafbcTP2zToP4Mt7L+HBejqnhDYu4MZnOKvndjfgy2AJ98l3NuzGc3+pimc469txc9bdZjvky3EJ98l3NuzGc3+pimc469txc9bYdS/2zUct5Nx9POnldS2nhDYu4MZnOKvleynsx3oJ98l3NuzGc3+pimc469txc8HNei7g+2Q88cF1McjJZH+pimc469txc8bpUAn3yXc27MZzf9iENjj92H0v4Px9MOD7YDzo2DZn6914MamKfS7Jx3c86YouO+TEZzj49WkSI2M48hCn8PXdlAW8gkVUod0xa+37dOiHJxzEZnb9Yo3mYzP6LHO7eF7u11thk3qJcxk7MRjQFuOc+9AjiOyoEoW+vErOoVFolgphuBc4A2Q05Nd1hEFpx/3xG0ZbuQS5+Uo0hNtfZAiKmM+1XFy9KD3wXluPLXmrZC916jAjwZgp2p0nbsiJEvj57xlXrA7F+IRuCMrgMMav+zdcrMuUAN/8ANbYqXlj6T86dgZqSmkI22nX6P1lYbGJTb0YkvMPDLYaBK5TPfzqnZkb6m647L82gb7nzVCPvLOucFjVAjMG0kwF2xBJ+aEIFbNUBsLN3Dq8YPT4n0I5+SwUXYWo (此 key 为 EasyAR 申请 名字和 key 要对应) - # 版本更新 - 1.修改yaml中的版本号 - 2.修改Android/app/build.gradle中的版本号versionName versionCode - 3.打包将apk 文件拷贝到服务器上 +# 因购买 EASY AR 使用 unity 中的即可 无需替换 -# Flutter与Unity之间的交互说明 +8.Player-->publishing Settings-->build 下的都勾选 +9.MyCamera-->GPS 勾选 + +# 版本更新 + +1.修改 yaml 中的版本号 2.修改 Android/app/build.gradle 中的版本号 versionName versionCode 3.打包将 apk 文件拷贝到服务器上 + +# Flutter 与 Unity 之间的交互说明 ## 核心文件说明 -FlutterMainActivity 专注处理Flutter相关的逻辑和生命周期 -UnityMainActivity 专注处理Unity相关的渲染和交互 + +FlutterMainActivity 专注处理 Flutter 相关的逻辑和生命周期 +UnityMainActivity 专注处理 Unity 相关的渲染和交互 这种分离使得代码更清晰,维护更容易 ### 1. FlutterMainActivity.kt -这是Flutter应用的主Activity文件,主要功能包括: -- 负责Flutter和Unity之间的桥接通信 -- 管理Unity的初始化和启动 + +这是 Flutter 应用的主 Activity 文件,主要功能包括: + +- 负责 Flutter 和 Unity 之间的桥接通信 +- 管理 Unity 的初始化和启动 - 处理权限请求和结果 -- 提供方法通道(MethodChannel)供Flutter调用原生方法 +- 提供方法通道(MethodChannel)供 Flutter 调用原生方法 - 管理位置服务的生命周期 -- 处理Unity活动的返回结果 +- 处理 Unity 活动的返回结果 主要方法: -- `configureFlutterEngine`: 配置Flutter引擎和方法通道 -- `startUnityActivity`: 启动Unity活动 + +- `configureFlutterEngine`: 配置 Flutter 引擎和方法通道 +- `startUnityActivity`: 启动 Unity 活动 - `checkAndRequestPermissions`: 检查和请求必要权限 - `cleanupLocationService`: 清理位置服务资源 ### 2. UnityMainActivity.kt -这是Unity应用的主Activity文件,主要功能包括: -- 继承自UnityPlayerActivity,负责Unity内容的显示和控制 -- 管理Unity播放器的生命周期 -- 处理Unity和Flutter之间的数据传递 -- 提供Unity返回Flutter的机制 -- 处理Unity资源的清理和释放 + +这是 Unity 应用的主 Activity 文件,主要功能包括: + +- 继承自 UnityPlayerActivity,负责 Unity 内容的显示和控制 +- 管理 Unity 播放器的生命周期 +- 处理 Unity 和 Flutter 之间的数据传递 +- 提供 Unity 返回 Flutter 的机制 +- 处理 Unity 资源的清理和释放 主要方法: -- `onCreate`: 初始化Unity环境和方法通道 -- `setupMethodChannel`: 设置与Flutter通信的方法通道 -- `handleExitUnity`: 处理Unity退出逻辑 + +- `onCreate`: 初始化 Unity 环境和方法通道 +- `setupMethodChannel`: 设置与 Flutter 通信的方法通道 +- `handleExitUnity`: 处理 Unity 退出逻辑 - `onBackPressed`: 处理返回按键事件 ## 交互流程 -1. Flutter通过MethodChannel调用FlutterMainActivity中的方法 -2. FlutterMainActivity处理请求并启动UnityMainActivity -3. UnityMainActivity加载Unity内容并处理Unity相关的操作 -4. Unity操作完成后,通过UnityMainActivity返回结果给FlutterMainActivity -5. FlutterMainActivity将结果通过MethodChannel传回Flutter + +1. Flutter 通过 MethodChannel 调用 FlutterMainActivity 中的方法 +2. FlutterMainActivity 处理请求并启动 UnityMainActivity +3. UnityMainActivity 加载 Unity 内容并处理 Unity 相关的操作 +4. Unity 操作完成后,通过 UnityMainActivity 返回结果给 FlutterMainActivity +5. FlutterMainActivity 将结果通过 MethodChannel 传回 Flutter ## 注意事项 -- 两个Activity之间的通信需要严格管理生命周期 -- Unity资源的加载和释放需要合理处理,避免内存泄漏 + +- 两个 Activity 之间的通信需要严格管理生命周期 +- Unity 资源的加载和释放需要合理处理,避免内存泄漏 - 权限请求和结果处理需要完整的错误处理机制 - 位置服务的启动和停止需要在合适的时机进行 -- Activity切换时需要确保资源的正确释放和重新初始化 +- Activity 切换时需要确保资源的正确释放和重新初始化 -# iOS与Unity集成指南 +# iOS 与 Unity 集成指南 -## iOS核心文件说明 -与Android平台的Activity分离不同,iOS使用委托模式处理Unity与Flutter的集成。 +## iOS 核心文件说明 + +与 Android 平台的 Activity 分离不同,iOS 使用委托模式处理 Unity 与 Flutter 的集成。 ### 1. AppDelegate.swift -这是iOS应用的主委托文件,相当于Android的FlutterMainActivity,功能包括: + +这是 iOS 应用的主委托文件,相当于 Android 的 FlutterMainActivity,功能包括: + - 应用程序入口点 -- 注册Flutter插件和Unity插件 -- 初始化Unity框架 +- 注册 Flutter 插件和 Unity 插件 +- 初始化 Unity 框架 - 设置消息通道 - 管理应用生命周期 主要方法: + - `application(_:didFinishLaunchingWithOptions:)`: 应用启动初始化 -- `initUnityFramework`: 初始化Unity框架 -- `registerUnityViewFactory`: 注册Unity视图工厂 -- `setupUnityMessageHandlers`: 设置Unity消息处理器 +- `initUnityFramework`: 初始化 Unity 框架 +- `registerUnityViewFactory`: 注册 Unity 视图工厂 +- `setupUnityMessageHandlers`: 设置 Unity 消息处理器 ### 2. UnityPlugin.swift -作为Flutter和Unity之间的桥接器,相当于Android的UnityMainActivity的部分功能: -- 处理来自Flutter的方法调用 -- 管理Unity框架的初始化与关闭 -- 处理Unity场景的加载 -- 发送消息到Unity + +作为 Flutter 和 Unity 之间的桥接器,相当于 Android 的 UnityMainActivity 的部分功能: + +- 处理来自 Flutter 的方法调用 +- 管理 Unity 框架的初始化与关闭 +- 处理 Unity 场景的加载 +- 发送消息到 Unity 主要方法: -- `handle(_:result:)`: 处理Flutter的方法调用 -- `initializeUnity`: 初始化Unity -- `startUnity`: 启动Unity -- `loadUnityScene`: 加载Unity场景 -- `closeUnity`: 关闭Unity + +- `handle(_:result:)`: 处理 Flutter 的方法调用 +- `initializeUnity`: 初始化 Unity +- `startUnity`: 启动 Unity +- `loadUnityScene`: 加载 Unity 场景 +- `closeUnity`: 关闭 Unity ### 3. UnityFrameworkLoader.swift -负责加载Unity框架的辅助类: -- 查找和加载UnityFramework -- 初始化Unity运行环境 + +负责加载 Unity 框架的辅助类: + +- 查找和加载 UnityFramework +- 初始化 Unity 运行环境 ### 4. UnityViewFactory.swift -用于创建和管理Unity视图: -- 创建Flutter平台视图 -- 管理Unity视图控制器 + +用于创建和管理 Unity 视图: + +- 创建 Flutter 平台视图 +- 管理 Unity 视图控制器 - 处理视图的生命周期 ### 5. AppDelegate+Unity.swift -AppDelegate的扩展,处理Unity回调: -- 接收Unity消息 -- 处理Unity返回按钮事件 -- 管理Unity关闭事件 -## iOS与Unity集成配置 +AppDelegate 的扩展,处理 Unity 回调: + +- 接收 Unity 消息 +- 处理 Unity 返回按钮事件 +- 管理 Unity 关闭事件 + +## iOS 与 Unity 集成配置 + +### Podfile 配置 -### Podfile配置 ```ruby platform :ios, '12.0' use_frameworks! # 使用动态框架 @@ -245,7 +278,7 @@ use_frameworks! # 使用动态框架 target 'Runner' do # Flutter Pods flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) - + # Unity集成 pod 'UnityLibrary', :path => 'UnityLibrary' end @@ -255,7 +288,7 @@ post_install do |installer| # 框架设置 target.build_configurations.each do |config| config.build_settings['ENABLE_BITCODE'] = 'NO' - + # Unity特定设置 if target.name == 'UnityLibrary' config.build_settings['UNITY_RUNTIME_VERSION'] = '2021.3.33f1fc' @@ -266,21 +299,24 @@ post_install do |installer| end ``` -### Unity导出设置(iOS) -1. 在Unity中选择`File > Build Settings > iOS` +### Unity 导出设置(iOS) + +1. 在 Unity 中选择`File > Build Settings > iOS` 2. 配置项: - 确保`Export Project`被勾选 - 脚本后端选择`IL2CPP` - 勾选`Development Build`用于调试 - 目标架构选择`ARM64` - 在`Player Settings > Other Settings`中: - * 设置Bundle Identifier: `com.example.arTourismFlutterUnity` - * 最低iOS版本: 12.0 - * 设置必要的权限(Camera, Location等) -3. 导出项目后,将整个导出的Unity-iPhone项目复制到Flutter项目的`ios/UnityLibrary`目录 + - 设置 Bundle Identifier: `com.example.arTourismFlutterUnity` + - 最低 iOS 版本: 12.0 + - 设置必要的权限(Camera, Location 等) +3. 导出项目后,将整个导出的 Unity-iPhone 项目复制到 Flutter 项目的`ios/UnityLibrary`目录 + +### Info.plist 配置 + +确保 Info.plist 文件包含所有必要的权限描述: -### Info.plist配置 -确保Info.plist文件包含所有必要的权限描述: ```xml NSCameraUsageDescription @@ -297,12 +333,14 @@ end NSLocationWhenInUseUsageDescription 此应用需要访问您的定位以提供导航服务 -NSLocationAlwaysUsageDescription +NSLocationAlwaysUsageDescription App需要您的同意,才能始终访问位置 ``` ## 跨平台数据交互 -Unity与Flutter之间通过MethodChannel进行数据交互: + +Unity 与 Flutter 之间通过 MethodChannel 进行数据交互: + ```dart // 在Flutter中 static const platform = MethodChannel('com.example.ar_tourism_flutter_unity.unity'); @@ -327,27 +365,35 @@ platform.setMethodCallHandler((call) async { }); ``` -## iOS打包流程 +## iOS 打包流程 + 1. 更新版本号: - 在`pubspec.yaml`中更新版本号 - - 在Xcode中更新版本号和构建号 + - 在 Xcode 中更新版本号和构建号 2. 配置签名和证书: - - 在Xcode中配置正确的签名证书和配置文件 + - 在 Xcode 中配置正确的签名证书和配置文件 3. 构建和归档: ``` flutter build ios --release ``` - 然后在Xcode中进行归档和上传到App Store + 然后在 Xcode 中进行归档和上传到 App Store ## 注意事项 -1. 内存管理:iOS系统内存限制较严格,需确保Unity资源及时释放 -2. Framework路径:确保UnityFramework.framework在正确的路径并被正确引用 -3. 权限处理:提前在Info.plist中配置所有必要权限 -4. Bitcode禁用:Unity不支持Bitcode,需在项目配置中禁用 -5. 架构兼容:确保所有库使用兼容的架构(推荐仅使用ARM64) - - - - - # iOS - 包名:com.example.arTourismFlutterUnity \ No newline at end of file + +1. 内存管理:iOS 系统内存限制较严格,需确保 Unity 资源及时释放 +2. Framework 路径:确保 UnityFramework.framework 在正确的路径并被正确引用 +3. 权限处理:提前在 Info.plist 中配置所有必要权限 +4. Bitcode 禁用:Unity 不支持 Bitcode,需在项目配置中禁用 +5. 架构兼容:确保所有库使用兼容的架构(推荐仅使用 ARM64) + +# iOS + +包名:com.example.arTourismFlutterUnity + 打开 Xcode 项目: +Apply to README.md +Run +在 Xcode 中,右键点击项目导航器中的项目根目录 +选择"Add Files to 'Runner'..." +导航到项目的 ios/UnityLibrary 目录 +确保选中"Create folder references"(创建文件夹引用)选项 +点击"Add"按钮