Unity ios一键出包

因为一直使用的Unity开发项目,对xcode不是很熟,但是每次出包是在是太麻烦了,所以打算弄个一键出包的工具。
在unity中,我们每次出包,unity有自动回调函数:
[PostProcessBuild(100)]
public static void OnPostProcessBuild(BuildTarget target, string pathToBuildProject)
{
}
其中PostProcessBuild在UnityEditor.Callbacks这个命名空间下。
我们给函数设置这个attribute后,Unity在每次到处工程师就会自动调用这个函数。注意:函数参数是固定的。
如果各位使用的Unity是最新版2017的话,就要容易很多,因为unity已经自带了很多函数功能,如果使用的是没有这些功能的版本的话,那么就需要各位自己导入了。
地址: https://bitbucket.org/Unity-Technologies/xcodeapi/overview
这是unity 已经帮我们处理好的XCode函数,不在需要我们自己在实现了。
下载解压运行,项目需要引用到一个nunit.framework的dll,各位可以自行百度或则在这个地址下载安装: http://nunit.org/download/
安装完成后重新设置引用。因为这个工程的命名空间和Unity的命名空间是一样的,所以大家需要重新全局修改一下命名空间,可以直接全局替换,只要和Unity的不一样就可以了。
修改完成后到这一步大家就可以编译dll了,将编译的dll导入到unity中。
我们导出项目需要设置的一般是这几个部分:
1:Capabilities
2:info.plist文件
3:framework
4:源代码
我们一个一个来。
设置Capabilities:
public static void SetCapabilities(string pathToBuildProject)
{
string projPath = pathToBuildProject + "/Unity-iPhone.xcodeproj/project.pbxproj"; //项目路径,这个路径在mac上默认是不显示的,需要右键->显示包内容才能看到。unity到处的名字就是这个。
PBXProject _pbxProj = new PBXProject();//创建xcode project类

_pbxProj.ReadFromString(File.ReadAllText(projPath));//xcode project读入
string _targetGuid = _pbxProj.TargetGuidByName("Unity-iPhone");//获得Target名

var capManager = new ProjectCapabilityManager(projPath, "XXXXX(自己替换).entitlements", PBXProject.GetUnityTargetName());//创建设置Capability类
capManager.AddPushNotifications(true);//设置Capability
capManager.AddGameCenter();
capManager.AddInAppPurchase();
capManager.WriteToFile();//写入文件保存
}
Unity ios一键出包_第1张图片
Capability有很多,大家根据自己的项目设置就好了.
设置info.plist文件
public static void SetInfo(string pathToBuildProject)
{
string _plistPath = pathToBuildProject + "/Info.plist";
PlistDocument _plist = new PlistDocument();

_plist.ReadFromString(File.ReadAllText(_plistPath));
PlistElementDict _rootDic = _plist.root;

_rootDic.SetString("NSContactsUsageDescription", "通讯录");
_rootDic.SetString("NSMicrophoneUsageDescription", "麦克风");
_rootDic.SetString("NSPhotoLibraryUsageDescription", "相册");
_rootDic.SetString("NSCameraUsageDescription", "相机");
_rootDic.SetString("NSLocationAlwaysUsageDescription", "地理位置");

File.WriteAllText(_plistPath, _plist.WriteToString());
}
添加framework文件
public static void AddFramework(string pathToBuildProject)
{
string xcodeProjectPath = pathToBuildProject + "/Unity-iPhone.xcodeproj/project.pbxproj";

PBXProject xcodeProject = new PBXProject();
xcodeProject.ReadFromFile(xcodeProjectPath);

string xcodeTarget = xcodeProject.TargetGuidByName("Unity-iPhone");

xcodeProject.AddFrameworkToProject(xcodeTarget, "SafariServices.framework", true);
xcodeProject.AddFrameworkToProject(xcodeTarget, "WebKit.framework", true);
xcodeProject.AddFrameworkToProject(xcodeTarget, "GameKit.framework", true);

// Save the changes to Xcode project file.
xcodeProject.WriteToFile(xcodeProjectPath);

}
设置buildSetting
public static void SetBuildSettings(string pathToBuildProject)
{
string projPath = pathToBuildProject + "/Unity-iPhone.xcodeproj/project.pbxproj";
PBXProject _pbxProj = new PBXProject();

_pbxProj.ReadFromString(File.ReadAllText(projPath));
string _targetGuid = _pbxProj.TargetGuidByName("Unity-iPhone");

string debugConfig = _pbxProj.BuildConfigByName(_targetGuid, "Debug");
string releaseConfig = _pbxProj.BuildConfigByName(_targetGuid, "Release");

_pbxProj.SetBuildPropertyForConfig(debugConfig, "PROVISIONING_PROFILE", "证书");
_pbxProj.SetBuildPropertyForConfig(releaseConfig, "PROVISIONING_PROFILE", "证书");
_pbxProj.SetBuildPropertyForConfig(debugConfig, "PROVISIONING_PROFILE(Deprecated)", "证书");
_pbxProj.SetBuildPropertyForConfig(releaseConfig, "PROVISIONING_PROFILE(Deprecated)", "证书");

_pbxProj.SetBuildPropertyForConfig(debugConfig, "CODE_SIGN_IDENTITY", "自己的证书");
_pbxProj.SetBuildPropertyForConfig(releaseConfig, "CODE_SIGN_IDENTITY", "自己的证书");

_pbxProj.SetTeamId(_targetGuid, "Team ID(自己的teamid)");

File.WriteAllText(projPath, _pbxProj.WriteToString());
}
//修改类文件
public static void SetClass(string pathToBuildProject)
{
XClass FullScreenVideoPlayer = new XClass(pathToBuildProject + "/Classes/Unity/FullScreenVideoPlayer.mm");

//在指定代码后面增加一行
FullScreenVideoPlayer.WriteEnd(@"
@interface UIWindow (VideoPlay)
@end

@implementation UIWindow(VideoPlay)
- (void)touchesBegan:(NSSet*)touches withEvent: (UIEvent*)event
{
[super touchesBegan: touches withEvent: event];

NSString *version = [UIDevice currentDevice].systemVersion;
if(version.doubleValue >= 11 && UnityIsFullScreenPlaying())
{
UnityStopFullScreenVideoIfPlaying();
}
}
@end");

XClass UnityAppController = new XClass(pathToBuildProject + "/Classes/UnityAppController.h");

UnityAppController.Replace("inline UnityAppController* GetAppController()", "static inline UnityAppController* GetAppController()");
}

接下来我们设置出包函数(还是在Unity中)
public static void BuildIOSProject()
{
//在这里大家可以处理一些需要打包特殊处理的东西,例如某些文件夹不需要先拷贝出去,等打包完成后在拷贝回来之类的
string result = BuildPipeline.BuildPlayer(levels, location, BuildTarget.iOS, BuildOptions.Il2CPP);

}


到这一步我们的Unity就设置好了.接下来我们开始准备编译的sh文件了。

#!/bin/bash
#UNITY程序的路径#
UNITY_PATH=/Applications/Unity/Unity.app/Contents/MacOS/Unity
#工程的路径#
Client_PATH=`pwd`

$UNITY_PATH -projectPath $Client_PATH -batchmode -executeMe thod IOSTool.BuildIOSProject -quit

这时候就可以运行打包了,打包出来的是XCode工程

接下来我们要把XCode工程打包成我们需要的ipa包了
xcodebuild archive -project "$xcodeProject(路径)" -scheme Unity-iPhone -configuration Release -archivePath "$xcodearchive(路径)"

xcodearchive一般在这个路径下
xcodearchive(=/Users/(自己的用户名)/Library/Developer/Xcode/Archives/

xcodebuild -exportArchive -archivePath "$xcodearchive" -exportPath "$xcodeOutPath(ipa导出路径)" -exportOptionsPlist "plist配置路径"

如果需要帮助可以用xcodebuild -help 查看plist如何配置
这里放两个我自己的配置
/////Dis包
method
app-store
provisioningProfiles
com.XXX.XXX(包名)
5578c61e-e0bb-43a6-93b5-17b46ce78ef3(这里是证书的uuid)
/////Dev包
method
development
signingCertificate
iOS Developer
provisioningProfiles
com.XXXX.XXXX
a24e34ce-8d4b-4210-aa69-f7cd21623558
thinning
<thin-for-all-variants>
UUID如何查看呢,可以在mac使用 security cms -D -i XXX.mobileprovision  查看
因为我用的XCode的版本是, 打Dev包的时候需要设置 thinning,这个值有哪些可以用xcodebuild -help查看, 但是大家要注意这个值在配置表里面要使用 <thin-for-all-variants>因为xml里面字符串里面不能含有<>
运行,接下来就慢慢等出包完成了





你可能感兴趣的:(Unity开发)