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 文件。

[AppleScript] 纯文本查看 复制代码
?
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包以后会自动回调一个静态方法。

[AppleScript] 纯文本查看 复制代码
?
1
2
< font face = "Verdana," >    [PostProcessBuild ( 100 ) ]
     public static void OnPostProcessBuild ( BuildTarget target , string pathToBuiltProject ) < / font >

         自动添加framework的原理其实就是等包打完以后,在这个方法里面进行文件的操作,把需要的framework plist oc 代码拷贝进去,或者修改它们。。
[AppleScript]  纯文本查看  复制代码
?
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增加一行 或者替换一行。
[AppleScript]  纯文本查看  复制代码
?
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生成的代码。 主要是增加代码和替换代码 两部分。。
[AppleScript]  纯文本查看  复制代码
?
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的方法在整理出来。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值