简单来说就是unity提供一套api去修改xcode项目工程配置以及修改plist文件内容(当unity build结束后, 会自动回调OnPostProcessBuild).

以下是一些用到的配置处理:

ENABLE_BITCODE
AddFramework
https
NSPhotoLibraryUsageDescription
 [PostProcessBuild]
public static void OnPostprocessBuild(BuildTarget BuildTarget, string path)
{
if (BuildTarget == BuildTarget.iOS)
{
UnityEngine.Debug.Log("XCodePostProcess: Starting to perform post build tasks for iOS platform."); /*======== projPath ========*/
string projPath = path + "/Unity-iPhone.xcodeproj/project.pbxproj"; PBXProject proj = new PBXProject();
proj.ReadFromFile(projPath); string target = proj.TargetGuidByName("Unity-iPhone"); // ENABLE_BITCODE=False
proj.SetBuildProperty(target, "ENABLE_BITCODE", "false"); // add extra framework(s)
proj.AddFrameworkToProject(target, "Security.framework", false);
proj.AddFrameworkToProject(target, "CoreTelephony.framework", true);
proj.AddFrameworkToProject(target, "libz.tbd", true); // rewrite to file
File.WriteAllText(projPath, proj.WriteToString()); string plistPath = path + "/Info.plist";
PlistDocument plist = new PlistDocument();
plist.ReadFromString(File.ReadAllText(plistPath)); // Get root
PlistElementDict rootDict = plist.root; /* ipad 关闭分屏 */
rootDict.SetBoolean("UIRequiresFullScreen", true); var now = System.DateTime.Now;
string time = string.Format("{0}_{1}_{2} {3}:{4}:{5}", now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second);
/* 设置Build值 */
rootDict.SetString("CFBundleVersion", string.Format("{0}({1})", GlobalVars.VERSION, time)); /* iOS9所有的app对外http协议默认要求改成https */
// Add value of NSAppTransportSecurity in Xcode plist
var atsKey = "NSAppTransportSecurity"; PlistElementDict dictTmp = rootDict.CreateDict( atsKey );
dictTmp.SetBoolean( "NSAllowsArbitraryLoads", true); // location native development region
rootDict.SetString("CFBundleDevelopmentRegion", "zh_CN"); // for share sdk 截屏
rootDict.SetString("NSPhotoLibraryUsageDescription", "We need use photo library usage"); // Write to file
File.WriteAllText(plistPath, plist.WriteToString()); }
}

在Info.plist里添加URL Scheme:

 /*======== plist ========*/
string plistPath = path + "/Info.plist";
PlistDocument plist = new PlistDocument();
plist.ReadFromString(File.ReadAllText(plistPath)); // Get root
PlistElementDict rootDict = plist.root; // URL schemes 追加
var urlTypeArray = plist.root.CreateArray("CFBundleURLTypes");
var urlTypeDict = urlTypeArray.AddDict();
urlTypeDict.SetString("CFBundleTypeRole", "Editor");
urlTypeDict.SetString("CFBundleURLName", "OpenApp");
var urlScheme = urlTypeDict.CreateArray("CFBundleURLSchemes");
urlScheme.AddString("sampleApp"); urlTypeDict = urlTypeArray.AddDict();
urlTypeDict.SetString("CFBundleURLName", "com.abc.sampleApp");
urlScheme = urlTypeDict.CreateArray("CFBundleURLSchemes");
urlScheme.AddString("sampleApp2");

有些第三方的sdk需要在appController里加一些“料”,比如Adjust SDK的deeplink功能,需要在openUrl里加[Adjust appWillOpenUrl:url];,也需要在continueUserActivity函数里作相应处理。这里的处理参考了雨松大大的博客。

首先是XClass这个类:

 using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO; namespace UnityEditor.XCodeEditor
{
public partial class XClass : System.IDisposable
{ private string filePath; public XClass(string fPath)
{
filePath = fPath;
if (!System.IO.File.Exists(filePath))
{
Debug.LogError(filePath + "not found in path.");
return;
}
} public void WriteBelow(string below, string text)
{
StreamReader streamReader = new StreamReader(filePath);
string text_all = streamReader.ReadToEnd();
streamReader.Close(); int beginIndex = text_all.IndexOf(below);
if (beginIndex == -)
{
Debug.LogError(filePath + " not found sign in " + below);
return;
} int endIndex = text_all.LastIndexOf("\n", beginIndex + below.Length); text_all = text_all.Substring(, endIndex) + "\n" + text + "\n" + text_all.Substring(endIndex); StreamWriter streamWriter = new StreamWriter(filePath);
streamWriter.Write(text_all);
streamWriter.Close();
} public void Replace(string below, string newText)
{
StreamReader streamReader = new StreamReader(filePath);
string text_all = streamReader.ReadToEnd();
streamReader.Close(); int beginIndex = text_all.IndexOf(below);
if (beginIndex == -)
{
Debug.LogError(filePath + " not found sign in " + below);
return;
} text_all = text_all.Replace(below, newText);
StreamWriter streamWriter = new StreamWriter(filePath);
streamWriter.Write(text_all);
streamWriter.Close(); } public void Dispose()
{ }
}
}

然后还是在OnPostprocessBuild里进行hack:

 string xcodePath = Path.GetFullPath (path);
