修改iOS无法找到UnityLibrary
This commit is contained in:
parent
9c2b1e6168
commit
633a8bc687
356
README.md
356
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
|
||||
<!-- 相机权限 -->
|
||||
<key>NSCameraUsageDescription</key>
|
||||
@ -297,12 +333,14 @@ end
|
||||
<!-- 定位权限 -->
|
||||
<key>NSLocationWhenInUseUsageDescription</key>
|
||||
<string>此应用需要访问您的定位以提供导航服务</string>
|
||||
<key>NSLocationAlwaysUsageDescription</key>
|
||||
<key>NSLocationAlwaysUsageDescription</key>
|
||||
<string>App需要您的同意,才能始终访问位置</string>
|
||||
```
|
||||
|
||||
## 跨平台数据交互
|
||||
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
|
||||
|
||||
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"按钮
|
||||
|
||||
Loading…
Reference in New Issue
Block a user