killapp/Assets/Editor/iOSWiFiBuildPostProcessor.cs

79 lines
3.3 KiB
C#
Raw Normal View History

2026-04-28 16:35:51 +08:00
#if UNITY_IOS
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using System.IO;
public class iOSWiFiBuildPostProcessor
{
private const string WIFI_INFO_ENTITLEMENT = "com.apple.developer.networking.wifi-info";
// 高于默认顺序执行,确保覆盖其他插件写入的蓝牙描述
[PostProcessBuild(1000)]
2026-04-28 16:35:51 +08:00
public static void OnPostProcessBuild(BuildTarget target, string pathToBuiltProject)
{
if (target != BuildTarget.iOS) return;
// ===== 1. 配置 Info.plist =====
2026-04-28 16:35:51 +08:00
string plistPath = Path.Combine(pathToBuiltProject, "Info.plist");
PlistDocument plist = new PlistDocument();
plist.ReadFromString(File.ReadAllText(plistPath));
PlistElementDict rootDict = plist.root;
// 添加位置权限描述iOS 13+ 获取 WiFi 需要)
rootDict.SetString("NSLocationWhenInUseUsageDescription", "Location access is used to detect the current WiFi network so we can display the connected WiFi name.");
2026-04-28 16:35:51 +08:00
// 添加蓝牙权限描述
rootDict.SetString("NSBluetoothAlwaysUsageDescription", "Bluetooth is used to scan for and connect to your device. For example, after pairing with the device, we send control commands to it.");
rootDict.SetString("NSBluetoothPeripheralUsageDescription", "Bluetooth is used to scan for and connect to your device. For example, after pairing with the device, we send control commands to it.");
2026-04-28 16:35:51 +08:00
// 添加后台模式
PlistElementArray bgModes = rootDict.CreateArray("UIBackgroundModes");
bgModes.AddString("fetch");
bgModes.AddString("bluetooth-central");
File.WriteAllText(plistPath, plist.WriteToString());
// ===== 2. 配置 Xcode 项目 =====
2026-04-28 16:35:51 +08:00
string projPath = PBXProject.GetPBXProjectPath(pathToBuiltProject);
PBXProject proj = new PBXProject();
proj.ReadFromString(File.ReadAllText(projPath));
string targetGuid = proj.GetUnityMainTargetGuid();
proj.AddFrameworkToProject(targetGuid, "CoreBluetooth.framework", false);
// ===== 3. 添加 Access WiFi Information 权限iOS 14+ 必需)=====
string entitlementsFileName = "app.entitlements";
string entitlementsPath = Path.Combine(pathToBuiltProject, entitlementsFileName);
// 创建或读取 entitlements 文件
PlistDocument entitlements = new PlistDocument();
if (File.Exists(entitlementsPath))
{
entitlements.ReadFromString(File.ReadAllText(entitlementsPath));
}
else
{
entitlements.root.SetString("aps-environment", "development");
}
// 添加 WiFi 信息访问权限iOS 14+
entitlements.root.SetBoolean(WIFI_INFO_ENTITLEMENT, true);
File.WriteAllText(entitlementsPath, entitlements.WriteToString());
// 设置 entitlements 文件到 Xcode 项目
proj.SetBuildProperty(targetGuid, "CODE_SIGN_ENTITLEMENTS", entitlementsFileName);
2026-04-28 16:35:51 +08:00
// 同时设置 framework target
string frameworkTargetGuid = proj.GetUnityFrameworkTargetGuid();
if (!string.IsNullOrEmpty(frameworkTargetGuid))
{
proj.SetBuildProperty(frameworkTargetGuid, "CODE_SIGN_ENTITLEMENTS", entitlementsFileName);
}
2026-04-28 16:35:51 +08:00
File.WriteAllText(projPath, proj.WriteToString());
}
}
#endif