获取Unity-iPhone
string unityIphone = proj.GetUnityMainTargetGuid();
获取UnityFramework
string unityFramework = proj.GetUnityFrameworkTargetGuid();
添加系统库 (proj:PBXProject)
proj.AddFrameworkToProject(unityIphone, "libc++.tbd", false);
修改Info.plist文件
string plistPath = Path.Combine(pathToBuildProject, "info.plist");
PlistDocument plist = new PlistDocument();
plist.ReadFromFile(plistPath);
plist.root.SetString
plist.root.SetBoolean
PlistElementArray array
PlistElementDict dict
...
File.WriteAllText(plistPath, plist.WriteToString());
添加到 EmbedFrameworks
UnityEditor.iOS.Xcode.Extensions.PBXProjectExtensions.AddFileToEmbedFrameworks(proj, unityFramework, fileGuid);
添加到 Copy Resources
proj.AddFileToBuildSection(unityIphone, proj.GetResourcesBuildPhaseByTarget(unityIphone), fileGuid);
修改 Capability
var capabilityManager = new ProjectCapabilityManager(projectPath, entitlementsPath, "Unity-iPhone", unityIphone);
capabilityManager.AddInAppPurchase();//内购
capabilityManager.AddPushNotifications(true);//推送
...
修改 BuildSettings 中的配置
proj.SetBuildProperty(unityIphone, "ENABLE_BITCODE", "NO");
proj.AddBuildProperty(unityIphone, "LIBRARY_SEARCH_PATHS", "$(SDKROOT)/usr/lib/swift");
...
修改第三方库 Weak -> Optional
/// <summary>
/// 修改第三方Framework Weak->Optional
/// </summary>
public static void EditPBXProjFileToAddFrameworkWeak(string path, string[] frameworkNames)
{
const string INSERT_STR = " platformFilter = ios; settings = {ATTRIBUTES = (Weak, ); };";
const string SEARCH_FLAG_0_FORMAT = "{0}.framework in Frameworks";
const string SEARCH_FLAG_1 = "= {isa = PBXBuildFile; fileRef =";
const string LINE_END_FLAG = " };";
var lines = File.ReadAllLines(path);
foreach (var frameworkName in frameworkNames)
{
var searchFlag0 = string.Format(SEARCH_FLAG_0_FORMAT, frameworkName);
for (int i = 0; i < lines.Length; i++)
{
var line = lines[i];
if (line.Contains(searchFlag0) && line.Contains(SEARCH_FLAG_1) && !line.Contains(INSERT_STR))
{
//就是他妈的这个
var insertIndex = line.LastIndexOf(LINE_END_FLAG);
var newLine = line.Insert(insertIndex, INSERT_STR);
lines[i] = newLine;
}
}
}
File.WriteAllLines(path, lines);
}
苹果登录
/// <summary>
/// 添加苹果登录
/// </summary>
private static void AddSignInWithApple(ProjectCapabilityManager manager)
{
var managerType = typeof(ProjectCapabilityManager);
var capabilityTypeType = typeof(PBXCapabilityType);
var projectField = managerType.GetField("project", NonPublicInstanceBinding);
var targetGuidField = managerType.GetField("m_TargetGuid", NonPublicInstanceBinding);
var entitlementFilePathField = managerType.GetField("m_EntitlementFilePath", NonPublicInstanceBinding);
var getOrCreateEntitlementDocMethod = managerType.GetMethod("GetOrCreateEntitlementDoc", NonPublicInstanceBinding);
var constructorInfo = capabilityTypeType.GetConstructor(
NonPublicInstanceBinding,
null,
new[] { typeof(string), typeof(bool), typeof(string), typeof(bool) },
null);
if (projectField == null || targetGuidField == null || entitlementFilePathField == null ||
getOrCreateEntitlementDocMethod == null || constructorInfo == null)
throw new Exception("Can't Add Sign In With Apple programatically in this Unity version");
var entitlementDoc = getOrCreateEntitlementDocMethod.Invoke(manager, new object[] { }) as PlistDocument;
if (entitlementDoc != null)
{
var plistArray = new PlistElementArray();
plistArray.AddString(DefaultAccessLevel);
entitlementDoc.root[EntitlementsArrayKey] = plistArray;
}
}