使用PostProcessBuild设定Unity产生的Xcode Project
简单来说就是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的更多相关文章
- 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 ...
- xcode project
An Xcode project is a repository for all the files, resources, and information required to build one ...
- vapor 生成xcode project 产生的错误解决方式
运行vapor xcode时报错: Could not generate Xcode project: error: terminated(72): xcrun --sdk macosx --find ...
- Could not automatically select an Xcode project
当把CocoaPods生成的workspace移动到上层目录时,需要改下Pods.xcconfig和工程里的一些设置,就通常没什么难度. 当遇到这个问题时: Could not automatical ...
- App Distribution Guide--(三)---Configuring Your Xcode Project for Distribution
Configuring Your Xcode Project for Distribution You can edit your project settings anytime, but some ...
- Unity导出的Xcode工程目录
Classes文件夹: Unity Runtime和ObjectC代码 main.mm和AppController.mm:应用程序入口点 iPhone_Profiler.h:定义了启用内部分析器(In ...
- Unity导出的Xcode项目,iOS端管理摄像头的方法
Vuforia导出的工程中管理摄像头问题 在以前的篇幅中提到了unity端和iOS端的动态交互.现在出现了一个问题.因为设备上的摄像机是实例化过来的.并且是一个单例.unity虽然已经不再显示了.但是 ...
- Xcode project 设置相关
FauxPas 这是一款Mac平台的用于检查Xcode项目的辅助工具 ,可以帮助我们找出常见的错误.隐藏的bug.不良实践以及可维护性问题和风格问题. 一, $(SRCROOT) :当前工程所在的目 ...
- iOS将Unity导出的Xcode工程导入到另一个Xcode项目, 及常见报错的解决方法
demo下载地址 http://pan.baidu.com/s/1pLcpKpl 1.Unity导出工程时设置bundle id要与项目一致 2.修改bit code为NO 3.删除Main.stor ...
随机推荐
- (iOS)关于UITableView设置contentsize(原创)
由于UITableView是继承自UIScrollView的,所以他是可以设置contentsize的. 但是,我在试验的过程中,初始化UITableView实例后,直接设置它的contentsize ...
- macOS平台下虚拟摄像头的研发总结
一.背景介绍 虚拟摄像头,顾名思义,就是利用软件技术虚拟出一个摄像头硬件设备供用户使用.当我们需要对视频图像进行处理再输出时,虚拟摄像头就具备非常大的价值了.关于如何在Windwos上实现一个虚拟设备 ...
- Redis分布式锁
Redis分布式锁 分布式锁是许多环境中非常有用的原语,其中不同的进程必须以相互排斥的方式与共享资源一起运行. 有许多图书馆和博客文章描述了如何使用Redis实现DLM(分布式锁管理器),但是每个库都 ...
- 【Java并发】详解 AbstractQueuedSynchronizer
前言 队列同步器 AbstractQueuedSynchronizer(以下简称 AQS),是用来构建锁或者其他同步组件的基础框架.它使用一个 int 成员变量来表示同步状态,通过 CAS 操作对同步 ...
- 深度学习开发环境搭建教程(Mac篇)
本文将指导你如何在自己的Mac上部署Theano + Keras的深度学习开发环境. 如果你的Mac不自带NVIDIA的独立显卡(例如15寸以下或者17年新款的Macbook.具体可以在"关 ...
- Android系统--输入系统(六)模拟输入驱动程序
Android系统--输入系统(六)模拟输入驱动程序 1. 回顾输入子系统 简单字符设备驱动:应用程序通过调用驱动所实现的函数使能硬件. 输入子系统:由于有多个应用程序使用输入子系统,故肯定使用的是早 ...
- C#图解教程-方法参数笔记(上)
一晃大学四年要过去了,期间乱点了很多技能点, 导致每一项技能都只是处于入门阶段.为了将C#作为我的主要技能,准备恶补相关姿势(知识),通过各种技术论坛的推荐,找到了<C#图解教程>这本书. ...
- linux c socket笔记 -服务端
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types. ...
- 解决Javascript大数据列表引起的网页加载慢/卡死问题。
在一些网页应用中,有时会碰到一个超级巨大的列表,成千上万行,这时大部份浏览器解析起来就非常痛苦了(有可能直接卡死). 也许你们会说可以分页或动态加载啊?但是有可能需求不允许分页,动态加载?网络的延迟也 ...
- C语言精要总结-内存地址对齐与struct大小判断篇
在笔试时,经常会遇到结构体大小的问题,实际就是在考内存地址对齐.在实际开发中,如果一个结构体会在内存中高频地分配创建,那么掌握内存地址对齐规则,通过简单地自定义对齐方式,或者调整结构体成员的顺序,可以 ...