Unity3D研究院之IOS全自动编辑framework、plist、oc代码

Unity打IOS时会先生成一个Xcode工程,如果你需要增加一些第三方的framework那么需要手动一条一条的添加,这太烦了。。而且可能你还需要修改Plist文件,甚至还可能要修改unity自动生成的oc代码,每次打包都要修改的话,那太累了。。这篇文章就是全自动打包的第一步。。建议使用XUPorter,我在它的基础上拓展了两个类,一个用来修改plist,一个用来修改unity生成出来的OC代码。文章的最后我会给出代码。。

那么我用一个比较变态的SDK举个例子ShareSDK,它就需要自动添加framework,修改plist,还有要修改oc的代码。第一步打开XUPorter/Mods/share.projmods 文件。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

{

"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": []

}

 frameworks分成两种,一种是系统自带的framework还有一种是第三方的framework。 “frameworks”节点里面放的是系统自带的frameworks。”files”节点里面放的是第三方做出来的framework。 尤其是第三方的framework如果位置放的不对,就不会被xcode所引用的!切记切记!!

folders:可以把某个文件夹下的所有文件拷贝在xcode工程里面,一般sdk都会附带一些oc的代码文件,最好通过folders把oc的代码拷贝在工程里面。或者你也可以把oc的代码放在plugins下面,同样打包的时候也会拷贝进xcode工程。

unity打完IOS或者Android包以后会自动回调一个静态方法。

1

2

[PostProcessBuild (100)]

public static void OnPostProcessBuild (BuildTarget target, string pathToBuiltProject)

 自动添加framework的原理其实就是等包打完以后,在这个方法里面进行文件的操作,把需要的framework plist oc 代码拷贝进去,或者修改它们。。

1

2

3

4

5

6

7

8

9

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

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

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 = @"

<key>CFBundleURLTypes</key>

<array>

<dict>

<key>CFBundleTypeRole</key>

<string>Editor</string>

<key>CFBundleURLIconFile</key>

<string>[email protected]</string>

<key>CFBundleURLName</key>

<string>"+bundle+@"</string>

<key>CFBundleURLSchemes</key>

<array>

<string>ww123456</string>

</array>

</dict>

</array>";

//在plist里面增加一行

list.AddKey(PlistAdd);

//在plist里面替换一行

list.ReplaceKey("<string>com.yusong.${PRODUCT_NAME}</string>","<string>"+bundle+"</string>");

//保存

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 <ShareSDK/ShareSDK.h>");

//在指定代码中替换一行

UnityAppController.Replace("return YES;","return [ShareSDK handleOpenURL:url sourceApplication:sourceApplication annotation:annotation wxDelegate:nil];");

//在指定代码后面增加一行

UnityAppController.WriteBelow("UnityCleanup();\n}","- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url\r{\r    return [ShareSDK handleOpenURL:url wxDelegate:nil];\r}");

}

#endif

}

在回到ShareSDK上,在接微信平台的时候,它们需要在pList 里面增加URL types选项,这里我通过XCPlist增加一行 或者替换一行。

1

2

3

4

5

6

7

8

