unity打IOS时会先生成一个Xcode工程,如果你需要增加一些第三方的framework那么需要手动一条一条的添加,这太烦了。。而且可能你还需要修改Plist文件,甚至还可能要修改unity自动生成的oc代码,每次打包都要修改的话,那太累了。。这篇文章就是全自动打包的第一步。。建议使用XUPorter,我在它的基础上拓展了两个类,一个用来修改plist,一个用来修改unity生成出来的OC代码。文章的最后我会给出代码。。
那么我用一个比较变态的SDK举个例子ShareSDK,它就需要自动添加framework,修改plist,还有要修改oc的代码。第一步打开XUPorter/Mods/share.projmods 文件。
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<
font
face
=
"Verdana,"
>
{
"group"
:
"share"
,
"libs"
:
[
"libicucore.dylib"
,
"libz.1.2.5.dylib"
]
,
"frameworks"
:
[
"SystemConfiguration.framework"
,
"QuartzCore.framework"
,
"CoreTelephony.framework"
,
"Security.framework"
,
"AdSupport.framework:optional"
,
"MessageUI.framework"
,
"StoreKit.framework"
,
"AudioToolbox.framework"
,
"QuartzCore.framework"
]
,
"headerpaths"
:
[]
,
"files"
:
[
"ShareSDK/Connection/SinaWeiboConnection.framework"
,
"ShareSDK/Connection/WeChatConnection.framework"
,
"ShareSDK/Core/AGCommon.framework"
,
"ShareSDK/Core/ShareSDKCoreService.framework"
,
"ShareSDK/ShareSDK.framework"
]
,
"folders"
:
[
"ShareSDK/"
]
,
"excludes"
:
[
"^.*.meta$"
,
"^.*.mdown$"
,
"^.*.pdf$"
]
,
"linker_flags"
:
[]
}
<
/
font
>
|
frameworks分成两种,一种是系统自带的framework还有一种是第三方的framework。 “frameworks”节点里面放的是系统自带的frameworks。”files”节点里面放的是第三方做出来的framework。 尤其是第三方的framework如果位置放的不对,就不会被xcode所引用的!切记切记!!folders:可以把某个文件夹下的所有文件拷贝在xcode工程里面,一般sdk都会附带一些oc的代码文件,最好通过folders把oc的代码拷贝在工程里面。或者你也可以把oc的代码放在plugins下面,同样打包的时候也会拷贝进xcode工程。unity打完IOS或者android包以后会自动回调一个静态方法。
1
2
|
<
font
face
=
"Verdana,"
>
[PostProcessBuild
(
100
)
]
public static void OnPostProcessBuild
(
BuildTarget
target
,
string
pathToBuiltProject
)
<
/
font
>
|
自动添加framework的原理其实就是等包打完以后,在这个方法里面进行文件的操作,把需要的framework plist oc 代码拷贝进去,或者修改它们。。
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
|
using
UnityEngine;
#if UNITY_EDITOR
using
UnityEditor;
using
UnityEditor.Callbacks;
using
UnityEditor.XCodeEditor;
using
System.Xml;
#endif
using
System.IO;
public static
class
XCodePostProcess
{
#if UNITY_EDITOR
[PostProcessBuild
(
100
)
]
public static void OnPostProcessBuild
(
BuildTarget
target
,
string
pathToBuiltProject
)
{
if
(
target
!
=
BuildTarget.iPhone
)
{
Debug.LogWarning
(
"Target is not iPhone. XCodePostProcess will not run"
)
;
return
;
}
/
/
得到xcode工程的路径
string
path
=
Path.GetFullPath
(
pathToBuiltProject
)
;
/
/
Create a
new
project object
from
build
target
XCProject project
=
new
XCProject
(
pathToBuiltProject
)
;
/
/
Find
and
run
through
all projmods files
to
patch
the
project.
/
/
Please pay attention
that
ALL projmods files
in
your project
folder
will be excuted!
/
/
在这里面把frameworks添加在你的xcode工程里面
string
[] files
=
Directory.GetFiles
(
Application.dataPath
,
"*.projmods"
,
SearchOption.AllDirectories
)
;
foreach
(
string
file
in
files
)
{
project.ApplyMod
(
file
)
;
}
/
/
增加一个编译标记。。没有的话sharesdk会报错。。
project.AddOtherLinkerFlags
(
"-licucore"
)
;
/
/
设置签名的证书, 第二个参数 你可以设置成你的证书
project.overwriteBuildSetting
(
"CODE_SIGN_IDENTITY"
,
"xxxxxx"
,
"Release"
)
;
project.overwriteBuildSetting
(
"CODE_SIGN_IDENTITY"
,
"xxxxxx"
,
"Debug"
)
;
/
/
编辑plist 文件
EditorPlist
(
path
)
;
/
/
编辑代码文件
EditorCode
(
path
)
;
/
/
Finally
save
the
xcode project
project.Save
(
)
;
}
private static void EditorPlist
(
string
filePath
)
{
XCPlist
list
=
new
XCPlist
(
filePath
)
;
string
bundle
=
"com.yusong.momo"
;
string
PlistAdd
=
@
"
CFBundleURLTypes
CFBundleTypeRole
Editor
CFBundleURLIconFile
Icon@2x
CFBundleURLName
"
+
bundle
+
@
"
CFBundleURLSchemes
ww123456
"
;
/
/
在plist里面增加一行
list
.AddKey
(
PlistAdd
)
;
/
/
在plist里面替换一行
list
.ReplaceKey
(
"com.yusong.${PRODUCT_NAME}"
,
""
+
bundle
+
""
)
;
/
/
保存
list
.Save
(
)
;
}
private static void EditorCode
(
string
filePath
)
{
/
/
读取UnityAppController.mm文件
XClass UnityAppController
=
new
XClass
(
filePath
+
"/Classes/UnityAppController.mm"
)
;
/
/
在指定代码后面增加一行代码
UnityAppController.WriteBelow
(
"#include \"
PluginBase
/
AppDelegateListener.h\
""
,
"#import "
)
;
/
/
在指定代码中替换一行
UnityAppController.Replace
(
"return YES;"
,
"return [ShareSDK handleOpenURL:url sourceApplication:sourceApplication annotation:annotation wxDelegate:nil];"
)
;
/
/
在指定代码后面增加一行
UnityAppController.WriteBelow
(
"UnityCleanup();}"
,
"- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{ return [ShareSDK handleOpenURL:url wxDelegate:nil];}"
)
;
}
#endif
}
|
在回到ShareSDK上,在接微信平台的时候,它们需要在pList 里面增加URL types选项,这里我通过XCPlist增加一行 或者替换一行。
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
using
UnityEngine;
using
System.Collections;
using
System.Collections.Generic;
using
System.IO;
namespace UnityEditor.XCodeEditor
{
public partial
class
XCPlist
:
System.IDisposable
{
private
string
filePath;
List
contents
=
new
List
(
)
;
public XCPlist
(
string
fPath
)
{
filePath
=
Path.Combine
(
fPath
,
"info.plist"
)
;
if
(
!System.IO.File.Exists
(
filePath
)
)
{
Debug.LogError
(
filePath
+
"路径下文件不存在"
)
;
return
;
}
FileInfo projectFileInfo
=
new
FileInfo
(
filePath
)
;
StreamReader sr
=
projectFileInfo.OpenText
(
)
;
while
(
sr.Peek
(
)
>
=
0
)
{
contents
.Add
(
sr.ReadLine
(
)
)
;
}
sr.Close
(
)
;
}
public void AddKey
(
string
key
)
{
if
(
contents
.Count
<
2
)
return
;
contents
.Insert
(
contents
.Count
-
2
,
key
)
;
}
public void ReplaceKey
(
string
key
,
string
replace
)
{
for
(
int i
=
0
;i
<
contents
.Count;i
+
+
)
{
if
(
contents
.IndexOf
(
key
)
!
=
-1
)
{
contents
=
contents
.Replace
(
key
,
replace
)
;
}
}
}
public void Save
(
)
{
StreamWriter saveFile
=
File.CreateText
(
filePath
)
;
foreach
(
string
line
in
contents
)
saveFile.WriteLine
(
line
)
;
saveFile.Close
(
)
;
}
public void Dispose
(
)
{
}
}
}
|
ShareSDK在接入微信平台的时候 必须修改Unity生成的UnityAppController.mm 文件,这里我通过 XClass 自动修改UnityAppController.mm生成的代码。 主要是增加代码和替换代码 两部分。。
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
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
+
"路径下文件不存在"
)
;
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
=
=
-1
)
{
Debug.LogError
(
filePath
+
"中没有找到标致"
+
below
)
;
return
;
}
int endIndex
=
text_all.LastIndexOf
(
""
,
beginIndex
+
below
.Length
)
;
text_all
=
text_all.Substring
(
0
,
endIndex
)
+
""
+
text
+
""
+
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
=
=
-1
)
{
Debug.LogError
(
filePath
+
"中没有找到标致"
+
below
)
;
return
;
}
text_all
=
text_all.Replace
(
below
,
newText
)
;
StreamWriter streamWriter
=
new
StreamWriter
(
filePath
)
;
streamWriter.Write
(
text_all
)
;
streamWriter.Close
(
)
;
}
public void Dispose
(
)
{
}
}
}
|
像这样,我就可以把unity生成的代码修改了。。
最后是工程地址:http://pan.baidu.com/s/1i3gLDTN
建议大家把工程下载下来看看一基本上就明白它的工作原理了。如果你掌握者本篇文章的知识 那么恭喜你 自动化打包就已经完成了一半。。 现在我们已经可以自动化生成 xcode工程了,等有时间的话我会把下一半shell 自动化打包.ipa的方法在整理出来。。