最近用Unity接ios的sdk,用Unity导出Xcode工程后,由于刚刚开始,每次都是手动设置。后来看了Unity3D研究院之IOS全自动编辑framework、plist、oc代码(六十七)和Unity-导出Xcode工程时的自动配置之后,用XUPorter试了一下,还是感觉不方便。看了Unity iOS一键打包之淘汰 XUPorter之后,决定学习一下Unity自带的API。
[PostProcessBuild]
public static void OnPostprocessBuild(BuildTarget buildTarget, string path)
{
if (buildTarget != BuildTarget.iOS) return;
//这里是固定的
string projPath = PBXProject.GetPBXProjectPath(path);
PBXProject proj = new PBXProject();
proj.ReadFromString(File.ReadAllText(projPath));
string target = proj.TargetGuidByName("Unity-iPhone");
//1、修改设置
//添加系统库(第三方库还不会添加,现在是放在一个文件夹,拷贝到xcode工程的,以后会了再添加)
proj.AddFrameworkToProject(target,"AssetsLibrary.framework", false);
proj.AddFrameworkToProject(target,"AdSupport.framework", false);
proj.AddFrameworkToProject(target,"Security.framework", false);
proj.AddFrameworkToProject(target,"GameKit.framework", false);
proj.AddFrameworkToProject(target,"SystemConfiguration.framework", false);
proj.AddFrameworkToProject(target,"CoreTelephony.framework", false);
//添加tbd
string fileGuidSqlite = proj.AddFile("usr/lib/libsqlite3.0.tbd", "Libraries/libsqlite3.0.tbd", PBXSourceTree.Sdk);
proj.AddFileToBuild(target, fileGuidSqlite);
string fileGuidLibz = proj.AddFile("usr/lib/libz.tbd", "Libraries/libz.tbd", PBXSourceTree.Sdk);
proj.AddFileToBuild(target, fileGuidLibz);
string fileGuidLibc= proj.AddFile("usr/lib/libc++.tbd", "Libraries/libc++.tbd", PBXSourceTree.Sdk);
proj.AddFileToBuild(target, fileGuidLibc);
string fileGuidLibstdc = proj.AddFile("usr/lib/libstdc++.tbd", "Libraries/libstdc++.tbd", PBXSourceTree.Sdk);
proj.AddFileToBuild(target, fileGuidLibstdc);
//修改属性
proj.SetBuildProperty(target,"ENABLE_BITCODE", "NO");
proj.SetBuildProperty(target,"GCC_ENABLE_CPP_EXCEPTIONS", "YES");
proj.SetBuildProperty(target,"GCC_ENABLE_OBJC_EXCEPTIONS", "YES");
proj.SetBuildProperty(target,"GCC_ENABLE_CPP_RTTI", "YES");
proj.AddBuildProperty(target, "OTHER_LDFLAGS", "-ObjC");
proj.AddBuildProperty(target, "OTHER_LDFLAGS", "-force_load");
//添加Framework Search Paths、Header Search Paths、Library Search Paths
//(这里默认的是non-recursive, 暂时不知道怎么添加recursive)
proj.AddBuildProperty(target, "FRAMEWORK_SEARCH_PATHS", "xxxx");
proj.AddBuildProperty(target, "LIBRARY_SEARCH_PATHS", "xxxx");
proj.AddBuildProperty(target, "HEADER_SEARCH_PATHS", "xxxx");
File.WriteAllText(projPath, proj.WriteToString());
//2、修改Info.plist文件
var plistPath = Path.Combine(path, "Info.plist");
var plist = new PlistDocument();
plist.ReadFromFile(plistPath);
//类似的都可以这样添加,这个比较简单
//选择语言(字符串)
plist.root.SetString("CFBundleDevelopmentRegion", "xxxx");
//设置LSApplicationQueriesSchemes(数组)
PlistElementArray loginChannelsArr;
loginChannelsArr = plist.root.CreateArray("LSApplicationQueriesSchemes");
loginChannelsArr.AddString("xxxx");
//配置金额(字典)
PlistElementDict plistMoneyDic;
plistMoneyDic = plist.root.CreateDict("Dict");
plistMoneyDic.SetString("key", "value");
//(bool值)
plist.root.SetBoolean("supportMobile",false);
//复杂的是,配置urlSchemes(数组里面有字典,字典里面有子数组)
PlistElementArray urlTypes = plist.root.CreateArray("CFBundleURLTypes");
PlistElementDict itemDict;
itemDict = urlTypes.AddDict();
itemDict.SetString("CFBundleTypeRole","Editor");
itemDict.SetString("CFBundleURLName", "xxxx");
PlistElementArray schemesArray1 = itemDict.CreateArray("CFBundleURLSchemes");
schemesArray1.AddString("xxxx");
itemDict = urlTypes.AddDict();
itemDict.SetString("CFBundleTypeRole", "Editor");
PlistElementArray schemesArray2 = itemDict.CreateArray("CFBundleURLSchemes");
schemesArray2.AddString("xxxx");
itemDict = urlTypes.AddDict();
itemDict.SetString("CFBundleTypeRole", "Editor");
itemDict.SetString("CFBundleURLName", "xxxx");
PlistElementArray schemesArray3 = itemDict.CreateArray("CFBundleURLSchemes");
schemesArray3.AddString("xxxx");
File.WriteAllText(plistPath, plist.WriteToString());
//< array > //这里是Xcode工程中urlSchemes的源码
// < dict >
// < key > CFBundleTypeRole </ key >
// < string > Editor </ string >
// < key > CFBundleURLName </ key >
// < string > XXXX </ string >
// < key > CFBundleURLSchemes </ key >
// < array >
// < string > XXXX </ string >
// </ array >
// </ dict >
// < dict >
// < key > CFBundleTypeRole </ key >
// < string > Editor </ string >
// < key > CFBundleURLSchemes </ key >
// < array >
// < string > XXXX </ string >
// </ array >
// </ dict >
// < dict >
// < key > CFBundleTypeRole </ key >
// < string > Editor </ string >
// < key > CFBundleURLName </ key >
// < string > XXXX </ string >
// < key > CFBundleURLSchemes </ key >
// < array >
// < string > XXXX </ string >
// </ array >
// </ dict >
// </ array >";
//3、修改代码
//读取UnityAppController.mm文件
UnityEditor.XCodeEditor.XClass UnityAppController = new UnityEditor.XCodeEditor.XClass(path + "/Classes/UnityAppController.mm");
//在指定代码后面增加一行代码
UnityAppController.WriteBelow("#include \"PluginBase/AppDelegateListener.h\"", "\n#import <XXXX.h>");
//google登录
string adInitCds = " //google登录\n XXXX你的代码XXXX ";
UnityAppController.WriteBelow("AppController_SendNotificationWithArg(kUnityOnOpenURL, notifData);\n", adInitCds);
//-(void)application:(UIApplication*)application didFinishLaunchingWithOptions:(nullable NSDictionary*)launchOptions
string adfaceInitCds = " //Facebook 登录\n XXXX你的代码XXXX ";
UnityAppController.WriteBelow("[KeyboardDelegate Initialize];\n", adfaceInitCds);
string adfacebookInitCds = " //Facebook 登录\n XXXX你的代码XXXX";
UnityAppController.WriteBelow("_didResignActive = false;\n", adfacebookInitCds);
}
这里是XcodeAPI设置URLSchemes的代码,我上边的代码就是仿造这个写的!
还有一点就是引用第三方的库没有试验,有机会再学习!