9

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<string> contents = new List<string>();

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[i].IndexOf(key) != -1){

contents[i] = contents[i].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生成的代码。 主要是增加代码和替换代码 两部分。。

1

2

3

4

5

6

7

8

9

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("\n", beginIndex + below.Length);

text_all = text_all.Substring(0, 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 == -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的方法在整理出来。。

Unity3D研究院之IOS全自动编辑framework、plist、oc代码

时间: 2024-08-25 20:32:06

Unity3D研究院之IOS全自动编辑framework、plist、oc代码的相关文章

Unity3D研究院之IOS全自动打包生成ipa

接着上一篇文章, 自动生成framework,这篇文章我把shell自动化打包ipa整理了一下,希望大家喜欢,嘿嘿.. 建议大家先看一下上一篇文章.http://www.xuanyusong.com/archives/2720 首先我们要先搞清楚nity全自动打包的重要步骤. 1.自动生成xcode工程. 2.自动生成.ipa和dsym文件. 3.上传appstore(本篇略) 首先我们在做渠道包时,一般每个渠道都有自己一些特殊的需求,比如 游戏名子 .游戏图标.SDK.等等.那么我在在做自动化

Unity3D研究院之IOS本地消息通知LocalNotification的使用

原地址:http://www.xuanyusong.com/archives/2632   现在的游戏里一般都会有本地消息,比如每天定时12点或者下午6点告诉玩家进入游戏领取体力.这种东西没必要服务器去推送,客户端就可以完成.Unity里面提供了本地任务的功能但是只有IOS上才支持,开始我有点不解为什么Android上不支持,当我把Android的本地通知做完后,我才明白.IOS源生的API中就支持固定时间循环推送,而Android上需要自己开启一个Services,启动一个AlarmManag

Unity3D 研究院之IOS高级界面发送消息与Unity3D消息的接收

今天和盆友们讨论IOS的高级界面与unity3d游戏引擎的交互,这个在开发中是非常重要的,unity3d 毕竟是一个面向多平台的一个游戏引擎,它不可能全部为IOS 考虑的面面俱到,引擎中也不存在针对IOS的高级界面的控件的使用. 本例实现游戏背景是Unity3D 的游戏世界,前面添加4个IOS的高级界面的按钮,并且点击这些按钮可以将消息传递给背景的Unity3D ,让它做一些事情. 上一章介绍了触摸IOS屏幕 移动摄像机的位置,下面有盆友问我说他不想移动摄像机的位置,就想移动物体的位置,我在这里

Unity3D研究院之IOS本地消息通知LocalNotification的使用(六十七)

来自:http://www.xuanyusong.com/archives/2632 现在的游戏里一般都会有本地消息,比如每天定时12点或者下午6点告诉玩家进入游戏领取体力.这种东西没必要服务器去推送,客户端就可以完成.Unity里面提供了本地任务的功能但是只有IOS上才支持,开始我有点不解为什么Android上不支持,当我把Android的本地通知做完后,我才明白.IOS源生的API中就支持固定时间循环推送,而Android上需要自己开启一个Services,启动一个AlarmManager的

【转载】Unity3D研究院之IOS&Andoird使用Sharesdk遇到的坑

这两天研究了一下ShareSDK,说实话挺好用的,但是还是有点坑的地方.那么雨松MOMO写下博文记录一下来我遇到的坑,嘿嘿. 大部分内容它的文档上已经说的很清楚了. http://wiki.sharesdk.cn/Unity3D%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E6%8C%87%E5%8D%97 这里我直说文档上没说的部分. 分享图片的时候 它的例子写的是 网络图片. content["image"] = “http://img.baidu.co

【转载】Unity3D研究院之IOS触摸屏手势控制镜头旋转与缩放

前几篇文章介绍了很多Unity3D引擎自身的一些问题, 今天我们在回到IOS设备上讨论一些触摸屏幕手势,本章的目标是通过触摸iPhone屏幕手势 实现模型左右的旋转,与模型的缩放. 大家想一想模型的旋转,实际上是镜头的旋转.模型的缩放实际上是镜头Z轴方向的坐标.那么实现本章的内容只需要控制镜头的位置方可实现. 我们创建一个简单的游戏平面, 然后平面中放一个箱子做为旋转缩放的参照物.如下图所示,选中摄像机,给摄像机添加一个脚本名称为Move. 脚本中有一个参数 Target,它的作用是设置摄像头旋

(转)Unity3D研究院之IOS&Android收集Log文件

转自:http://www.xuanyusong.com/archives/2477 有段时间没有写过文章了,不知道大伙儿还记得雨松MOMO吗? 嘿嘿. 开发项目的时候尤其在处理与服务器交互这块,如果服务端程序看不到客户端请求的Log信息,那么无法修改BUG.在Windows上Unity会自动讲Log文件写入本地,但是在IOS和Android上确没有这个功能,所以我想了个办法,把Log信息写在手机的客户端里.把如下脚本挂在任意游戏对象上即可. using UnityEngine; using S

【转载】Unity3D研究院之IOS自定义游戏摇杆与飞机平滑的移动

移动开发游戏中使用到的触摸游戏摇杆在iPhone上是非常普遍的,毕竟是全触摸屏手机,今天MOMO 通过一个小例子和大家讨论Unity3D 中如何自定义一个漂亮的全触摸游戏摇杆.        值得高兴的是,Unity3D 游戏引擎的标准资源中已经帮助我们封装了一个游戏摇杆脚本,所以实现部分的代码可以完全借助它的,具体调用需要我们自己来.  Joystick.js是官方提供的脚本,具体代码如下,有兴趣的朋友可以仔细研究研究,MOMO就不多说啦.哇咔咔- 1 2 3 4 5 6 7 8 9 10 1

Unity3D研究院之Jenkins的使用(七十八)

长夜漫漫无心睡眠,来一篇嘿嘿.我相信如果已经用Shell脚本完成IOS和Android打包的朋友一定需要Jenkins 怎么才能让策划打包ipa和apk?怎么才能彻底省去程序的时间,只要在同一局域网内不需要unity的开发环境,只要它有浏览器,它就能打包Jenkins无疑是最佳选择. Unity3D研究院之IOS全自动编辑framework.plist.oc代码(六十七) Unity3D研究院之IOS全自动打包生成ipa(六十八) Unity3D研究院之Android全自动打包生成apk(六十九