iOS-开发进阶01:多环境配置
<p>文章搬运来源:https://www.jianshu.com/p/c40b31400816<br>作者:differ_iOS</p>
<p><strong>对iOS开发感兴趣,可以看一下作者的iOS交流群:812157648,大家可以在里面吹水、交流相关方面的知识,群里还有我整理的有关于面试的一些资料,欢迎大家加群,大家一起开车</strong></p>
<p>本篇文章主要介绍<strong>多环境配置</strong> & <strong>Mach-O与链接器</strong> & <strong>Symbol</strong></p>
<h1 id="一多环境配置">一、多环境配置</h1>
<p>多环境配置主要有以下几种形式:</p>
<ul>
<li>Project: 包含了项目的所有的代码、资源文件、所有信息...</li>
<li>Target: 对指定代码和资源文件的具体构建方法</li>
<li>Scheme:对指定Target的环境配置</li>
<li>xconfig:将配置写到对应的文件中</li>
</ul>
<h5 id="1创建多target">1、创建多Target</h5>
<p><img src="//upload-images.jianshu.io/upload_images/2987980-a74599ef7c3b9da0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/766/format/webp"></p>
<blockquote>
<ul>
<li>通过多<code>Target</code>可对不同的<code>Target</code>设置不同的<code>Bundle ID</code>用于区分<code>开发ID</code>或<code>生产ID</code></li>
<li>也可以针对不同的<code>Target</code>配置不同的<code>App Icon、App Display Name</code></li>
<li>还可以在<code>Build Phases</code>中针对不同的<code>Target</code><strong>增减编译的源文件</strong>和资源文件</li>
</ul>
</blockquote>
<h5 id="应用场景仅在开发target下测试一个功能">应用场景:仅在开发Target下测试一个功能</h5>
<p>如果是<code>OC</code>代码中使用<code>DEV</code>预定义宏:</p>
<p><img src="//upload-images.jianshu.io/upload_images/2987980-243dcf3720792181.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/873/format/webp"></p>
<p>如果是<code>Swift</code>代码中使用<code>DEV</code>预定义宏:</p>
<p><img src="//upload-images.jianshu.io/upload_images/2987980-2e142cb129ccd4f2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/864/format/webp"></p>
<p>其中-D的含义查看如下:(也就是将声明的变量设置为TRUE)</p>
<p><img src="//upload-images.jianshu.io/upload_images/2987980-2507e0230d584358.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/916/format/webp"></p>
<p>使用如下代码即可实现:</p>
<pre><code>#if DEV
NSLog(@"DEV");
#else
NSLog(@"xxx");
#endif
</code></pre>
<h5 id="2创建scheme">2、创建Scheme</h5>
<p><img src="//upload-images.jianshu.io/upload_images/2987980-e44545b995b5ace3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/735/format/webp"></p>
<p>通过添加不同的<code>Scheme</code>对应不同开发环境</p>
<p><img src="//upload-images.jianshu.io/upload_images/2987980-ffdf613a12aa0cb4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/768/format/webp"></p>
<h5 id="应用场景不同的开发环境配置不同的host">应用场景:不同的开发环境配置不同的HOST</h5>
<p><img src="//upload-images.jianshu.io/upload_images/2987980-4eb91ee0076358cd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/879/format/webp"></p>
<p><img src="//upload-images.jianshu.io/upload_images/2987980-3c3c382dc5d2345b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/826/format/webp"></p>
<p><code>Info.plist</code>中添加如下字段供外界调用:</p>
<p><img src="//upload-images.jianshu.io/upload_images/2987980-d1d2cb5ada4dae93.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/701/format/webp"></p>
<p>使用代码如下:</p>
<pre><code>NSString *infoPath = ;
NSDictionary *infoDic = [ initWithContentsOfFile:infoPath];
NSLog(@"%@",infoDic[@"HOST_URL"]);
</code></pre>
<blockquote>
<p>通过多<code>Scheme</code>也可以通过<code>Build Settings</code>配置不同的图标...</p>
</blockquote>
<h5 id="3通过xcconfig文件管理build-settings中的配置">3、通过xcconfig文件管理Build Settings中的配置</h5>
<p>Pod 中引入的文件就是通过<code>xcconfig</code>文件管理<code>Build Settings</code>中的配置</p>
<p><img src="//upload-images.jianshu.io/upload_images/2987980-06466a45df24806d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1072/format/webp"></p>
<p>创建自己的<code>xcconfig</code>文件,并修改系统<code>xcconfig</code>文件配置:</p>
<p><img src="//upload-images.jianshu.io/upload_images/2987980-273686a9660c7164.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1024/format/webp"></p>
<blockquote>
<p>注意:<code>xcconfig</code>文件的命名需要以所在文件夹的名称作为前缀然后是项目名、环境名称</p>
</blockquote>
<h5 id="使用xcconfig定义不同环境的host_url">使用<code>xcconfig</code>定义不同环境的<code>HOST_URL</code></h5>
<p><code>Config-TestCode-debug.xcconfig</code>文件中添加:<code>HOST_URL = http://192.168.1.100</code></p>
<p><code>Info.plist</code>中添加如下字段供外界调用:</p>
<p><img src="//upload-images.jianshu.io/upload_images/2987980-d1d2cb5ada4dae93.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/701/format/webp"></p>
<p>使用代码如下:</p>
<pre><code>NSString *infoPath = ;
NSDictionary *infoDic = [ initWithContentsOfFile:infoPath];
NSLog(@"%@",infoDic[@"HOST_URL"]);
</code></pre>
<h5 id="config-testcode-debugxcconfig文件中添加动态库的配置other_ldflags---framework-afnetworking"><code>Config-TestCode-debug.xcconfig</code>文件中添加动态库的配置:<code>OTHER_LDFLAGS = -framework "AFNetworking"</code></h5>
<pre><code>HOST_URL = 192.168.1.100
// ld
OTHER_LDFLAGS = -framework "AFNetworking"
</code></pre>
<blockquote>
<p><code>xcconfig</code>文件本质就是<code>Key-Value</code>,可以配置<code>Build Settings</code>中的绝大部分字段<br>
<code>xcconfig</code>文件中对应<code>Build Settings</code>中字段的缩写对应关系参考: Xcode Build Settings</p>
</blockquote>
<h1 id="二xcconfig文件冲突解决">二、xcconfig文件冲突解决</h1>
<p>如果使用自己创建的<code>xcconfig</code>文件那么执行<code>pod install</code>就会提示我们<code>pod</code>生成的<code>xcconfig</code>文件可能不会产生效果。要解决这个问题就需要在我们自己创建的<code>xcconfig</code>文件中引入<code>pod</code>生成的<code>xcconfig</code>文件:</p>
<pre><code>// 绝对路径、相对路径都可以
#include "Pods/Target Support Files/Pods-TestCode/Pods-TestCode.debug.xcconfig"
</code></pre>
<p>自己创建的<code>xcconfig</code>文件中存在<code>pod</code>生成的<code>xcconfig</code>文件中相同的字段,那么就会覆盖<code>pod</code>中的字段,因此要想两个文件中的字段都生效需要使用<strong>继承</strong>标识:</p>
<pre><code>OTHER_LDFLAGS = $(inherited) -framework "AFNetworking"
</code></pre>
<h1 id="三xconfig文件使用中的问题">三、xconfig文件使用中的问题</h1>
<h5 id="1url变量中存在后面的字符串会被当做注释">1、URL变量中存在//,后面的字符串会被当做注释</h5>
<pre><code>// 通过定义一个变量来解决
SLASH =/
HOST_URL = http:${SLASH}/192.168.1.100
</code></pre>
<h5 id="2使用变量时和包括变量作用相同">2、使用变量时${}和$()包括变量作用相同</h5>
<h5 id="3条件设置">3、条件设置</h5>
<h6 id="other_ldflagsconfigdebugsdkiphonesimulatorarchx86_64--inherited--framework-afnetworking">OTHER_LDFLAGS[<code>config=Debug</code>][<code>sdk=iphonesimulator*</code>][<code>arch=x86_64</code>] = $(inherited) -framework "AFNetworking"</h6>
<p>经过上述条件设置后<code>AFNetworking</code>库仅会在<code>Debug、模拟器、X86_64</code>架构下编译<br>
表示真机</p><br><br>
来源:https://www.cnblogs.com/fadaijun/p/14366857.html
頁:
[1]