是一个可以在U3D生成iOS所需Xcode项目时自动完成一些如添加framework,修改编译参数等操作的Editor插件。这个插件对于同一个项目需要接入各种不同渠道的SDK生成对应IPA的需求可以很方便快捷的实现自动化操作,降低项目维护复杂度。
在使用这个插件时,发现了些小问题,查看作者声明时发现其已经不在对这个插件进行维护了,于是只好自己动手做一些修改完善:
本文记录的就是对plist的处理功能,原代码逻辑中XCProject.cs中的ApplyMod函数会根据.projmods的信息对Xcode项目文件进行一系列的修改,其中一部是对项目.plist的修改,但这一步用我当时取到的github最新版本时会出错,仔细检查了下,发现无论projmods中的plist段写不写,生成对应的XCMod对象的plist总会是null,检查了下这个json数据解析生成类,发现plist的类型是“Hashtable”,而不像其他一些字段,如group是string,libs是ArrayList等,改换了下projmods中的json写法,又发现虽然可以解析成功不为null了,但实际修改plist逻辑又出现了问题,原逻辑是通过XCPlist的Process函数对projmods中提供的信息项对原项目plist进行合并修改,但是代码中对各种plist选项的处理不并完善,只有一个特殊if:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public void AddPlistItems( string key, object value, Dictionary< string , object > dict) { Debug.Log ( "AddPlistItems: key=" + key); if (key.CompareTo(PlistUrlType) == 0) { processUrlTypes((ArrayList)value, dict); } else { dict[key] = HashtableToDictionary< string , object >((Hashtable)value); plistModified = true ; } } |
会对URLSchemes做处理,显然这样无法实现通用的plist修改逻辑,思考过后我决定将其实现改为读取指定plist文件中的key项并与项目plist进行合并,覆盖已有的项,添加没有的项,具体实现如下:
首先,修改XCMod中plist属性的类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /* public Hashtable plist { get { return (Hashtable)_datastore["plist"]; } } */ public string plist { get { if (_datastore != null && _datastore.Contains( "plist" )) return ( string )_datastore[ "plist" ]; return string .Empty; } } |
这里我修改为了单string参数,如果有需要的话也可以改为ArrayList数组处理多个plist。然后,修改XCPlist类,加入如下合并处理函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public void Merge(XCPlist plist) { Dictionary< string , object > dict = (Dictionary< string , object >)PlistCS.Plist.readPlist(plistPath); Dictionary< string , object > dictMerge = (Dictionary< string , object >)PlistCS.Plist.readPlist(plist.plistPath); foreach (KeyValuePair< string , object > pair in dictMerge) { dict[pair.Key] = pair.Value; plistModified = true ; } if (plistModified) { PlistCS.Plist.writeXml(dict, plistPath); } } |
此函数实现合并plist中key及覆写值的功能。最后,修改XCProject类的”Adding plist items…”一步
1 2 3 4 5 6 7 8 9 | // Debug.Log ("Adding plist items..."); Debug.Log ( "Merging plist items..." ); if (! string .IsNullOrEmpty(mod.plist)) { string plistPath = this .projectRootPath + "/Info.plist" ; XCPlist plist = new XCPlist (plistPath); XCPlist mergePlist = new XCPlist(System.IO.Path.Combine( mod.path, mod.plist )); plist.Merge(mergePlist); // plist.Process (mod.plist); } |
使用Merge进行操作。参考如下合并plist
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 | <? xml version = "1.0" encoding = "UTF-8" ?> <! DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> < plist version = "1.0" > < dict > < key >CFBundleDevelopmentRegion</ key > < string >zh_CN</ string > < key >CFBundleURLTypes</ key > < array > < dict > < key >CFBundleTypeRole</ key > < string >Editor</ string > < key >CFBundleURLName</ key > < string >com.ky.xSDK.alipay</ string > < key >CFBundleURLSchemes</ key > < array > < string >com.unity.myapp</ string > </ array > </ dict > </ array > < key >LSApplicationQueriesSchemes</ key > < array > < string >alipay</ string > < string >weixin</ string > < string >mqqapiwallet</ string > </ array > < key >UIRequiresFullScreen</ key > < true /> < key >Unity_LoadingActivityIndicatorStyle</ key > < integer >-1</ integer > </ dict > </ plist > |
生成Xcode项目时,.projmods中的plist项指定此plist路径,插件会自动将此plist中的key项合并到生成项目的plist中,自动完成一些项目信息配置的修改。
博主友情提示:
如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。
加载更多