UnityEditor.XCodeEditor.XClass UnityAppController = new UnityEditor.XCodeEditor.XClass(xcodePath + "/Classes/UnityAppController.mm");
UnityAppController.WriteBelow("#include \"PluginBase/AppDelegateListener.h\"", "#include \"Adjust.h\"");
UnityAppController.WriteBelow("AppController_SendNotificationWithArg(kUnityOnOpenURL, notifData);","[Adjust appWillOpenUrl:url];");
UnityAppController.WriteBelow("SensorsCleanup();\n}", "- (BOOL)application:(UIApplication*)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray * _Nullable))restorationHandler\r{\rif ([[userActivity activityType] isEqualToString:NSUserActivityTypeBrowsingWeb])\r{\rNSURL *url = [userActivity webpageURL];\rNSURL *oldStyleDeepLink = [Adjust convertUniversalLink:url scheme:@\"sampleApp\"];\r[Adjust appWillOpenUrl:url];\r}\rreturn YES;\r}");

还在研究怎么加XCode Entitlement文件中。。。

使用PostProcessBuild设定Unity产生的Xcode Project的更多相关文章

  1. Differences Between Xcode Project Templates for iOS Apps

    Differences Between Xcode Project Templates for iOS Apps When you create a new iOS app project in Xc ...

  2. xcode project

    An Xcode project is a repository for all the files, resources, and information required to build one ...

  3. vapor 生成xcode project 产生的错误解决方式

    运行vapor xcode时报错: Could not generate Xcode project: error: terminated(72): xcrun --sdk macosx --find ...

  4. Could not automatically select an Xcode project

    当把CocoaPods生成的workspace移动到上层目录时,需要改下Pods.xcconfig和工程里的一些设置,就通常没什么难度. 当遇到这个问题时: Could not automatical ...

  5. App Distribution Guide--(三)---Configuring Your Xcode Project for Distribution

    Configuring Your Xcode Project for Distribution You can edit your project settings anytime, but some ...

  6. Unity导出的Xcode工程目录

    Classes文件夹: Unity Runtime和ObjectC代码 main.mm和AppController.mm:应用程序入口点 iPhone_Profiler.h:定义了启用内部分析器(In ...

  7. Unity导出的Xcode项目,iOS端管理摄像头的方法

    Vuforia导出的工程中管理摄像头问题 在以前的篇幅中提到了unity端和iOS端的动态交互.现在出现了一个问题.因为设备上的摄像机是实例化过来的.并且是一个单例.unity虽然已经不再显示了.但是 ...

  8. Xcode project 设置相关

    FauxPas 这是一款Mac平台的用于检查Xcode项目的辅助工具 ,可以帮助我们找出常见的错误.隐藏的bug.不良实践以及可维护性问题和风格问题. 一, $(SRCROOT)  :当前工程所在的目 ...

  9. iOS将Unity导出的Xcode工程导入到另一个Xcode项目, 及常见报错的解决方法

    demo下载地址 http://pan.baidu.com/s/1pLcpKpl 1.Unity导出工程时设置bundle id要与项目一致 2.修改bit code为NO 3.删除Main.stor ...

随机推荐

  1. input是否checked与使用jquery的attr或prop方法无关

    最近在项目中有这样一个需求,用户在下单时可以选择优惠券,也可取消选择,并且可以多次选择,取消. 这是一个典型的input标签checked功能,博主使用radio元素实现此需求,但是优惠券只能选中,不 ...

  2. Java线程池使用和分析(二) - execute()原理

    相关文章目录: Java线程池使用和分析(一) Java线程池使用和分析(二) - execute()原理 execute()是 java.util.concurrent.Executor接口中唯一的 ...

  3. 移动开发中使用的一些meta头部标签整理

    <!DOCTYPE html> <!-- 使用 HTML5 doctype,不区分大小写 --> <html lang="zh-cmn-Hans"&g ...

  4. sqlplus连接oracle问题

    第一次在自己电脑上连接远端数据库,尝试了一上午居然还没成功,后来在网上找了一堆的方法终于是连接上了    -_-!! 总结一下:简单操作:一步到位 我主要是用的oracle 11g的数据库,sqlpl ...

  5. 【Azure】Azure技能树

  6. 接口调用 GET方式

    /** * 第一步 视图展示 . 视图页面(忽略) * @return [type] [description] */ /** * 第二步 控制器先将要运行的接口处理好(接口及参数)传到到Model层 ...

  7. 10个漂亮的jQuery日历插件下载【转载】

    10个漂亮的jQuery日历插件下载 2013-08-07 标签:jQuery日历插件jQuery日历jQuery插件   日期是非常重要的,随时随地.微薄或网站的日期选取器日历必须在那里.您可以使用 ...

  8. Python-3------新年考试周的Python学习

    2016一开始就是考试周,准备专业课的考试复习.每天上午复习,晚上复习到8点半,之后到10点这点时间来看Python.庆幸没有在忙碌的时候荒废 Python的学习. 期待寒假,以前寒假在家总是没事做, ...

  9. test back

    python Mysql 下载地址 http://sourceforge.net/projects/mysql-python/

  10. 开始使用gentoo linux——gentoo安装笔记(下)

    gentoo安装笔记(下) 上一章,已经对操作系统安装做了充分准备,并且已经从livecd(u盘系统)切换进入了gentoo安装环境中. 不过现在才是真正的开始!打起精神!这可不是在装ubuntu! ...