<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Yan&#39;s</title>
  
  
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://blog.nubi.im/"/>
  <updated>2020-09-22T03:17:44.863Z</updated>
  <id>https://blog.nubi.im/</id>
  
  <author>
    <name>YAN</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>iOS知识点梳理：Objective-C语言特性</title>
    <link href="https://blog.nubi.im/archives/5db87dbc.html"/>
    <id>https://blog.nubi.im/archives/5db87dbc.html</id>
    <published>2020-09-21T03:26:02.000Z</published>
    <updated>2020-09-22T03:17:44.863Z</updated>
    
    <content type="html"><![CDATA[<img src="/archives/5db87dbc/0.png" class=""><a id="more"></a><h2 id="分类（Category）"><a href="#分类（Category）" class="headerlink" title="分类（Category）"></a>分类（Category）</h2><hr><h5 id="1-分类的应用："><a href="#1-分类的应用：" class="headerlink" title="1. 分类的应用："></a>1. 分类的应用：</h5><ul><li>声明私有方法</li><li>分解体积庞大的类文件</li><li>把Framework的私有方法公开</li></ul><h5 id="2-分类的特点（或者说与扩展的区别）："><a href="#2-分类的特点（或者说与扩展的区别）：" class="headerlink" title="2. 分类的特点（或者说与扩展的区别）："></a>2. 分类的特点（或者说与扩展的区别）：</h5><ul><li>运行时决议：在编写完分类文件后，并没有直接把分类内容添加到相关的宿主类上。而是在运行时使用runtime把分类的内容添加到宿主类上。</li><li>可以为系统类添加分类</li></ul><h5 id="3-分类的优、缺点："><a href="#3-分类的优、缺点：" class="headerlink" title="3. 分类的优、缺点："></a>3. 分类的优、缺点：</h5><p><strong>优点：</strong></p><ul><li>不需要通过增加子类而增加现有类的行为(方法),且类目中的方法与原始类方法基本没有区别</li><li>通过类目可以将庞大一个类的方法进行划分,从而便于代码的日后的维护、更新以及提高代码的阅读性</li></ul><p><strong>缺点：</strong></p><ul><li>无法向类目添加实例变量,如果需要添加实例变量,只能通过定义子类的方式</li><li>类目中的方法与原始类以及父类方法相比具有更高优先级,如果覆盖父类的方法,可能导致super消息的断裂。因此,最好不要覆盖原始类中的方法</li></ul><h5 id="4-分类加载流程："><a href="#4-分类加载流程：" class="headerlink" title="4. 分类加载流程："></a>4. 分类加载流程：</h5><p>在运行APP的时候，加载完动态链接库，会加载可执行文件，通过<code>runtime</code>生成类、成员变量、方法列表，在宿主类的方法列表生成完之后，会开始加载分类的方法列表。</p><p>取到所有分类的列表数组（按编译时的顺序排序），然后按倒序从分类列表里取出每个分类的方法列表，生成一个二维数组。</p><p>把二维数组中的方法，按正序即从0索引开始，放入到宿主类的方法列表中（一维的数组）。<br>所以分类才拥有了“覆盖”原有类的方法功能，其实是原方法是存在的，只是分类的方法列表加入到了原有类的方法数组的前边，获得优先执行权。</p><h5 id="5-分类中都可以添加哪些内容："><a href="#5-分类中都可以添加哪些内容：" class="headerlink" title="5. 分类中都可以添加哪些内容："></a>5. 分类中都可以添加哪些内容：</h5><ul><li>增加实例方法</li><li>增加类方法</li><li>增加协议</li><li>增加实例属性。在分类中定义了一个属性，实际上只声明了对应的get方法和set方法，并没有在分类中添加实例变量 var</li><li>增加实例变量（使用<code>runtime</code>关联对象技术来添加）⚠️</li></ul><p>在编译时候，分类会被编译成一个category_t的结构体，储存如下信息：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">struct category_t &#123;</span><br><span class="line">    const char *name;                           分类名称</span><br><span class="line">    classref_t cls;                             该分类所属的宿主类</span><br><span class="line">    struct method_list_t *instanceMethods;      实例方法列表</span><br><span class="line">    struct method_list_t *classMethods;         类方法列表</span><br><span class="line">    struct protocol_list_t *protocols;          协议列表</span><br><span class="line">    struct property_list_t *instanceProperties; 实例属性列表</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h5 id="6-分类添加过程："><a href="#6-分类添加过程：" class="headerlink" title="6. 分类添加过程："></a>6. 分类添加过程：</h5><p>在程序运行时候，runtime会把分类的实例方法等信息合并到类对象的实例方法列表中，会把分类的类方法合并到元类对象的类方法列表中。</p><p>以添加实例方法为例：<br>运行时候，会遍历分类列表，拿到每一个分类的实例方法列表</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">分类1的实例方法列表 array1 [method_t, method_t]</span><br><span class="line">分类2的实例方法列表 array2 [method_t, method_t]</span><br></pre></td></tr></table></figure><p>然后根据获取到的所有分类的实例方法列表数 和 原宿主类的实例方法列表，重新分配内存，数据结构为一个新的二维数组</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">new_array [所有分类的实例列表数目 + 宿主类的实例列表数][]</span><br></pre></td></tr></table></figure><p>最后把宿主类的实例列表移动都数组后面，并把所有分类的实例列表加入到新申请的二维数组的前边</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[</span><br><span class="line">array1,</span><br><span class="line">array2.</span><br><span class="line">[原宿主类的实例方法列表]</span><br><span class="line">]</span><br></pre></td></tr></table></figure><h5 id="7-加载调用栈："><a href="#7-加载调用栈：" class="headerlink" title="7. 加载调用栈："></a>7. 加载调用栈：</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">#系统库libSystem的Runtime入口函数</span><br><span class="line">void _objc_init(void)</span><br><span class="line">  </span><br><span class="line">#处理由dyld映射的镜像</span><br><span class="line">void map_images(unsigned count, const char * const paths[],const struct mach_header * const mhdrs[])</span><br><span class="line">void map_images_nolock(unsigned mhCount, const char * const mhPaths[],const struct mach_header * const mhdrs[])</span><br><span class="line">  </span><br><span class="line">#读取镜像</span><br><span class="line">void _read_images(header_info **hList, uint32_t hCount, int totalClasses, int unoptimizedTotalClasses)</span><br><span class="line">  </span><br><span class="line">#重新编译当前类的方法列表</span><br><span class="line">static void remethodizeClass(Class cls)</span><br><span class="line">  </span><br><span class="line">#将方法列表以及属性和协议从类别附加到类。</span><br><span class="line">static void attachCategories(Class cls, category_list *cats, bool flush_caches)</span><br></pre></td></tr></table></figure><h2 id="关联对象"><a href="#关联对象" class="headerlink" title="关联对象"></a>关联对象</h2><hr><h5 id="1-关联对象技术：-可以给分类添加成员变量"><a href="#1-关联对象技术：-可以给分类添加成员变量" class="headerlink" title="1. 关联对象技术： 可以给分类添加成员变量"></a>1. 关联对象技术： 可以给分类添加成员变量</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">#关联对象: 使用objc_setAssociatedObject函数可以给某个对象关联其他的对象。</span><br><span class="line">void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)</span><br><span class="line"> </span><br><span class="line">#获取关联的对象: 使用objc_getAssociatedObject函数可以通过键来取出某个对象的关联对象。</span><br><span class="line">id objc_getAssociatedObject(id object, const void *key)</span><br><span class="line"> </span><br><span class="line">#移除关联的对象:使用objc_removeAssociatedObjects函数可以移除某个对象身上的所有关联的对象。</span><br><span class="line">void objc_removeAssociatedObjects(id object)</span><br></pre></td></tr></table></figure><p>⚠️ <strong>注意：</strong><br><code>void objc_removeAssociatedObjects(id object)</code>函数移除的是某个对象身上的所有关联的对象。<br>Objective-C 没有给我们提供移除对象身上单个关联对象的函数，所以，我们一般通过<code>objc_setAssociatedObject</code> 函数传入 <code>nil</code> 来达到移除某个关联对象的目的：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">void objc_setAssociatedObject(object, key, nil, policy);</span><br><span class="line"></span><br><span class="line">key：    要保证全局唯一，key与关联的对象是一一对应关系，必须全局唯一</span><br><span class="line">value：  要关联的对象</span><br><span class="line">policy： 关联策略。有五种关联策略</span><br><span class="line">OBJC_ASSOCIATION_ASSIGN   等价于   @property(assign)</span><br><span class="line">OBJC_ASSOCIATION_RETAIN_NONATOMIC   等价于   @property(strong, nonatomic)</span><br><span class="line">OBJC_ASSOCIATION_COPY_NONATOMIC   等价于   @property(copy, nonatomic)</span><br><span class="line">OBJC_ASSOCIATION_RETAIN   等价于   @property(strong,atomic)</span><br><span class="line">OBJC_ASSOCIATION_COPY   等价于   @property(copy, atomic)</span><br></pre></td></tr></table></figure><h5 id="2-常见问题："><a href="#2-常见问题：" class="headerlink" title="2. 常见问题："></a>2. 常见问题：</h5><p><strong>问：关联对象技术给分类添加的成员变量放在了哪里？</strong><br>答：关联对象由<code>AssociationsManager</code>管理并在<code>AssociationsHashMap</code>存储。所有对象的关联内容都在同一个容器中。</p><p><strong>问：怎样清除某一个关联对象被关联的值？</strong><br>答：<code>setAssociatedObject</code>方法中<code>value</code>值设为<code>nil</code>即可。</p><h2 id="扩展（Extension）"><a href="#扩展（Extension）" class="headerlink" title="扩展（Extension）"></a>扩展（Extension）</h2><hr><h5 id="1-扩展的应用："><a href="#1-扩展的应用：" class="headerlink" title="1. 扩展的应用："></a>1. 扩展的应用：</h5><ul><li>声明私有属性</li><li>声明私有方法</li><li>声明私有成员变量</li></ul><h5 id="2-扩展的特点："><a href="#2-扩展的特点：" class="headerlink" title="2. 扩展的特点："></a>2. 扩展的特点：</h5><ul><li>编译时决议</li><li>只以声明的形式存在，多数情况下寄生于宿主类的.m实现文件中</li><li>不能为系统类添加拓展</li></ul><h2 id="协议和代理"><a href="#协议和代理" class="headerlink" title="协议和代理"></a>协议和代理</h2><hr><h5 id="1-代理的特点："><a href="#1-代理的特点：" class="headerlink" title="1. 代理的特点："></a>1. 代理的特点：</h5><ul><li>软件设计模式，代理模式</li><li>传递方式一对一</li></ul><h2 id="通知"><a href="#通知" class="headerlink" title="通知"></a>通知</h2><hr><h5 id="1-通知的特点："><a href="#1-通知的特点：" class="headerlink" title="1. 通知的特点："></a>1. 通知的特点：</h5><ul><li>是使用观察者模式来实现的用于跨层传递消息的机制</li><li>传递方式⼀对多</li></ul><h5 id="2-通知的流程："><a href="#2-通知的流程：" class="headerlink" title="2. 通知的流程："></a>2. 通知的流程：</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">发送者 &gt;  通知中心 &gt; 多个观察者</span><br></pre></td></tr></table></figure><h5 id="3-通知的实现机制"><a href="#3-通知的实现机制" class="headerlink" title="3. 通知的实现机制"></a>3. 通知的实现机制</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Notification_Map(notificationName: [observers])</span><br></pre></td></tr></table></figure><h2 id="KVO"><a href="#KVO" class="headerlink" title="KVO"></a>KVO</h2><hr><h5 id="1-什么是KVO："><a href="#1-什么是KVO：" class="headerlink" title="1. 什么是KVO："></a>1. 什么是KVO：</h5><ul><li>观察者设计模式的⼜一实现</li><li>使用<code>isa-swizzling</code>来实现KVO</li></ul><h5 id="2-isa-swizzling实现方式："><a href="#2-isa-swizzling实现方式：" class="headerlink" title="2. isa-swizzling实现方式："></a>2. <code>isa-swizzling</code>实现方式：</h5><p>当我们调用了 <code>addobvser</code> 之后，系统会动态的⽣成一个<code>NSKVONotifying_A</code>类，并用 <strong>A</strong> 类的<code>isa</code>指针指向它，<code>NSKOVNotifying_A</code>是 <strong>A</strong> 的子类，为了重写 <code>setter</code> ⽅法，以达到通知的功能</p><h5 id="3-通过-KVC-设置-Value-能否生效"><a href="#3-通过-KVC-设置-Value-能否生效" class="headerlink" title="3. 通过 KVC 设置 Value 能否生效?"></a>3. 通过 <code>KVC</code> 设置 <code>Value</code> 能否生效?</h5><p>系统在调用<code>KVC</code>赋值的时候，会先查找某一个变量是否有<code>setter</code>⽅法，如果有就会调用<code>setter</code>方法，如果没有，才会直接对成员变量直接赋值。所以，在调用<code>setter</code>⽅法的时候，<code>KVO</code>是生效的</p><h5 id="4-通过成员变量直接赋值Value能否生效"><a href="#4-通过成员变量直接赋值Value能否生效" class="headerlink" title="4. 通过成员变量直接赋值Value能否生效?"></a>4. 通过成员变量直接赋值<code>Value</code>能否生效?</h5><p>直接赋值<code>KVO</code>是不会生效的，但是可以在赋值的时候手动调用 <code>willChangeValueForKey</code> 和<code>didChangeValueForKey</code> 达到 <strong>KVO</strong> 通知的效果</p><h2 id="KVC"><a href="#KVC" class="headerlink" title="KVC"></a>KVC</h2><hr><h5 id="1-是否会破坏⾯向对象编程思想："><a href="#1-是否会破坏⾯向对象编程思想：" class="headerlink" title="1. 是否会破坏⾯向对象编程思想："></a>1. 是否会破坏⾯向对象编程思想：</h5><p><code>setValueForKey</code> 中的 <code>key</code> 是没有任何限制的，如果当用户知道某个对象里面私有成员变量量的<code>key</code>，就可以通过<code>key</code>对私有变量赋值或者访问，从这个⻆角度看，是破坏⾯面向对象编程思想的</p><h5 id="2-访问器器⽅方法判断规则："><a href="#2-访问器器⽅方法判断规则：" class="headerlink" title="2. 访问器器⽅方法判断规则："></a>2. 访问器器⽅方法判断规则：</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&lt;getKey&gt;</span><br><span class="line">&lt;key&gt;</span><br><span class="line">&lt;isKey&gt;</span><br></pre></td></tr></table></figure><h5 id="3-成员变量量判断规则："><a href="#3-成员变量量判断规则：" class="headerlink" title="3. 成员变量量判断规则："></a>3. 成员变量量判断规则：</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">_key </span><br><span class="line">_isKey</span><br><span class="line">key</span><br><span class="line">isKey</span><br></pre></td></tr></table></figure><h2 id="属性关键字"><a href="#属性关键字" class="headerlink" title="属性关键字"></a>属性关键字</h2><hr><h5 id="1-深拷贝和浅拷贝的区别："><a href="#1-深拷贝和浅拷贝的区别：" class="headerlink" title="1. 深拷贝和浅拷贝的区别："></a>1. 深拷贝和浅拷贝的区别：</h5><ul><li>是否开辟新的内存空间</li><li>是否影响了引⽤用计数</li></ul>]]></content>
    
    <summary type="html">
    
      &lt;img src=&quot;/archives/5db87dbc/0.png&quot; class=&quot;&quot;&gt;
    
    </summary>
    
    
    
      <category term="iOS" scheme="https://blog.nubi.im/tags/iOS/"/>
    
      <category term="Objective-C" scheme="https://blog.nubi.im/tags/Objective-C/"/>
    
  </entry>
  
  <entry>
    <title>关于Unity工程提包警告提示UIWebView 的解决方案</title>
    <link href="https://blog.nubi.im/archives/c423532a.html"/>
    <id>https://blog.nubi.im/archives/c423532a.html</id>
    <published>2020-05-15T01:19:26.000Z</published>
    <updated>2020-05-15T02:48:04.722Z</updated>
    
    <content type="html"><![CDATA[<img src="/archives/c423532a/0.jpeg" class=""><a id="more"></a><hr><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><hr><p>最近提审新项目时，构建包传到 iTunes Connect 后台后总是无法处理成功，Apple 邮件给出以下反馈：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ITMS-90809: Deprecated API Usage – Apple will stop accepting submissions of apps that use UIWebView APIs . See https:&#x2F;&#x2F;developer.apple.com&#x2F;documentation&#x2F;uikit&#x2F;uiwebview</span><br><span class="line">for more information.</span><br></pre></td></tr></table></figure><p>由于早期已经将项目中的 UIWevView 全部替换为了 WKWebView ，于是推测可能是其他的第三方库里用到了 UIWevView ，所以逐个第三方的排查、升级SDK，最终还是无法解决问题。</p><p>于是推测可能是 Unity 框架中使用到了 UIWevView，于是用了以下命令扫描工程目录下的相关文件：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep -r UIWebView .</span><br></pre></td></tr></table></figure><p>扫描的结果是：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Binary file ./Libraries/libiPhone-lib.a matches</span><br></pre></td></tr></table></figure><p>发现 libiPhone-lib.a 中引用了 UIWebView </p><h2 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h2><hr><p>通过查找资料了解到，虽然 Unity 官方不准备在旧版本修复此问题，但是在问题描述中阐述了具体细节：在 <code>PlatformDependent/iPhonePlayer/URLUtility.mm</code> 中使用 UIWebView 处理游戏内链接。</p><p>因此，目前有两种解决方案：</p><ol><li>升级Unity引擎</li><li>去掉 libiPhone-lib.a 中的 UIWebView 引用</li></ol><p>Unity 已经在部分新版本中修复了这个问题，通过查阅 Release Notes 可以看到说明，但是升级游戏引擎的工作量比较大，所以没有被我们选为首选方案。</p><h2 id="处理过程"><a href="#处理过程" class="headerlink" title="处理过程"></a>处理过程</h2><hr><h4 id="1-创建URLUtility-mm"><a href="#1-创建URLUtility-mm" class="headerlink" title="1.创建URLUtility.mm"></a>1.创建URLUtility.mm</h4><p>新建文件 URLUtility.mm，并写入下面代码：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line">#include &lt;iostream&gt;</span><br><span class="line">#import &lt;UIKit&#x2F;UIKit.h&gt;</span><br><span class="line"></span><br><span class="line">using namespace std;</span><br><span class="line">namespace core &#123;</span><br><span class="line">    template &lt;class type&gt;</span><br><span class="line">    class StringStorageDefault &#123;&#125;;</span><br><span class="line">    template &lt;class type,class type2&gt;</span><br><span class="line">    class basic_string &#123;</span><br><span class="line">    public:</span><br><span class="line">        char * str;</span><br><span class="line">        basic_string( char* arg)&#123;</span><br><span class="line">            str &#x3D; arg;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">void OpenURLInGame(core::basic_string&lt; char,core::StringStorageDefault&lt;char&gt; &gt; const&amp;arg)&#123;&#125;</span><br><span class="line"></span><br><span class="line">void OpenURL(core::basic_string&lt;char,core::StringStorageDefault&lt;char&gt; &gt;const &amp;arg)&#123;</span><br><span class="line">    const void *arg2 &#x3D; arg.str;</span><br><span class="line">    UIApplication *app &#x3D; [UIApplication sharedApplication];</span><br><span class="line">    NSString *urlStr &#x3D; [NSString stringWithUTF8String:(char *)arg2];</span><br><span class="line">    NSURL *url &#x3D; [NSURL URLWithString:urlStr];</span><br><span class="line">    if (@available(iOS 10.0, *)) &#123;</span><br><span class="line">        [app openURL:url options:@&#123;UIApplicationOpenURLOptionsSourceApplicationKey : @YES&#125; completionHandler:nil];</span><br><span class="line">    &#125; else &#123;</span><br><span class="line">        [app openURL:url];</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">void OpenURL(std::string const&amp;arg)&#123;</span><br><span class="line">    UIApplication *app &#x3D; [UIApplication sharedApplication];</span><br><span class="line">    NSString *urlStr &#x3D; [NSString stringWithUTF8String:arg.c_str()];</span><br><span class="line">    NSURL *url &#x3D; [NSURL URLWithString:urlStr];</span><br><span class="line">    if (@available(iOS 10.0, *)) &#123;</span><br><span class="line">        [app openURL:url options:@&#123;UIApplicationOpenURLOptionsSourceApplicationKey : @YES&#125; completionHandler:nil];</span><br><span class="line">    &#125; else &#123;</span><br><span class="line">        [app openURL:url];</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="2-查看-libiPhone-lib-a-架构"><a href="#2-查看-libiPhone-lib-a-架构" class="headerlink" title="2.查看 libiPhone-lib.a 架构"></a>2.查看 libiPhone-lib.a 架构</h4><p>用以下命令查看：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">file libiPhone-lib.a</span><br></pre></td></tr></table></figure><p>结果如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">libiPhone-lib.a: Mach-O universal binary with 3 architectures: [arm_v7:current ar archive] [arm_v7s]</span><br><span class="line">libiPhone-lib.a (for architecture armv7):current ar archive</span><br><span class="line">libiPhone-lib.a (for architecture arm64):current ar archive</span><br><span class="line">libiPhone-lib.a (for architecture armv7s):current ar archive</span><br></pre></td></tr></table></figure><p>可以得出，有三种架构：armv7、arm64、armv7s。<br>因此在编译时建议三种架构都编译，否则在替换时会提示缺失符号问题。</p><h4 id="3-构建URLUtility-o"><a href="#3-构建URLUtility-o" class="headerlink" title="3.构建URLUtility.o"></a>3.构建URLUtility.o</h4><p>使用以下命令构建：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> arm64 架构</span></span><br><span class="line">clang -c URLUtility.mm -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk -o ./arm64/URLUtility.o</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> armv7 架构</span></span><br><span class="line">clang -c URLUtility.mm -arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk -o ./armv7/URLUtility.o</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> armv7s 架构</span></span><br><span class="line">clang -c URLUtility.mm -arch armv7s -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk -o ./armv7s/URLUtility.o</span><br></pre></td></tr></table></figure><p><strong>注意：-isysroot</strong></p><p>指定的 SDK 路径一定是当前工程使用的 Xcode 版本，特别是当机器上存在多个 Xcode 版本时要注意。</p><h4 id="4-拆分-libiPhone-lib-a"><a href="#4-拆分-libiPhone-lib-a" class="headerlink" title="4.拆分 libiPhone-lib.a"></a>4.拆分 libiPhone-lib.a</h4><p>使用以下命令：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> arm64 架构</span></span><br><span class="line">lipo libiPhone-lib.a -thin arm64 -output ./arm64/libiPhone-lib.a</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> armv7 架构</span></span><br><span class="line">lipo libiPhone-lib.a -thin armv7 -output ./armv7/libiPhone-lib.a</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> armv7s 架构</span></span><br><span class="line">lipo libiPhone-lib.a -thin armv7s -output ./armv7s/libiPhone-lib.a</span><br></pre></td></tr></table></figure><h4 id="5-替换各个架构下的-libiPhone-lib-a-中的-URLUtility-o"><a href="#5-替换各个架构下的-libiPhone-lib-a-中的-URLUtility-o" class="headerlink" title="5.替换各个架构下的 libiPhone-lib.a 中的 URLUtility.o"></a>5.替换各个架构下的 libiPhone-lib.a 中的 URLUtility.o</h4><p>使用以下命令：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> arm64 架构</span></span><br><span class="line">ar -d ./arm64/libiPhone-lib.a URLUtility.o</span><br><span class="line">ar -q ./arm64/libiPhone-lib.a ./arm64/URLUtility.o</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> armv7 架构</span></span><br><span class="line">ar -d ./armv7/libiPhone-lib.a URLUtility.o</span><br><span class="line">ar -q ./armv7/libiPhone-lib.a ./armv7/URLUtility.o</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> armv7s 架构</span></span><br><span class="line">ar -d ./armv7s/libiPhone-lib.a URLUtility.o</span><br><span class="line">ar -q ./armv7s/libiPhone-lib.a ./armv7s/URLUtility.o</span><br></pre></td></tr></table></figure><h4 id="6-合并-libiPhone-lib-a"><a href="#6-合并-libiPhone-lib-a" class="headerlink" title="6.合并 libiPhone-lib.a"></a>6.合并 libiPhone-lib.a</h4><p>使用以下命令：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">lipo -create ./arm64/libiPhone-lib.a ./armv7/libiPhone-lib.a ./armv7s/libiPhone-lib.a -output libiPhone-lib.a</span><br></pre></td></tr></table></figure><h4 id="7-检查-libiPhone-lib-a"><a href="#7-检查-libiPhone-lib-a" class="headerlink" title="7.检查 libiPhone-lib.a"></a>7.检查 libiPhone-lib.a</h4><p>用以下命令检查新生成的 libiPhone-lib.a 文件：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep -r UIWebView .</span><br></pre></td></tr></table></figure><p>没有任何输出表示当前的文件中已经没有了 UIWebView 引用。</p><h2 id="尾声"><a href="#尾声" class="headerlink" title="尾声"></a>尾声</h2><hr><p>做完上述操作，将新的 libiPhone-lib.a 替换原工程的 libiPhone-lib.a ，再次提包，构建包成功处理完成。</p><p>上述过程已经写成了脚本，有需要的朋友可以自取。</p><p><strong>传送门：</strong><br><a href="https://github.com/yanfj/ScriptAsset/tree/master/libiPhone-lib" target="_blank" rel="noopener">libiPhone-lib.sh</a></p>]]></content>
    
    <summary type="html">
    
      &lt;img src=&quot;/archives/c423532a/0.jpeg&quot; class=&quot;&quot;&gt;
    
    </summary>
    
    
    
      <category term="iOS" scheme="https://blog.nubi.im/tags/iOS/"/>
    
      <category term="Unity" scheme="https://blog.nubi.im/tags/Unity/"/>
    
  </entry>
  
  <entry>
    <title>关于终端配置的一些记录</title>
    <link href="https://blog.nubi.im/archives/628ebedf.html"/>
    <id>https://blog.nubi.im/archives/628ebedf.html</id>
    <published>2019-12-28T09:29:46.000Z</published>
    <updated>2020-12-01T06:16:08.853Z</updated>
    
    <content type="html"><![CDATA[<img src="/archives/628ebedf/0.png" class=""><a id="more"></a><hr><h2 id="mac自带的sed和linux表现不一致"><a href="#mac自带的sed和linux表现不一致" class="headerlink" title="mac自带的sed和linux表现不一致"></a>mac自带的sed和linux表现不一致</h2><p>需要安装 <code>gnu-sed</code>, 推荐 <strong>Homebrew</strong> 安装</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装gnu-sed</span></span><br><span class="line">brew install gnu-sed</span><br><span class="line"></span><br><span class="line"><span class="comment"># 编辑zsh配置文件</span></span><br><span class="line">vi ~/.zshrc</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置PATH</span></span><br><span class="line"><span class="built_in">export</span> PATH=<span class="string">"/usr/local/opt/gnu-sed/libexec/gnubin:<span class="variable">$PATH</span>"</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#更新配置</span></span><br><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure><p>再试，就可以了！</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">"a,b,c,d"</span> |sed  <span class="string">'s/,/\n/g'</span></span><br><span class="line">a</span><br><span class="line">b</span><br><span class="line">c</span><br><span class="line">d</span><br></pre></td></tr></table></figure><hr><h2 id="npm换源"><a href="#npm换源" class="headerlink" title="npm换源"></a>npm换源</h2><p>更换镜像即可解决，以淘宝的镜像为例：</p><h4 id="1-临时使用"><a href="#1-临时使用" class="headerlink" title="1. 临时使用"></a>1. 临时使用</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm --registry https://registry.npm.taobao.org install express</span><br></pre></td></tr></table></figure><p>验证是否成功</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm info express</span><br></pre></td></tr></table></figure><h4 id="2-持久使用"><a href="#2-持久使用" class="headerlink" title="2. 持久使用"></a>2. 持久使用</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm config <span class="built_in">set</span> registry https://registry.npm.taobao.org</span><br></pre></td></tr></table></figure><p>验证是否成功</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm config get registry</span><br></pre></td></tr></table></figure><h4 id="3-恢复使用官方镜像"><a href="#3-恢复使用官方镜像" class="headerlink" title="3. 恢复使用官方镜像"></a>3. 恢复使用官方镜像</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm config <span class="built_in">set</span> registry https://registry.npmjs.org</span><br></pre></td></tr></table></figure><hr><h2 id="pip换源"><a href="#pip换源" class="headerlink" title="pip换源"></a>pip换源</h2><p>国内的一些源：</p><table><thead><tr><th>名称</th><th>地址</th></tr></thead><tbody><tr><td>阿里云</td><td><a href="http://mirrors.aliyun.com/pypi/simple/" target="_blank" rel="noopener">http://mirrors.aliyun.com/pypi/simple/</a></td></tr><tr><td>中国科技大学</td><td><a href="https://pypi.mirrors.ustc.edu.cn/simple/" target="_blank" rel="noopener">https://pypi.mirrors.ustc.edu.cn/simple/</a></td></tr><tr><td>豆瓣</td><td><a href="http://pypi.douban.com/simple/" target="_blank" rel="noopener">http://pypi.douban.com/simple/</a></td></tr><tr><td>清华大学</td><td><a href="https://pypi.tuna.tsinghua.edu.cn/simple/" target="_blank" rel="noopener">https://pypi.tuna.tsinghua.edu.cn/simple/</a></td></tr><tr><td>中国科学技术大学</td><td><a href="http://pypi.mirrors.ustc.edu.cn/simple/" target="_blank" rel="noopener">http://pypi.mirrors.ustc.edu.cn/simple/</a></td></tr></tbody></table><h4 id="1-临时使用-1"><a href="#1-临时使用-1" class="headerlink" title="1. 临时使用"></a>1. 临时使用</h4><p>在使用pip的时候在后面加上-i参数，指定pip源，例如：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple</span><br></pre></td></tr></table></figure><h4 id="2-永久修改"><a href="#2-永久修改" class="headerlink" title="2.永久修改"></a>2.永久修改</h4><p>修改 <strong>~/.pip/pip.conf</strong>  (没有就创建一个)， 内容如下：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[global]</span><br><span class="line">index-url = https://pypi.tuna.tsinghua.edu.cn/simple</span><br></pre></td></tr></table></figure><hr><h2 id="mac-安装Homebrew报错"><a href="#mac-安装Homebrew报错" class="headerlink" title="mac 安装Homebrew报错"></a>mac 安装Homebrew报错</h2><p>安装Homebrew时有时会出现：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Failed to connect to raw.githubusercontent.com port 443: Connection refused</span><br></pre></td></tr></table></figure><p>这时，解决办法也很简单，就是配置一个代理，把下面的内容配置到你的 <code>/etc/hosts</code> 中即可解决</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">199.232.28.133 raw.githubusercontent.com</span><br></pre></td></tr></table></figure><hr><h2 id="CentOS-相关命令"><a href="#CentOS-相关命令" class="headerlink" title="CentOS 相关命令"></a>CentOS 相关命令</h2><p><strong>防火墙相关：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#启动防火墙</span></span><br><span class="line">systemctl start firewalld.service</span><br><span class="line"></span><br><span class="line"><span class="comment">#关闭防火墙</span></span><br><span class="line">systemctl stop firewalld.service</span><br><span class="line"></span><br><span class="line"><span class="comment">#开机启动防火墙</span></span><br><span class="line">systemctl <span class="built_in">enable</span> firewalld.service</span><br><span class="line"></span><br><span class="line"><span class="comment">#禁用开机启动防火墙</span></span><br><span class="line">systemctl <span class="built_in">disable</span> firewalld.service</span><br><span class="line"></span><br><span class="line"><span class="comment">#重启防火墙</span></span><br><span class="line">firewall-cmd --reload</span><br><span class="line"></span><br><span class="line"><span class="comment">#显示防火墙开放的端口</span></span><br><span class="line">firewall-cmd --list-ports</span><br><span class="line"></span><br><span class="line"><span class="comment">#查询端口是否开放</span></span><br><span class="line">firewall-cmd --query-port=80/tcp</span><br><span class="line"></span><br><span class="line"><span class="comment">#开启端口</span></span><br><span class="line">firewall-cmd --zone=public --add-port=80/tcp --permanent</span><br><span class="line"></span><br><span class="line"><span class="comment">#停止端口</span></span><br><span class="line">firewall-cmd --zone=public --remove-port=80/tcp --permanent</span><br></pre></td></tr></table></figure><p><strong>查看端口访问情况:</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#列出所有端口情况</span></span><br><span class="line">netstat -ntlp</span><br><span class="line"></span><br><span class="line"><span class="comment">#查看某个端口被哪个进程占用</span></span><br><span class="line">netstat -lnp|grep 443</span><br><span class="line"></span><br><span class="line"><span class="comment">#查看进程的详细信息</span></span><br><span class="line">ps 1777</span><br><span class="line"></span><br><span class="line"><span class="comment">#终止进程</span></span><br><span class="line"><span class="built_in">kill</span> -9 1777</span><br></pre></td></tr></table></figure><p><strong>apache命令:</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#编辑Apache配置文件</span></span><br><span class="line">vim /etc/httpd/conf/httpd.conf</span><br><span class="line"></span><br><span class="line"><span class="comment">#增加转发配置</span></span><br><span class="line">LoadModule proxy_module modules/mod_proxy.so</span><br><span class="line">LoadModule proxy_http_module modules/mod_proxy_http.so</span><br><span class="line"></span><br><span class="line">ProxyPass /wx http://0.0.0.0:8080/wx</span><br><span class="line">ProxyPassReverse /wx http://0.0.0.0:8080/wx</span><br><span class="line"></span><br><span class="line"><span class="comment">#启动</span></span><br><span class="line">systemctl start httpd</span><br><span class="line"></span><br><span class="line"><span class="comment">#停止</span></span><br><span class="line">systemctl stop httpd</span><br><span class="line"></span><br><span class="line"><span class="comment">#重启</span></span><br><span class="line">systemctl restart httpd</span><br><span class="line"></span><br><span class="line"><span class="comment">#查看状态</span></span><br><span class="line">status httpd.service</span><br></pre></td></tr></table></figure><p><strong>后台运行:</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#在后台执行 root 目录下的 runoob.sh 脚本</span></span><br><span class="line">nohup /root/runoob.sh &amp;</span><br><span class="line"></span><br><span class="line"><span class="comment">#查找到 nohup 运行脚本到 PID</span></span><br><span class="line">ps -aux | grep <span class="string">"runoob.sh"</span></span><br></pre></td></tr></table></figure><h2 id="软链接报错相关"><a href="#软链接报错相关" class="headerlink" title="软链接报错相关"></a>软链接报错相关</h2><p>若出现类似下面的报错，可以尝试修复软连接来解决：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ /usr/<span class="built_in">local</span>/bin/python3 --version</span><br><span class="line">no such file or directory: /usr/<span class="built_in">local</span>/bin/python3</span><br></pre></td></tr></table></figure><p>解决方法:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#先移除软链接</span></span><br><span class="line"><span class="built_in">cd</span> /usr/<span class="built_in">local</span>/bin/</span><br><span class="line">rm python3</span><br><span class="line"></span><br><span class="line"><span class="comment">#建立新的软链接</span></span><br><span class="line">ln -s /usr/<span class="built_in">local</span>/opt/python@3.8/bin/python3 /usr/<span class="built_in">local</span>/bin/python3</span><br></pre></td></tr></table></figure><p>测试一下是否可用：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ /usr/<span class="built_in">local</span>/bin/python3 --version</span><br><span class="line">Python 3.8.6</span><br></pre></td></tr></table></figure><h2 id="Homebrew更新相关"><a href="#Homebrew更新相关" class="headerlink" title="Homebrew更新相关"></a>Homebrew更新相关</h2><p>如果你之前折腾过不少导致你的Homebrew有点问题，那么可以尝试使用如下方案：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 诊断Homebrew的问题:</span></span><br><span class="line">brew doctor</span><br><span class="line"></span><br><span class="line"><span class="comment"># 重置brew.git设置:</span></span><br><span class="line"><span class="built_in">cd</span> <span class="string">"<span class="variable">$(brew --repo)</span>"</span></span><br><span class="line">git fetch</span><br><span class="line">git reset --hard origin/master</span><br><span class="line"></span><br><span class="line"><span class="comment"># homebrew-core.git同理:</span></span><br><span class="line"><span class="built_in">cd</span> <span class="string">"<span class="variable">$(brew --repo)</span>/Library/Taps/homebrew/homebrew-core"</span></span><br><span class="line">git fetch</span><br><span class="line">git reset --hard origin/master</span><br><span class="line"></span><br><span class="line"><span class="comment"># 应用生效:</span></span><br><span class="line">brew update</span><br></pre></td></tr></table></figure><p>关闭brew执行命令时自动更新：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 在 ~/.bash_profile 或者 ~/.zshrc 新增一行</span></span><br><span class="line"><span class="built_in">export</span> HOMEBREW_NO_AUTO_UPDATE=<span class="literal">true</span></span><br></pre></td></tr></table></figure><h2 id="Crontab定时任务"><a href="#Crontab定时任务" class="headerlink" title="Crontab定时任务"></a>Crontab定时任务</h2><p>以定时启动爬虫为例</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看命令得绝对路径</span></span><br><span class="line"><span class="variable">$which</span> scrapy</span><br><span class="line">/usr/<span class="built_in">local</span>/bin/scrapy</span><br><span class="line"></span><br><span class="line"><span class="comment"># cd到爬虫得项目目录下 + scrapy命令得绝对路径  +  启动命令</span></span><br><span class="line"><span class="comment"># 每5分钟执行一次iTorrents这个爬虫程序</span></span><br><span class="line">*/5 * * * * <span class="built_in">cd</span> /home/iSpiders &amp;&amp; /usr/<span class="built_in">local</span>/bin/scrapy crawl iTorrents &gt;&gt;/home/<span class="built_in">log</span>/iTorrents.log 2&gt;&amp;1   <span class="comment"># 将正确和错误日志都打印到日志中</span></span><br></pre></td></tr></table></figure><p>命令详解</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#创建定时任务</span></span><br><span class="line">crontab -e     </span><br><span class="line"></span><br><span class="line"><span class="comment">#查看定时任务</span></span><br><span class="line">crontab   -l</span><br><span class="line"></span><br><span class="line"><span class="comment">#停止定时任务</span></span><br><span class="line">service crond stop</span><br><span class="line"></span><br><span class="line"><span class="comment">#重启定时任务</span></span><br><span class="line">service crond restart</span><br><span class="line"></span><br><span class="line"><span class="comment">#启动定时任务</span></span><br><span class="line">service crond start</span><br></pre></td></tr></table></figure><p>crontab的命令构成为 时间+动作，其时间有分、时、日、月、周五种，操作符有：<br><code>*</code>  取值范围内的所有数字<br><code>/</code>  每过多少个数字<br><code>-</code>  从X到Z<br><code>,</code> 散列数字</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#每1分钟执行一次cmd</span></span><br><span class="line">* * * * * cmd</span><br><span class="line"></span><br><span class="line"><span class="comment">#每小时的第3和第15分钟执行</span></span><br><span class="line">3,15 * * * * cmd</span><br><span class="line"></span><br><span class="line"><span class="comment">#在上午8点到11点的第3和第15分钟执行</span></span><br><span class="line">3,15 8-11 * * * cmd</span><br><span class="line"></span><br><span class="line"><span class="comment">#每隔两天的上午8点到11点的第3和第15分钟执行</span></span><br><span class="line">3,15 8-11 */2  *  * cmd</span><br><span class="line"></span><br><span class="line"><span class="comment">#每周一上午8点到11点的第3和第15分钟执行</span></span><br><span class="line">3,15 8-11 * * 1 cmd</span><br><span class="line"></span><br><span class="line"><span class="comment">#每晚的21:30执行</span></span><br><span class="line">30 21 * * * cmd</span><br><span class="line"></span><br><span class="line"><span class="comment">#每月1、10、22日的4 : 45执行</span></span><br><span class="line">45 4 1,10,22 * * cmd</span><br><span class="line"></span><br><span class="line"><span class="comment">#每周六、周日的1 : 10执行</span></span><br><span class="line">10 1 * * 6,0 cmd</span><br><span class="line"></span><br><span class="line"><span class="comment">#每天18 : 00至23 : 00之间每隔30分钟执行</span></span><br><span class="line">0,30 18-23 * * * cmd</span><br><span class="line"></span><br><span class="line"><span class="comment">#每星期六的晚上11 : 00 pm执行</span></span><br><span class="line">0 23 * * 6 cmd</span><br><span class="line"></span><br><span class="line"><span class="comment">#每一小时重启smb</span></span><br><span class="line">* */1 * * * cmd</span><br><span class="line"></span><br><span class="line"><span class="comment">#晚上11点到早上7点之间，每隔一小时执行</span></span><br><span class="line">* 23-7/1 * * * cmd</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;img src=&quot;/archives/628ebedf/0.png&quot; class=&quot;&quot;&gt;
    
    </summary>
    
    
    
      <category term="macOS" scheme="https://blog.nubi.im/tags/macOS/"/>
    
      <category term="命令行" scheme="https://blog.nubi.im/tags/%E5%91%BD%E4%BB%A4%E8%A1%8C/"/>
    
  </entry>
  
  <entry>
    <title>macOS相关设置</title>
    <link href="https://blog.nubi.im/archives/ea4b7a86.html"/>
    <id>https://blog.nubi.im/archives/ea4b7a86.html</id>
    <published>2019-12-28T08:49:07.000Z</published>
    <updated>2021-04-28T03:21:08.958Z</updated>
    
    <content type="html"><![CDATA[<img src="/archives/ea4b7a86/0.png" class=""><a id="more"></a><hr><h2 id="允许任何来源"><a href="#允许任何来源" class="headerlink" title="允许任何来源"></a>允许任何来源</h2><p>我们打开一些应用文件时会失败并且提示 <strong>“来自身份不明的开发者”</strong>，此时开启<strong>“设置”</strong> → <strong>“安全与隐私”</strong> 中的 <strong>“任何来源”</strong> 即可解决问题。但 <strong>macOS 10.13</strong> 以后的系统默认没有这一选项，此时在 <strong>“终端”</strong> 中输入以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo spctl --master-disable</span><br></pre></td></tr></table></figure><p>执行上述步骤之后，<strong>“任何来源”</strong> 选项就会出现了。</p><p><strong>注意：</strong>如果在系统偏好设置的 <strong>“安全与隐私”</strong> 中重新选中允许 <strong>“App Store</strong> 和 <strong>“被认可的开发者”</strong>，允许 <strong>“任何来源”</strong> 的选项会再次消失，可运行上述命令再次开启。</p><hr><h2 id="自动开机"><a href="#自动开机" class="headerlink" title="自动开机"></a>自动开机</h2><p>苹果从 2016款的MacBook Pro就增加了自动开机功能，每当我们翻开屏幕上盖以后，MacBook就会自动开机，如果不喜欢此功能，在 <strong>“终端”</strong> 输入以下命令可以设置：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">关闭自动开机</span><br><span class="line">sudo nvram AutoBoot=%00</span><br><span class="line"></span><br><span class="line">开启自动开机</span><br><span class="line">sudo nvram AutoBoot=%03</span><br><span class="line"></span><br><span class="line">开启开机音效</span><br><span class="line">sudo nvram BootAudio=%01</span><br><span class="line"></span><br><span class="line">关闭开机音效</span><br><span class="line">sudo nvram BootAudio=%00</span><br></pre></td></tr></table></figure><hr><h2 id="重签名软件"><a href="#重签名软件" class="headerlink" title="重签名软件"></a>重签名软件</h2><p>因为Apple苹果公司删除了TNT的证书，所以在2019年7月12日后TNT破解的软件都不能运行了，临时的解决办法，就是自己签名。</p><h4 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h4><p>首先需要安装 Xcode，可以在App Store中下载安装，并且至少运行一次。</p><p>安装Command Line Tools 工具，打开终端工具输入如下命令：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">xcode-select --install</span><br></pre></td></tr></table></figure><p>弹出后选择继续安装。</p><h4 id="签名"><a href="#签名" class="headerlink" title="签名"></a>签名</h4><p>打开终端工具输入并执行如下命令：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">codesign --force --deep --sign - /Applications/name.app</span><br></pre></td></tr></table></figure><p>注意后面的文件路径，你可以打开访达找到应用程序，找到要签名的软件，直接拖入 终端 界面，即可自动生成路径。</p><hr><h2 id="启动台出现两个相同快捷方式"><a href="#启动台出现两个相同快捷方式" class="headerlink" title="启动台出现两个相同快捷方式"></a>启动台出现两个相同快捷方式</h2><p>进入以下目录</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">~/Library/Application Support/Dock</span><br></pre></td></tr></table></figure><p>删除里面的 <code>.db</code> 文件，然后重启电脑即可</p>]]></content>
    
    <summary type="html">
    
      &lt;img src=&quot;/archives/ea4b7a86/0.png&quot; class=&quot;&quot;&gt;
    
    </summary>
    
    
    
      <category term="macOS" scheme="https://blog.nubi.im/tags/macOS/"/>
    
      <category term="命令行" scheme="https://blog.nubi.im/tags/%E5%91%BD%E4%BB%A4%E8%A1%8C/"/>
    
  </entry>
  
  <entry>
    <title>关于Git的那些坑儿</title>
    <link href="https://blog.nubi.im/archives/a4fa3170.html"/>
    <id>https://blog.nubi.im/archives/a4fa3170.html</id>
    <published>2019-12-28T08:01:01.000Z</published>
    <updated>2020-05-13T11:18:42.000Z</updated>
    
    <content type="html"><![CDATA[<img src="/archives/a4fa3170/0.png" class=""><a id="more"></a><hr><h2 id="Push-到-GitHub-时报错-GH007"><a href="#Push-到-GitHub-时报错-GH007" class="headerlink" title="Push 到 GitHub 时报错  GH007"></a>Push 到 GitHub 时报错  GH007</h2><p>报错信息如下：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">remote: error: GH007: Your push would publish a private email address.</span><br></pre></td></tr></table></figure><p>遇到这个问题有两种解决办法：</p><p><strong>1. 修改 GitHub 设置选项</strong></p><p>找到设置选项：<strong>Settings</strong>  →  <strong>Emails</strong>  →  <strong>Keep my email addresses private</strong></p><img src="/archives/a4fa3170/1.png" class=""><p>将此项去掉勾选即可</p><p><strong>2. 修改本地的 Git 配置信息</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 修改全局邮件地址</span></span><br><span class="line">git config --global user.email <span class="string">"username@users.noreply.github.com"</span></span><br><span class="line">git config user.email <span class="string">"username@users.noreply.github.com"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 重置commit的作者信息</span></span><br><span class="line">git commit --amend --reset-author</span><br></pre></td></tr></table></figure><p>再次提交即可</p><hr><h2 id="Push-空的目录到-GitHub"><a href="#Push-空的目录到-GitHub" class="headerlink" title="Push 空的目录到 GitHub"></a>Push 空的目录到 GitHub</h2><p>创建一个 <code>.gitkeep</code> 文件于目录内即可</p><img src="/archives/a4fa3170/2.png" class=""><hr><p><strong>本帖用于记录使用Git过程中遇到的问题，不定时更新中…</strong></p>]]></content>
    
    <summary type="html">
    
      &lt;img src=&quot;/archives/a4fa3170/0.png&quot; class=&quot;&quot;&gt;
    
    </summary>
    
    
    
      <category term="命令行" scheme="https://blog.nubi.im/tags/%E5%91%BD%E4%BB%A4%E8%A1%8C/"/>
    
      <category term="Git" scheme="https://blog.nubi.im/tags/Git/"/>
    
  </entry>
  
  <entry>
    <title>Oh My Zsh</title>
    <link href="https://blog.nubi.im/archives/eaf706e1.html"/>
    <id>https://blog.nubi.im/archives/eaf706e1.html</id>
    <published>2019-12-25T07:41:32.000Z</published>
    <updated>2020-05-13T11:18:42.000Z</updated>
    
    <content type="html"><![CDATA[<img src="/archives/eaf706e1/zsh_homepage.jpg" class=""><a id="more"></a><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><hr><p>shell的类型有很多种，linux下默认的是bash，虽然bash的功能已经很强大，但对于以懒惰为美德的程序员来说，bash的提示功能不够强大，界面也不够炫，并非理想工具。</p><p>而zsh的功能极其强大，只是配置过于复杂，起初只有极客才在用。后来，有个穷极无聊的程序员可能是实在看不下去广大猿友一直只能使用单调的bash, 于是他创建了一个名为 Oh My Zsh 的开源项目。</p><p>自此，只需要简单的安装配置，小白程序员们都可以用上高档大气上档次，狂拽炫酷吊炸天的 <strong>Oh My Zsh</strong></p><img src="/archives/eaf706e1/oh-my-zsh.png" class=""><h2 id="安装与配置"><a href="#安装与配置" class="headerlink" title="安装与配置"></a>安装与配置</h2><hr><h4 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h4><hr><p><strong>在终端执行以下语句</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sh -c <span class="string">"<span class="variable">$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)</span>"</span></span><br></pre></td></tr></table></figure><p><strong>成功界面</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">  ____  / /_     ____ ___  __  __   ____  _____/ /_  </span><br><span class="line"> / __ \/ __ \   / __ `__ \/ / / /  /_  / / ___/ __ \ </span><br><span class="line">/ /_/ / / / /  / / / / / / /_/ /    / /_(__  ) / / / </span><br><span class="line">\____/_/ /_/  /_/ /_/ /_/\__, /    /___/____/_/ /_/  </span><br><span class="line">                        /____/                       ....is now installed!</span><br><span class="line">Please look over the ~/.zshrc file to select plugins, themes, and options.</span><br><span class="line"></span><br><span class="line">p.s. Follow us at https://twitter.com/ohmyzsh.</span><br><span class="line"></span><br><span class="line">p.p.s. Get stickers and t-shirts at http://shop.planetargon.com.</span><br></pre></td></tr></table></figure><p><strong>设置默认的shell为zsh</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chsh -s /bin/zsh</span><br></pre></td></tr></table></figure><p><strong>此时重启终端则会切换为zsh</strong></p><h4 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h4><hr><p>修改配置文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi ~/.zshrc</span><br></pre></td></tr></table></figure><p>找到以下内容 <code># If you come from bash you might have to change your $PATH.</code> 去掉注释的 # 后</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># If you come from bash you might have to change your $PATH.</span></span><br><span class="line"><span class="built_in">export</span> PATH=<span class="variable">$HOME</span>/bin:/usr/<span class="built_in">local</span>/bin:<span class="variable">$PATH</span></span><br></pre></td></tr></table></figure><p>找到 <code># User configuration</code> 这一行，在下面添加</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># User configuration</span></span><br><span class="line"><span class="built_in">source</span> ~/.bash_profile</span><br></pre></td></tr></table></figure><p>保存退出之后，使用以下命令使 <strong>zsh</strong> 的配置立即生效</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure><h2 id="主题"><a href="#主题" class="headerlink" title="主题"></a>主题</h2><hr><p><strong>Oh My Zsh</strong> 有很多的主题供用户选择：<strong><a href="https://github.com/ohmyzsh/ohmyzsh/wiki/themes" target="_blank" rel="noopener">主题列表</a></strong> </p><h4 id="修改主题"><a href="#修改主题" class="headerlink" title="修改主题"></a>修改主题</h4><hr><p>编辑配置文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi ~/.zshrc</span><br></pre></td></tr></table></figure><p>找到 <code>ZSH_THEME</code> 这一行，修改为主题的名字，例如：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ZSH_THEME=<span class="string">"ys"</span></span><br></pre></td></tr></table></figure><p>更新配置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure><h2 id="插件"><a href="#插件" class="headerlink" title="插件"></a>插件</h2><hr><h3 id="下载插件"><a href="#下载插件" class="headerlink" title="下载插件"></a>下载插件</h3><hr><h4 id="zsh-syntax-highlighting"><a href="#zsh-syntax-highlighting" class="headerlink" title="zsh-syntax-highlighting"></a>zsh-syntax-highlighting</h4><p>输入正确的常用命令会以绿色高亮显示，输入错误则会显示其他的颜色。<br>使用以下命令安装：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/zsh-users/zsh-syntax-highlighting.git <span class="variable">$&#123;ZSH_CUSTOM&#125;</span>/plugins/zsh-syntax-highlighting</span><br></pre></td></tr></table></figure><h4 id="zsh-syntax-highlighting-1"><a href="#zsh-syntax-highlighting-1" class="headerlink" title="zsh-syntax-highlighting"></a>zsh-syntax-highlighting</h4><p>输入命令时，会用浅色字体给出建议的命令，按 → 即可自动补全。<br>使用以下命令安装：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/zsh-users/zsh-autosuggestions <span class="variable">$&#123;ZSH_CUSTOM&#125;</span>/plugins/zsh-autosuggestions</span><br></pre></td></tr></table></figure><h4 id="z-lua"><a href="#z-lua" class="headerlink" title="z.lua"></a>z.lua</h4><p>z.lua 是一个快速路径切换工具，它会跟踪你在 shell 下访问过的路径，通过一套称为 Frecent 的机制（源自 FireFox），经过一段简短的学习之后，z.lua 会帮你跳转到所有匹配正则关键字的路径里 Frecent 值最高的那条路径去。<br>使用以下命令安装：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/skywind3000/z.lua.git <span class="variable">$&#123;ZSH_CUSTOM&#125;</span>/plugins/z.lua</span><br></pre></td></tr></table></figure><p>除此之外还需安装 <strong>lua</strong> 环境，可以用 <strong>Homebrew</strong> 安装：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew install lua</span><br></pre></td></tr></table></figure><h3 id="载入插件"><a href="#载入插件" class="headerlink" title="载入插件"></a>载入插件</h3><hr><p>编辑配置文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi ~/.zshrc</span><br></pre></td></tr></table></figure><p>找到 <strong>plugin</strong> 这一行，将插件加入：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">plugins=(git zsh-autosuggestions zsh-syntax-highlighting z.lua)</span><br></pre></td></tr></table></figure><p>并在文件末尾加入下面语句</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># ZSH 初始化</span></span><br><span class="line"><span class="built_in">eval</span> <span class="string">"<span class="variable">$(lua $ZSH/custom/plugins/z.lua/z.lua --init zsh enhanced once echo)</span>"</span></span><br><span class="line"><span class="comment"># 严格匹配当前路径的子路径</span></span><br><span class="line"><span class="built_in">alias</span> zz=<span class="string">'z -c'</span> </span><br><span class="line"><span class="comment"># 使用交互式选择模式</span></span><br><span class="line"><span class="built_in">alias</span> zi=<span class="string">'z -i'</span></span><br><span class="line"><span class="comment"># 快速回到父目录</span></span><br><span class="line"><span class="built_in">alias</span> zb=<span class="string">'z -b'</span></span><br></pre></td></tr></table></figure><p>更新配置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure><h2 id="尾声"><a href="#尾声" class="headerlink" title="尾声"></a>尾声</h2><hr><p><strong>Your terminal never felt this good before…</strong></p>]]></content>
    
    <summary type="html">
    
      &lt;img src=&quot;/archives/eaf706e1/zsh_homepage.jpg&quot; class=&quot;&quot;&gt;
    
    </summary>
    
    
    
      <category term="macOS" scheme="https://blog.nubi.im/tags/macOS/"/>
    
      <category term="命令行" scheme="https://blog.nubi.im/tags/%E5%91%BD%E4%BB%A4%E8%A1%8C/"/>
    
      <category term="Zsh" scheme="https://blog.nubi.im/tags/Zsh/"/>
    
  </entry>
  
  <entry>
    <title>macOS终端命令行配置网络代理</title>
    <link href="https://blog.nubi.im/archives/c77ef3dc.html"/>
    <id>https://blog.nubi.im/archives/c77ef3dc.html</id>
    <published>2019-12-25T06:31:38.000Z</published>
    <updated>2020-05-13T11:18:42.000Z</updated>
    
    <content type="html"><![CDATA[<img src="/archives/c77ef3dc/shadowsocksR.jpg" class=""><a id="more"></a><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><hr><h4 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h4><ul><li>网络代理服务器</li><li>网络代理客户端</li></ul><p>为了方便测试，请将网络代理客户端设置为 <strong>全局模式</strong><br>如果这两者你都没有，可以使用：<strong><a href="https://github.com/shadowsocks" target="_blank" rel="noopener">shadowsocks</a></strong></p><h4 id="环境信息"><a href="#环境信息" class="headerlink" title="环境信息"></a>环境信息</h4><p>配置时任选其一即可：</p><table><thead><tr><th>配置</th><th>地址</th></tr></thead><tbody><tr><td>Socks5</td><td>socks5://127.0.0.1:1086</td></tr><tr><td>HTTP</td><td><a href="http://127.0.0.1:1087" target="_blank" rel="noopener">http://127.0.0.1:1087</a></td></tr></tbody></table><h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><hr><p>如果你没安装过zsh，请按照系统默认终端命令行操作</p><h4 id="macOS默认终端命令行配置"><a href="#macOS默认终端命令行配置" class="headerlink" title="macOS默认终端命令行配置"></a>macOS默认终端命令行配置</h4><hr><h6 id="1-修改-bash-profile"><a href="#1-修改-bash-profile" class="headerlink" title="1. 修改 bash_profile"></a>1. 修改 <strong>bash_profile</strong></h6><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi ~/.bash_profile</span><br></pre></td></tr></table></figure><h6 id="2-在文件结尾增加以下配置"><a href="#2-在文件结尾增加以下配置" class="headerlink" title="2. 在文件结尾增加以下配置"></a>2. 在文件结尾增加以下配置</h6><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># proxy</span></span><br><span class="line"><span class="built_in">alias</span> proxy=<span class="string">'export all_proxy=socks5://127.0.0.1:1086'</span></span><br><span class="line"><span class="built_in">alias</span> unproxy=<span class="string">'unset all_proxy'</span></span><br></pre></td></tr></table></figure><h6 id="3-使配置生效"><a href="#3-使配置生效" class="headerlink" title="3. 使配置生效"></a>3. 使配置生效</h6><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.bash_profile</span><br></pre></td></tr></table></figure><h4 id="zsh命令行配置"><a href="#zsh命令行配置" class="headerlink" title="zsh命令行配置"></a>zsh命令行配置</h4><hr><h6 id="1-修改-zshrc"><a href="#1-修改-zshrc" class="headerlink" title="1. 修改 zshrc"></a>1. 修改 <strong>zshrc</strong></h6><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi ~/.zshrc</span><br></pre></td></tr></table></figure><h6 id="2-在文件结尾增加以下配置-1"><a href="#2-在文件结尾增加以下配置-1" class="headerlink" title="2. 在文件结尾增加以下配置"></a>2. 在文件结尾增加以下配置</h6><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># proxy</span></span><br><span class="line"><span class="built_in">alias</span> proxy=<span class="string">'export all_proxy=socks5://127.0.0.1:1086'</span></span><br><span class="line"><span class="built_in">alias</span> unproxy=<span class="string">'unset all_proxy'</span></span><br></pre></td></tr></table></figure><h6 id="3-使配置生效-1"><a href="#3-使配置生效-1" class="headerlink" title="3. 使配置生效"></a>3. 使配置生效</h6><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure><h2 id="配置验证"><a href="#配置验证" class="headerlink" title="配置验证"></a>配置验证</h2><hr><h6 id="1-查看现有IP"><a href="#1-查看现有IP" class="headerlink" title="1. 查看现有IP"></a>1. 查看现有IP</h6><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#查看ip</span></span><br><span class="line">curl myip.ipip.net</span><br><span class="line"></span><br><span class="line"><span class="comment">#返回结果</span></span><br><span class="line">当前 IP：117.151.xxx.xxx  来自于：中国 湖北 武汉 电信</span><br></pre></td></tr></table></figure><h6 id="2-开启代理并查看IP"><a href="#2-开启代理并查看IP" class="headerlink" title="2. 开启代理并查看IP"></a>2. 开启代理并查看IP</h6><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#开启代理</span></span><br><span class="line">proxy</span><br><span class="line"></span><br><span class="line"><span class="comment">#查看ip</span></span><br><span class="line">curl myip.ipip.net</span><br><span class="line"></span><br><span class="line"><span class="comment">#返回结果</span></span><br><span class="line">当前 IP：119.28.xxx.xxxx  来自于：中国 香港   tencent.com</span><br></pre></td></tr></table></figure><h6 id="3-关闭代理并查看IP"><a href="#3-关闭代理并查看IP" class="headerlink" title="3. 关闭代理并查看IP"></a>3. 关闭代理并查看IP</h6><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#开启代理</span></span><br><span class="line">unproxy</span><br><span class="line"></span><br><span class="line"><span class="comment">#查看ip</span></span><br><span class="line">curl myip.ipip.net</span><br><span class="line"></span><br><span class="line"><span class="comment">#返回结果</span></span><br><span class="line">当前 IP：117.151.xxx.xxx  来自于：中国 湖北 武汉 电信</span><br></pre></td></tr></table></figure><h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><hr><ul><li><p>问题：command not found: proxy<br>说明你未使用source命令使配置生效</p></li><li><p>问题：curl: (7) Failed to connect to 127.0.0.1 port 1080: Connection refused<br>请检查协议类型 socks、http是否配置有误，并检查端口是否配置有误</p></li><li><p>问题：curl: (52) Empty reply from server<br>请检查你的代理服务器是否正常</p></li><li><p>问题：执行proxy命令后，curl请求超时<br>请检查协议类型 socks、http是否配置有误，以及检查你的代理服务器是否正常</p></li></ul><p><strong>提醒：每个新开窗口都需要单独执行命令才可以正常使用</strong></p>]]></content>
    
    <summary type="html">
    
      &lt;img src=&quot;/archives/c77ef3dc/shadowsocksR.jpg&quot; class=&quot;&quot;&gt;
    
    </summary>
    
    
    
      <category term="ShadowsocksR" scheme="https://blog.nubi.im/tags/ShadowsocksR/"/>
    
      <category term="macOS" scheme="https://blog.nubi.im/tags/macOS/"/>
    
  </entry>
  
  <entry>
    <title>ShadowsocksR(SSR) 一键部署脚本</title>
    <link href="https://blog.nubi.im/archives/22a88b65.html"/>
    <id>https://blog.nubi.im/archives/22a88b65.html</id>
    <published>2019-11-26T02:20:57.000Z</published>
    <updated>2020-05-13T11:18:42.000Z</updated>
    
    <content type="html"><![CDATA[<img src="/archives/22a88b65/shadowsocksR.png" class=""><a id="more"></a><h3 id="关于脚本"><a href="#关于脚本" class="headerlink" title="关于脚本"></a>关于脚本</h3><hr><p>此脚本为 <strong>ShadowsocksR 服务端</strong>一键安装脚本<br>请下载与之配套的客户端程序来连接</p><h4 id="适用环境"><a href="#适用环境" class="headerlink" title="适用环境"></a>适用环境</h4><p><strong>系统支持：</strong>CentOS / Debian / Ubuntu<br><strong>内存要求：</strong>≥128M<br><strong>作者：</strong>秋水逸冰</p><h4 id="配置说明"><a href="#配置说明" class="headerlink" title="配置说明"></a>配置说明</h4><p><strong>服务器端口：</strong>自己设定（如不设定，默认为 <code>8989</code>）<br><strong>密码：</strong>自己设定（如不设定，默认为 <code>teddysun.com</code>）<br><strong>加密方式：</strong>自己设定（如不设定，默认为 <code>aes-256-cfb</code>）<br><strong>协议（Protocol）：</strong>自己设定（如不设定，默认为 <code>origin</code>）<br><strong>混淆（obfs）：</strong>自己设定（如不设定，默认为 <code>plain</code>）</p><h3 id="部署教程"><a href="#部署教程" class="headerlink" title="部署教程"></a>部署教程</h3><hr><h5 id="安装脚本"><a href="#安装脚本" class="headerlink" title="安装脚本"></a>安装脚本</h5><p>使用 <strong>root</strong> 用户登录，执行以下命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#获取脚本</span></span><br><span class="line">wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocksR.sh</span><br><span class="line"></span><br><span class="line"><span class="comment">#赋予脚本运行权限</span></span><br><span class="line">chmod +x shadowsocksR.sh</span><br><span class="line"></span><br><span class="line"><span class="comment">#运行脚本</span></span><br><span class="line">./shadowsocksR.sh 2&gt;&amp;1 | tee shadowsocksR.log</span><br></pre></td></tr></table></figure><p><strong>CentOS 7</strong> 系统如出现 <code>-bash: wget: command not found</code> 错误请先执行以下命令安装 <strong>wget</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum -y install wget</span><br></pre></td></tr></table></figure><p>安装完成后，脚本提示如下：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">Congratulations, ShadowsocksR server install completed!</span><br><span class="line">Your Server IP        :your_server_ip</span><br><span class="line">Your Server Port      :your_server_port</span><br><span class="line">Your Password         :your_password</span><br><span class="line">Your Protocol         :your_protocol</span><br><span class="line">Your obfs             :your_obfs</span><br><span class="line">Your Encryption Method:your_encryption_method</span><br><span class="line">Welcome to visit:https://shadowsocks.be/9.html</span><br><span class="line">Enjoy it!</span><br></pre></td></tr></table></figure><p>此时已后台启动 ShadowsocksR，运行以下命令可以查看 ShadowsocksR 进程是否已经启动</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/etc/init.d/shadowsocks status</span><br></pre></td></tr></table></figure><p>本脚本安装完成后，已将 ShadowsocksR 自动加入开机自启动。</p><h3 id="卸载方法"><a href="#卸载方法" class="headerlink" title="卸载方法"></a>卸载方法</h3><hr><p>使用 <strong>root</strong> 用户登录，执行以下命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./shadowsocksR.sh uninstall</span><br></pre></td></tr></table></figure><h3 id="使用命令"><a href="#使用命令" class="headerlink" title="使用命令"></a>使用命令</h3><hr><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#启动</span></span><br><span class="line">/etc/init.d/shadowsocks start</span><br><span class="line"></span><br><span class="line"><span class="comment">#停止</span></span><br><span class="line">/etc/init.d/shadowsocks stop</span><br><span class="line"></span><br><span class="line"><span class="comment">#重启</span></span><br><span class="line">/etc/init.d/shadowsocks restart</span><br><span class="line"></span><br><span class="line"><span class="comment">#状态</span></span><br><span class="line">/etc/init.d/shadowsocks status</span><br><span class="line"></span><br><span class="line"><span class="comment">#配置文件路径</span></span><br><span class="line">/etc/shadowsocks.json</span><br><span class="line"></span><br><span class="line"><span class="comment">#日志文件路径</span></span><br><span class="line">/var/<span class="built_in">log</span>/shadowsocks.log</span><br><span class="line"></span><br><span class="line"><span class="comment">#代码安装目录</span></span><br><span class="line">/usr/<span class="built_in">local</span>/shadowsocks</span><br></pre></td></tr></table></figure><h3 id="多用户配置示例"><a href="#多用户配置示例" class="headerlink" title="多用户配置示例"></a>多用户配置示例</h3><hr><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line"><span class="attr">"server"</span>:<span class="string">"0.0.0.0"</span>,</span><br><span class="line"><span class="attr">"server_ipv6"</span>: <span class="string">"[::]"</span>,</span><br><span class="line"><span class="attr">"local_address"</span>:<span class="string">"127.0.0.1"</span>,</span><br><span class="line"><span class="attr">"local_port"</span>:<span class="number">1080</span>,</span><br><span class="line"><span class="attr">"port_password"</span>:&#123;</span><br><span class="line">    <span class="attr">"8989"</span>:<span class="string">"password1"</span>,</span><br><span class="line">    <span class="attr">"8990"</span>:<span class="string">"password2"</span>，</span><br><span class="line">    <span class="string">"8991"</span>:<span class="string">"password3"</span></span><br><span class="line">&#125;,</span><br><span class="line"><span class="attr">"timeout"</span>:<span class="number">300</span>,</span><br><span class="line"><span class="attr">"method"</span>:<span class="string">"aes-256-cfb"</span>,</span><br><span class="line"><span class="attr">"protocol"</span>: <span class="string">"origin"</span>,</span><br><span class="line"><span class="attr">"protocol_param"</span>: <span class="string">""</span>,</span><br><span class="line"><span class="attr">"obfs"</span>: <span class="string">"plain"</span>,</span><br><span class="line"><span class="attr">"obfs_param"</span>: <span class="string">""</span>,</span><br><span class="line"><span class="attr">"redirect"</span>: <span class="string">""</span>,</span><br><span class="line"><span class="attr">"dns_ipv6"</span>: <span class="literal">false</span>,</span><br><span class="line"><span class="attr">"fast_open"</span>: <span class="literal">false</span>,</span><br><span class="line"><span class="attr">"workers"</span>: <span class="number">1</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="SSR协议和混淆插件说明"><a href="#SSR协议和混淆插件说明" class="headerlink" title="SSR协议和混淆插件说明"></a>SSR协议和混淆插件说明</h3><hr><h4 id="工作原理"><a href="#工作原理" class="headerlink" title="工作原理"></a>工作原理</h4><p>C-&gt;S方向</p><p>浏览器请求（socks5协议） -&gt; ssr客户端 -&gt; 协议插件（转为指定协议） -&gt; 加密 -&gt; 混淆插件（转为表面上看起来像http/tls） -&gt; ssr服务端 -&gt; 混淆插件（分离出加密数据） -&gt; 解密 -&gt; 协议插件（转为原协议） -&gt; 转发目标服务器</p><p>其中，协议插件主要用于增加数据完整性校验，增强安全性，包长度混淆等，协议插件主要用于伪装为其它协议</p><h4 id="客户端"><a href="#客户端" class="headerlink" title="客户端"></a>客户端</h4><p><strong>客户端的协议插件暂无配置参数，混淆插件有配置</strong></p><p>参数混淆插件列表如下：</p><ul><li><strong>plain</strong>：不混淆，无参数</li><li><strong>http_simple</strong>：简易伪装为http get请求，参数为要伪装的域名，如cloudfront.com。仅在C#版客户端上支持用逗号分隔多个域名如a.com,b.net,c.org，连接时会随机使用其中之一。不填写参数时，会使用此节点配置的服务器地址作为参数。</li><li><strong>http_post</strong>：与http_simple绝大部分相同，区别是使用POST方式发送数据，符合http规范，欺骗性更好，但只有POST请求这种行为容易被统计分析出异常。参数配置与http_simple一样</li><li><strong>tls1.2_ticket_auth</strong>：伪装为tls请求。参数配置与http_simple一样</li></ul><p>其它插件不推荐使用，在这里忽略</p><p>客户端的协议插件，仅建议使用 <strong>origin</strong> / <strong>verify_sha1</strong> / <strong>auth_sha1_v2</strong> / <strong>auth_sha1_v4</strong> / <strong>auth_aes128_md5</strong> / <strong>auth_aes128_sha1</strong>，解释如下：</p><ul><li><strong>origin</strong>：原版协议，为了兼容</li><li><strong>verify_sha1</strong>：原版OTA协议，为了兼容</li><li><strong>auth_sha1_v2</strong>：中等安全性，无时间校对的要求，适合路由器或树莓派，混淆强度大</li><li><strong>auth_sha1_v4</strong>：较高安全性，有宽松的时间校对要求，混淆强度大</li><li><strong>auth_aes128_md5</strong> 或 <strong>auth_aes128_sha1</strong>：最高安全性，有宽松的时间校对要求，计算量相对高一些，混淆强度较大</li></ul><p>如不考虑兼容，可无视前两个</p><h4 id="服务端"><a href="#服务端" class="headerlink" title="服务端"></a>服务端</h4><p>大部分插件都可以通过添加 <code>compatible</code> 后缀以表示兼容原版，例如默认的<strong>http_simple_compatible</strong> 或 <strong>auth_sha1_v4_compatible</strong> ；</p><p>服务端的协议插件，仅 <code>auth_*</code> 系列有协议参数，其值为整数。表示允许的同时在线客户端数量，建议最小值为 <strong>2</strong> ，默认值 <strong>64</strong>；</p><p>服务端的混淆插件，<strong>http_simple</strong> 或 <strong>http_post</strong> 有混淆参数，用逗号分开若干个host，表示客户端仅能使用以上任一个host连接，而留空表示客户端可以使用任意host。<strong>tls1.2_ticket_auth</strong> 有混淆参数，其值为整数，表示与客户端之间允许的UTC时间差，单位为秒，为 <strong>0</strong> 或不填写（默认）表示无视时间差。</p><h4 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h4><p>如不考虑原版的情况下，推荐使用的协议，只有 <strong>auth_sha1_v4</strong> 和 <strong>auth_aes128_md5</strong> 和 <strong>auth_aes128_sha1</strong> ，推荐使用的混淆只有 <strong>plain</strong> / <strong>http_simple</strong> / <strong>http_post</strong> / <strong>tls1.2_ticket_auth</strong> 不要奇怪为什么推荐 <strong>plain</strong>，因为混淆不总是有效果，要看各地区的策略的，有时候不混淆让其看起来像随机数据更好。</p>]]></content>
    
    <summary type="html">
    
      &lt;img src=&quot;/archives/22a88b65/shadowsocksR.png&quot; class=&quot;&quot;&gt;
    
    </summary>
    
    
    
      <category term="ShadowsocksR" scheme="https://blog.nubi.im/tags/ShadowsocksR/"/>
    
  </entry>
  
  <entry>
    <title>CocoaPods不完全食用指南 — 指令集</title>
    <link href="https://blog.nubi.im/archives/fd41bff3.html"/>
    <id>https://blog.nubi.im/archives/fd41bff3.html</id>
    <published>2017-08-24T09:07:45.000Z</published>
    <updated>2020-05-13T11:18:42.000Z</updated>
    
    <content type="html"><![CDATA[<img src="/archives/fd41bff3/0.png" class=""><a id="more"></a><h3 id="Gem"><a href="#Gem" class="headerlink" title="Gem"></a>Gem</h3><hr><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#查看当前源</span></span><br><span class="line">gem sources -l </span><br><span class="line"></span><br><span class="line"><span class="comment">#移除源</span></span><br><span class="line">sudo gem sources --remove https://rubygems.org/ </span><br><span class="line"></span><br><span class="line"><span class="comment">#添加源</span></span><br><span class="line">sudo gem sources -a https://gems.ruby-china.com/</span><br><span class="line"></span><br><span class="line"><span class="comment">#升级Gem</span></span><br><span class="line">sudo gem update --system</span><br><span class="line"></span><br><span class="line"><span class="comment">#卸载</span></span><br><span class="line">sudo gem uninstall cocoapods</span><br><span class="line"></span><br><span class="line"><span class="comment">#查看本地安装过的CocoaPods相关</span></span><br><span class="line">gem list --<span class="built_in">local</span> | grep cocoapods</span><br></pre></td></tr></table></figure><h3 id="CocoaPods"><a href="#CocoaPods" class="headerlink" title="CocoaPods"></a>CocoaPods</h3><hr><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#安装CocoaPods</span></span><br><span class="line">sudo gem install cocoapods</span><br><span class="line"></span><br><span class="line"><span class="comment">#设置仓库</span></span><br><span class="line">pod setup</span><br><span class="line"></span><br><span class="line"><span class="comment">#查看当前版本号</span></span><br><span class="line">pod --version</span><br><span class="line"></span><br><span class="line"><span class="comment">#创建Podfile</span></span><br><span class="line">touch Podfile</span><br><span class="line"></span><br><span class="line"><span class="comment">#搜索第三方库:&lt;#name#&gt;</span></span><br><span class="line">pod search &lt;<span class="comment">#name#&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#导入第三方库,默认会执行pod repo update指令</span></span><br><span class="line">pod install</span><br><span class="line"></span><br><span class="line"><span class="comment">#导入第三方库</span></span><br><span class="line">pod install --no-repo-update</span><br><span class="line"></span><br><span class="line"><span class="comment">#更新第三方库,默认会执行pod repo update指令</span></span><br><span class="line">pod update</span><br><span class="line"></span><br><span class="line"><span class="comment">#更新第三方库</span></span><br><span class="line">pod update --no-repo-update</span><br><span class="line"></span><br><span class="line"><span class="comment">#清除缓存文件 search_index.json</span></span><br><span class="line">rm ~/Library/Caches/CocoaPods/search_index.json</span><br><span class="line"></span><br><span class="line"><span class="comment">#删除本地的Podspec仓库,&lt;#name#&gt;为仓库名字</span></span><br><span class="line">pod repo remove &lt;<span class="comment">#name#&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#本地添加Podspec仓库,&lt;#name#&gt;为仓库名字,&lt;#source#&gt;为仓库地址</span></span><br><span class="line">pod repo add &lt;<span class="comment">#name#&gt; &lt;#source#&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#更新本地Podspec仓库,&lt;#name#&gt;为仓库名字</span></span><br><span class="line">pod repo update &lt;<span class="comment">#name#&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#创建一个Pod制作工程,&lt;#project#&gt;为工程名字</span></span><br><span class="line">pod lib create &lt;<span class="comment">#project#&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#验证制作的Podspec是否通过</span></span><br><span class="line">pod lib lint</span><br><span class="line"></span><br><span class="line"><span class="comment">#验证制作的Podspec是否通过,编译库文件,允许警告</span></span><br><span class="line">pod lib lint --allow-warnings --use-libraries</span><br><span class="line"></span><br><span class="line"><span class="comment">#发布制作的Podspec</span></span><br><span class="line">pod repo push &lt;<span class="comment">#name#&gt; &lt;#spec#&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#发布制作的Podspec,编译库文件,允许警告</span></span><br><span class="line">pod repo push &lt;<span class="comment">#name#&gt; &lt;#spec#&gt; --allow-warnings --use-libraries</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#本地Pod库缓存列表</span></span><br><span class="line">pod cache list</span><br><span class="line"></span><br><span class="line"><span class="comment">#删除本地名为&lt;#name#&gt;库的缓存</span></span><br><span class="line">pod cache clean &lt;<span class="comment">#name#&gt;</span></span><br></pre></td></tr></table></figure><h4 id="参数-verbose-和-silent"><a href="#参数-verbose-和-silent" class="headerlink" title="参数 --verbose 和--silent"></a>参数 <code>--verbose</code> 和<code>--silent</code></h4><p>这两个参数是用来控制 <strong>pod</strong> 命令的，在看到输出的情况下可以选择 <code>--silent</code> 。而对于在执行这命令的情况下如果出错，则可能添加 <code>--verbose</code> 的参数能看到具体的出错信息。<code>--verbose</code>则是用来输出这两条命令执行过程中所包含的所有信息，对于大多数的 Cocoapods 的命令行来说都带有着两个参数。</p><h3 id="Podfile"><a href="#Podfile" class="headerlink" title="Podfile"></a>Podfile</h3><hr><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#适配iOS 8.0及以上系统</span></span><br><span class="line">platform <span class="symbol">:ios</span>, <span class="string">'8.0'</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#编译成动态库</span></span><br><span class="line">use_frameworks!</span><br><span class="line"></span><br><span class="line"><span class="comment">#屏蔽警告</span></span><br><span class="line">inhibit_all_warnings! </span><br><span class="line"></span><br><span class="line"><span class="comment">#官方开源库地址</span></span><br><span class="line">source <span class="string">'https://github.com/CocoaPods/Specs.git'</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#私有库地址</span></span><br><span class="line">source <span class="string">'https://xxxxx.com/xxxx/xxxx.git'</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#适配名字为App的工程</span></span><br><span class="line">target <span class="string">'App'</span> <span class="keyword">do</span></span><br><span class="line"></span><br><span class="line">  <span class="comment">#导入AFNetworking 3.0及以上的版本</span></span><br><span class="line">  pod <span class="string">'AFNetworking'</span>, <span class="string">'~&gt; 3.0'</span></span><br><span class="line">  </span><br><span class="line">  <span class="comment">#适配名字为AppTests的子工程</span></span><br><span class="line">  target <span class="string">'AppTests'</span> <span class="keyword">do</span></span><br><span class="line">    pod <span class="string">'FBSnapshotTestCase'</span></span><br><span class="line">    </span><br><span class="line">  <span class="keyword">end</span></span><br><span class="line">  </span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure><p><strong>注：</strong> <strong>use_frameworks!</strong> 指明编译成动态库，而不是静态库。它会把所有项目的编译动态库，这一点不太好，但是在使用 <strong>Swift</strong> 库的过程中必须加上这句。</p><h4 id="关于Podfile文件编辑时，第三方库版本号的各种写法"><a href="#关于Podfile文件编辑时，第三方库版本号的各种写法" class="headerlink" title="关于Podfile文件编辑时，第三方库版本号的各种写法"></a>关于Podfile文件编辑时，第三方库版本号的各种写法</h4><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#不显式指定依赖库版本，表示每次都获取最新版本</span></span><br><span class="line">pod <span class="string">'AFNetworking'</span> </span><br><span class="line"></span><br><span class="line"><span class="comment">#只使用2.0版本</span></span><br><span class="line">pod <span class="string">'AFNetworking'</span>, <span class="string">'2.0'</span> </span><br><span class="line"></span><br><span class="line"><span class="comment">#使用高于2.0的版本</span></span><br><span class="line">pod <span class="string">'AFNetworking'</span>, <span class="string">'&gt;2.0'</span> </span><br><span class="line"></span><br><span class="line"><span class="comment">#使用大于或等于2.0的版本</span></span><br><span class="line">pod <span class="string">'AFNetworking'</span>, <span class="string">'&gt;=2.0'</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#使用小于2.0的版本</span></span><br><span class="line">pod <span class="string">'AFNetworking'</span>, <span class="string">'&lt;2.0'</span> </span><br><span class="line"></span><br><span class="line"><span class="comment">#使用小于或等于2.0的版本</span></span><br><span class="line">pod <span class="string">'AFNetworking'</span>, <span class="string">'&lt;=2.0'</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#使用大于等于0.1.2但小于0.2的版本，相当于&gt;=0.1.2并且&lt;0.2.0</span></span><br><span class="line">pod <span class="string">'AFNetworking'</span>, <span class="string">'~&gt;0.1.2'</span> </span><br><span class="line"></span><br><span class="line"><span class="comment">#使用大于等于0.1但小于1.0的版本</span></span><br><span class="line">pod <span class="string">'AFNetworking'</span>, <span class="string">'~&gt;0.1'</span> </span><br><span class="line"></span><br><span class="line"><span class="comment">#高于0的版本，写这个限制和什么都不写是一个效果，都表示使用最新版本</span></span><br><span class="line">pod <span class="string">'AFNetworking'</span>, <span class="string">'~&gt;0'</span> </span><br><span class="line"></span><br><span class="line"><span class="comment">#使用yanff的AFNetworking版本</span></span><br><span class="line">pod <span class="string">'AFNetworking'</span>, <span class="symbol">:git</span> =&gt; <span class="string">'https://github.com/yanff/AFNetworking.git'</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#使用2.x分支的版本</span></span><br><span class="line">pod <span class="string">'AFNetworking'</span>, <span class="symbol">:branch</span> =&gt; <span class="string">'2.x'</span></span><br></pre></td></tr></table></figure><h3 id="更多"><a href="#更多" class="headerlink" title="更多"></a>更多</h3><hr><ul><li><h6 id="CocoaPods不完全食用指南-—-入门篇"><a href="#CocoaPods不完全食用指南-—-入门篇" class="headerlink" title="CocoaPods不完全食用指南 — 入门篇"></a><a href="https://blog.nubi.im/archives/b76b30a0.html">CocoaPods不完全食用指南 — 入门篇</a></h6></li><li><h6 id="CocoaPods不完全食用指南-—-制作篇"><a href="#CocoaPods不完全食用指南-—-制作篇" class="headerlink" title="CocoaPods不完全食用指南 — 制作篇"></a><a href="https://blog.nubi.im/archives/32fee8af.html">CocoaPods不完全食用指南 — 制作篇</a></h6></li><li><h6 id="CocoaPods不完全食用指南-—-私有篇"><a href="#CocoaPods不完全食用指南-—-私有篇" class="headerlink" title="CocoaPods不完全食用指南 — 私有篇"></a><a href="https://blog.nubi.im/archives/87342b1d.html">CocoaPods不完全食用指南 — 私有篇</a></h6></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;img src=&quot;/archives/fd41bff3/0.png&quot; class=&quot;&quot;&gt;
    
    </summary>
    
    
    
      <category term="CocoaPods" scheme="https://blog.nubi.im/tags/CocoaPods/"/>
    
  </entry>
  
  <entry>
    <title>CocoaPods不完全食用指南 — 私有篇</title>
    <link href="https://blog.nubi.im/archives/87342b1d.html"/>
    <id>https://blog.nubi.im/archives/87342b1d.html</id>
    <published>2017-08-24T09:05:42.000Z</published>
    <updated>2020-05-13T11:18:42.000Z</updated>
    
    <content type="html"><![CDATA[<img src="/archives/87342b1d/0.png" class=""><a id="more"></a><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><hr><p>随着公司项目变多，很多公共组件需要进行模块化管理，但是公司的代码又不能放在 <strong>Github</strong> 上，从而诞生了 <strong>私有库</strong> 这种只面向部分人的第三方开源库，本章将详细讲解基于 CocoaPods 对于<strong>模块化</strong>和<strong>私有库</strong>的管理。</p><h3 id="概要"><a href="#概要" class="headerlink" title="概要"></a>概要</h3><hr><p><strong>私有库</strong> 的制作大致分为以下几个步骤:</p><ol><li>创建并设置一个私有的 <strong>Spec Repo</strong></li><li>创建 <strong>Pod</strong> 的所需要的项目工程文件，并且有可访问的项目版本控制地址</li><li>创建 <strong>Pod</strong> 所对应的 <strong>podspec</strong> 文件</li><li>本地测试配置好 <strong>podspec</strong> 文件是否可用</li><li>向私有的 <strong>Spec Repo</strong> 提交 <strong>podspec</strong> 文件</li><li>在项目中的 <strong>Podfile</strong> 中增加制作好的 <strong>Pod</strong> 并使用</li><li>更新维护 <strong>podspec</strong></li><li>如果了解 <strong>公有库</strong> 的制作步骤，可以发现 <strong>私有库</strong> 的制作步骤多了一个创建私有的 <strong>Spec Repo</strong> 的过程，而且提交的过程也变成向私有 <strong>Spec Repo</strong> 提交了。</li></ol><p>在制作私有库之前，推荐不了解的 <a href="https://yanff.github.io/blog/2017/08/24/CocoaPods不完全食用指南-制作/" target="_blank" rel="noopener"><strong>公有库制作步骤</strong></a> 的同学先去了解一下</p><h3 id="创建私有Spec-Repo"><a href="#创建私有Spec-Repo" class="headerlink" title="创建私有Spec Repo"></a>创建私有Spec Repo</h3><hr><p><strong>Spec Repo</strong> 是一个装着所有 <strong>Pods</strong> 的索引容器，所有公开的 <strong>Pods</strong> 的索引都在这个里面，它是一个托管在 <strong>Github</strong> 的远程仓库。在本地使用 CocoaPods 后它会被 <code>clone</code>到本地的 <strong>~/.cocoapods/repos</strong> 目录下，进入该目录可以看到如下结构：</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">.</span><br><span class="line">├── master</span><br><span class="line">│   ├── CocoaPods-version.yml</span><br><span class="line">│   ├── README.md</span><br><span class="line">│   └── Specs</span><br><span class="line">│       ├── <span class="number">0</span></span><br><span class="line">│       ├── <span class="number">1</span></span><br><span class="line">│       ├── <span class="number">2</span></span><br><span class="line">│       ├── <span class="number">3</span></span><br><span class="line">│       ├── <span class="number">4</span></span><br><span class="line">│       ├── <span class="number">5</span></span><br><span class="line">│       ├── <span class="number">6</span></span><br><span class="line">│       ├── <span class="number">7</span></span><br><span class="line">│       ├── <span class="number">8</span></span><br><span class="line">│       ├── <span class="number">9</span></span><br><span class="line">│       ├── a</span><br><span class="line">│       ├── b</span><br><span class="line">│       ├── c</span><br><span class="line">│       ├── d</span><br><span class="line">│       ├── e</span><br><span class="line">│       └── f</span><br></pre></td></tr></table></figure><p><strong>Specs</strong> 文件夹中就是所有向 CocoaPods 注册过的第三方库的索引。因此，我们建立私有库的第一步就是建立一个私有的 <strong>Spec Repo</strong>，在公司的 <strong>Git</strong> 上创建一个私有的仓库 <strong>Spec Repo</strong>，然后在本地增加 CocoaPods 的私有 <strong>Spec Repo</strong> 仓库</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># private 是本地私有仓库的名字</span></span><br><span class="line"><span class="comment"># 地址是私有仓库的可访问地址,最好是SSH地址</span></span><br><span class="line">pod repo add private root@git.canplay.com.cn:yanff/SpecRepo.git</span><br></pre></td></tr></table></figure><p>此时到 <strong>~/.cocoapods/repos</strong> 目录，可以看到多了个 <strong>private</strong> 的文件夹：</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">.</span><br><span class="line">├── master</span><br><span class="line">│   ├── CocoaPods-version.yml</span><br><span class="line">│   ├── README.md</span><br><span class="line">│   └── Specs</span><br><span class="line">│       ├── <span class="number">0</span></span><br><span class="line">│       ├── <span class="number">1</span></span><br><span class="line">│       ├── <span class="number">2</span></span><br><span class="line">│       ├── <span class="number">3</span></span><br><span class="line">│       ├── <span class="number">4</span></span><br><span class="line">│       ├── <span class="number">5</span></span><br><span class="line">│       ├── <span class="number">6</span></span><br><span class="line">│       ├── <span class="number">7</span></span><br><span class="line">│       ├── <span class="number">8</span></span><br><span class="line">│       ├── <span class="number">9</span></span><br><span class="line">│       ├── a</span><br><span class="line">│       ├── b</span><br><span class="line">│       ├── c</span><br><span class="line">│       ├── d</span><br><span class="line">│       ├── e</span><br><span class="line">│       └── f</span><br><span class="line">└── private</span><br><span class="line">    ├── LICENSE</span><br><span class="line">    └── README.md</span><br></pre></td></tr></table></figure><p>此时创建私有 <strong>Spec Repo</strong> 的步骤就完成了</p><h3 id="创建私有Pod工程文件"><a href="#创建私有Pod工程文件" class="headerlink" title="创建私有Pod工程文件"></a>创建私有Pod工程文件</h3><hr><p>创建与测试的过程在这里不再详解，需要注意的是:<br><strong>Pod</strong> 项目工程文件所添加的远程仓库应该也在公司的 <strong>Git</strong> 上，而且拥有地址的访问权限，<strong>Podsepc</strong> 文件中的地址最好是仓库的 <strong>SSH</strong> 地址。</p><h3 id="Spec-Repo提交podspec"><a href="#Spec-Repo提交podspec" class="headerlink" title="Spec Repo提交podspec"></a>Spec Repo提交podspec</h3><hr><p>与创建 <strong>公有库</strong> 不同的是，此时提交应该向私有 <strong>Spec Repo</strong> 提交</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># private 是本地私有仓库的名字</span></span><br><span class="line">pod repo push private PodDemo.podspec</span><br></pre></td></tr></table></figure><p>此时在之前建立的远程 Spec Repo 仓库里能看到我们提交的 <strong>podspec</strong> 文件了</p><p>最后更新一下本地的私有 <strong>Spec Repo</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># private 是本地私有仓库的名字</span></span><br><span class="line">pod repo update private</span><br></pre></td></tr></table></figure><p>然后输入搜索命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pod search PodDemo</span><br></pre></td></tr></table></figure><p>就可以搜索到刚刚提交的库了</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">-&gt; PodDemo (<span class="number">1.0</span>.<span class="number">0</span>)</span><br><span class="line">   a brief introduction</span><br><span class="line">   pod <span class="string">'PodDemo'</span>, <span class="string">'~&gt; 1.0.0'</span></span><br><span class="line">   - <span class="symbol">Homepage:</span> <span class="symbol">https:</span>/<span class="regexp">/root@git.canplay.com.cn:yanff/</span>PodDemo</span><br><span class="line">   - <span class="symbol">Source:</span>   <span class="symbol">https:</span>/<span class="regexp">/root@git.canplay.com.cn:yanff/</span>PodDemo.git</span><br><span class="line">   - <span class="symbol">Versions:</span> <span class="number">1.0</span>.<span class="number">0</span> [private repo]</span><br></pre></td></tr></table></figure><p>此时，我们的私有库就制作完毕了。</p><h3 id="在Podfile中加入私有Spec-Repo地址"><a href="#在Podfile中加入私有Spec-Repo地址" class="headerlink" title="在Podfile中加入私有Spec Repo地址"></a>在Podfile中加入私有Spec Repo地址</h3><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">platform <span class="symbol">:ios</span>, <span class="string">'8.0'</span> <span class="comment">#当前工程最低支持iOS 8.0</span></span><br><span class="line"></span><br><span class="line">source <span class="string">'https://github.com/CocoaPods/Specs.git'</span>  <span class="comment"># 官方库</span></span><br><span class="line">source <span class="string">'root@git.canplay.com.cn:yanff/SpecRepo.git'</span>  <span class="comment"># 私有库</span></span><br><span class="line"></span><br><span class="line">target <span class="string">'NAME'</span> <span class="keyword">do</span>    <span class="comment">#NAME是工程的名字</span></span><br><span class="line"></span><br><span class="line">pod <span class="string">'AFNetworking'</span>, <span class="string">'~&gt; 3.1.0'</span> <span class="comment">#导入AFNetworking 3.1.0的版本</span></span><br><span class="line"></span><br><span class="line">pod <span class="string">'PodDemo'</span>, <span class="string">'~&gt; 1.0.0'</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">end</span></span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">-- INSERT --</span><br></pre></td></tr></table></figure><p>然后执行命令就可以使用私有库了</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pod install</span><br></pre></td></tr></table></figure><h3 id="注意"><a href="#注意" class="headerlink" title="注意"></a>注意</h3><hr><p>如果有其他合作人员共同使用这个<strong>私有库</strong> 的话，需要给予对应远程 <strong>私有库</strong> 仓库和 <strong>Spec Repo</strong> 仓库的权限，最好使用 <strong>SSH</strong> 认证连接 ，然后再执行上面的命令添加这个 Spec Repo 到本地即可。</p><h3 id="更多"><a href="#更多" class="headerlink" title="更多"></a>更多</h3><hr><ul><li><h6 id="CocoaPods不完全食用指南-—-入门篇"><a href="#CocoaPods不完全食用指南-—-入门篇" class="headerlink" title="CocoaPods不完全食用指南 — 入门篇"></a><a href="https://blog.nubi.im/archives/b76b30a0.html">CocoaPods不完全食用指南 — 入门篇</a></h6></li><li><h6 id="CocoaPods不完全食用指南-—-制作篇"><a href="#CocoaPods不完全食用指南-—-制作篇" class="headerlink" title="CocoaPods不完全食用指南 — 制作篇"></a><a href="https://blog.nubi.im/archives/32fee8af.html">CocoaPods不完全食用指南 — 制作篇</a></h6></li><li><h6 id="CocoaPods不完全食用指南-—-指令集"><a href="#CocoaPods不完全食用指南-—-指令集" class="headerlink" title="CocoaPods不完全食用指南 — 指令集"></a><a href="https://blog.nubi.im/archives/fd41bff3.html">CocoaPods不完全食用指南 — 指令集</a></h6></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;img src=&quot;/archives/87342b1d/0.png&quot; class=&quot;&quot;&gt;
    
    </summary>
    
    
    
      <category term="CocoaPods" scheme="https://blog.nubi.im/tags/CocoaPods/"/>
    
  </entry>
  
  <entry>
    <title>CocoaPods不完全食用指南 — 制作篇</title>
    <link href="https://blog.nubi.im/archives/32fee8af.html"/>
    <id>https://blog.nubi.im/archives/32fee8af.html</id>
    <published>2017-08-24T09:04:47.000Z</published>
    <updated>2020-05-13T11:18:42.000Z</updated>
    
    <content type="html"><![CDATA[<img src="/archives/32fee8af/0.png" class=""><a id="more"></a><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><hr><p>对于公开给所有人的开源库，我们称之为<strong>公有库</strong>；而针对部分人的开源库，比如公司内部的开源，我们称之为<strong>私有库</strong>。本章所讲解的是如何使<strong>公有库</strong>支持 Cocoapods，能在Cocoapods 上搜索并且使用。</p><h3 id="概要"><a href="#概要" class="headerlink" title="概要"></a>概要</h3><hr><p><strong>公有库</strong> 的制作大致分为以下几个步骤:</p><ol><li>创建 <strong>Pod</strong> 的所需要的项目工程文件，并且有可访问的项目版本控制地址</li><li>创建 <strong>Pod</strong> 所对应的 <strong>podspec</strong> 文件</li><li>本地测试配置好 <strong>podspec</strong> 文件是否可用</li><li>向 <strong>Spec Repo</strong> 提交 <strong>podspec</strong> 文件</li><li>在项目中的 <strong>Podfile</strong> 中增加制作好的 <strong>Pod</strong> 并使用</li><li>更新维护 <strong>podspec</strong></li></ol><h3 id="创建Pod项目工程文件"><a href="#创建Pod项目工程文件" class="headerlink" title="创建Pod项目工程文件"></a>创建Pod项目工程文件</h3><hr><p>Cocoapods 为我们提供了快熟创建<strong>Pod</strong>项目工程的工具，先进入桌面<code>cd Desktop/</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pod lib create PodDemo</span><br></pre></td></tr></table></figure><p>然后会出现</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Cloning `https://github.com/CocoaPods/pod-template.git` into `PodDemo`.</span><br><span class="line">Configuring PodDemo template.</span><br><span class="line"></span><br><span class="line">------------------------------</span><br><span class="line"></span><br><span class="line">To get you started we need to ask a few questions, this should only take a minute.</span><br></pre></td></tr></table></figure><p>接下来会出现几个问题：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment">#选择语言</span></span><br><span class="line">What language <span class="keyword">do</span> you want to use?? [ Swift / ObjC ]</span><br><span class="line"> &gt; ObjC</span><br><span class="line"> </span><br><span class="line"><span class="comment">#是否需要一个例子工程</span></span><br><span class="line">Would you like to include a demo application with your library? [ Yes / No ]</span><br><span class="line"> &gt; Yes </span><br><span class="line"></span><br><span class="line"><span class="comment">#选择一个测试框架</span></span><br><span class="line">Which testing frameworks will you use? [ Specta / Kiwi / None ]</span><br><span class="line"> &gt; None</span><br><span class="line"></span><br><span class="line"><span class="comment">#是否基于View测试</span></span><br><span class="line">Would you like to <span class="keyword">do</span> view based testing? [ Yes / No ]</span><br><span class="line"> &gt; Yes</span><br><span class="line"></span><br><span class="line"><span class="comment">#类的前缀</span></span><br><span class="line">What is your class prefix?</span><br><span class="line"> &gt; YAN</span><br></pre></td></tr></table></figure><p>输入完后，就开始建立工程，最后出现</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Pod installation complete! There are <span class="number">2</span> dependencies from the Podfile <span class="keyword">and</span> <span class="number">2</span> total pods installed.</span><br></pre></td></tr></table></figure><p>查看新建的工程目录：</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">.</span><br><span class="line">├── Example</span><br><span class="line">│   ├── PodDemo</span><br><span class="line">│   ├── PodDemo.xcodeproj</span><br><span class="line">│   ├── PodDemo.xcworkspace</span><br><span class="line">│   ├── Podfile              <span class="comment"># PodDemo的依赖描述文件</span></span><br><span class="line">│   ├── Podfile.lock</span><br><span class="line">│   ├── Pods                 <span class="comment"># PodDemo的依赖文件</span></span><br><span class="line">│   └── Tests</span><br><span class="line">├── LICENSE                  <span class="comment">#开源协议 默认MIT</span></span><br><span class="line">├── PodDemo                  <span class="comment">#组件的目录</span></span><br><span class="line">│   ├── Assets               <span class="comment">#资源文件</span></span><br><span class="line">│   └── Classes              <span class="comment">#类文件</span></span><br><span class="line">├── PodDemo.podspec          <span class="comment">#podspec文件</span></span><br><span class="line">├── README.md                <span class="comment">#Markdown格式的README</span></span><br><span class="line">└── _Pods.xcodeproj -&gt; Example/Pods/Pods.xcodeproj</span><br><span class="line"></span><br><span class="line"><span class="number">10</span> directories, <span class="number">5</span> files</span><br></pre></td></tr></table></figure><p>接下来就是将要开源的文件放入 <code>PodDemo/Classes</code>中，<code>PodDemo/Assets</code>中放入资源文件，然后进入<code>Example</code>文件夹执行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pod update</span><br></pre></td></tr></table></figure><p>此时再打开工程就能看到刚刚添加的文件已经在<strong>Pods</strong>工程下 <code>Development Pods/PodDemo</code>中了，然后就可以编辑工程Demo了。</p><p><strong>注：</strong>这里需要注意的是每次向<strong>Pod</strong>中添加了新的文件或者以后更新了<strong>podspec</strong>的版本都需要重新执行一遍<strong>pod update</strong>命令。</p><h3 id="推送到远程仓库"><a href="#推送到远程仓库" class="headerlink" title="推送到远程仓库"></a>推送到远程仓库</h3><hr><p>首先到<strong>Github</strong>创建一个<strong>Public</strong>仓库</p><img src="/archives/32fee8af/1.png" class=""><p>通过 Cocoapods 创建出来的目录本身就在本地的 <strong>Git</strong> 管理下，我们需要做的就是给它添加远端仓库，先到 <strong>PodDemo</strong> 目录下，先添加上面创建仓库的 <strong>SSH</strong> 地址，然后把代码推送到远程</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#提交到暂存区</span></span><br><span class="line">git add .</span><br><span class="line"><span class="comment">#提交信息</span></span><br><span class="line">git commit -s -m <span class="string">"Initial Commit of PodDemo"</span></span><br><span class="line"><span class="comment">#添加远程仓库</span></span><br><span class="line">git remote add origin git@github.com:yanff/PodDemo.git</span><br><span class="line"><span class="comment">#推到远端仓库</span></span><br><span class="line">git push origin master</span><br></pre></td></tr></table></figure><p>推送完后我们可以看到<strong>Github</strong>上的远程仓库已经有了代码</p><img src="/archives/32fee8af/2.png" class=""><p>因为 <strong>podspec</strong> 文件中获取<strong>Git</strong>版本控制的项目还需要<strong>tag</strong>号，所以我们要打上一个<strong>tag</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git tag -m <span class="string">"first release"</span> 1.0.0</span><br><span class="line">git push --tags     <span class="comment">#推送tag到远端仓库</span></span><br></pre></td></tr></table></figure><h3 id="编辑Podsepc文件"><a href="#编辑Podsepc文件" class="headerlink" title="编辑Podsepc文件"></a>编辑Podsepc文件</h3><hr><p>在所有支持 Cocoapods 导入的库的开源目录下，都有一个 <strong>.Podsepc</strong> 的文件。无论是做<strong>公有库</strong>还是<strong>私有库</strong>，都必须配置这个文件。<strong>Podsepc</strong> 文件中记录了库的一些基本信息，包括版本号、获取的地址等等。</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line">Pod::Spec.new <span class="keyword">do</span> <span class="params">|s|</span> </span><br><span class="line"></span><br><span class="line">  <span class="comment">#库的名字</span></span><br><span class="line">  s.name         = <span class="string">"PodDemo"</span></span><br><span class="line">  </span><br><span class="line">  <span class="comment">#库的版本号</span></span><br><span class="line">  s.version      = <span class="string">"1.0.0"</span></span><br><span class="line">  </span><br><span class="line">  <span class="comment">#库的简介</span></span><br><span class="line">  s.summary      = <span class="string">"a brief introduction"</span></span><br><span class="line">  </span><br><span class="line">  <span class="comment">#库的主页</span></span><br><span class="line">  s.homepage     = <span class="string">"https://github.com/yanff/PodDemo"</span></span><br><span class="line">  </span><br><span class="line">  <span class="comment">#许可证信息</span></span><br><span class="line">  s.license      = &#123; <span class="symbol">:type</span> =&gt; <span class="string">"MIT"</span>, <span class="symbol">:file</span> =&gt; <span class="string">'LICENSE.md'</span> &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="comment">#作者的信息</span></span><br><span class="line">  s.author       = &#123; <span class="string">"yanff"</span> =&gt; <span class="string">"yanff.us@gmail.com"</span> &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="comment">#库支持的iOS最低版本</span></span><br><span class="line">  s.platform     = <span class="symbol">:ios</span>, <span class="string">"8.0"</span> </span><br><span class="line">  </span><br><span class="line">  <span class="comment">#库文件的源码地址</span></span><br><span class="line">  s.source       = &#123; <span class="symbol">:git</span> =&gt; <span class="string">"https://github.com/yanff/PodDemo.git"</span>, <span class="symbol">:tag</span> =&gt; s.version&#125; </span><br><span class="line">  </span><br><span class="line">  <span class="comment">#所需要支持的框架</span></span><br><span class="line">  s.frameworks   = <span class="string">'UIKit'</span> </span><br><span class="line">  </span><br><span class="line">  <span class="comment">#配置库所需的文件,**表示全匹配,*.&#123;h,m&#125;表示匹配所有的.h和.m文件</span></span><br><span class="line">  s.source_files = <span class="string">"PodDemo/Classes/*.&#123;h,m&#125;"</span></span><br><span class="line">  </span><br><span class="line">  <span class="comment">#库所需的资源文件</span></span><br><span class="line">  s.resource     = <span class="string">"PodDemo/Assets/**"</span> </span><br><span class="line">  </span><br><span class="line">  <span class="comment">#支持ARC还是MRC</span></span><br><span class="line">  s.requires_arc = <span class="literal">true</span> </span><br><span class="line">  </span><br><span class="line">  <span class="comment">#依赖第三方库，例如:AFNetworking,3.1.0版本</span></span><br><span class="line">  s.dependency <span class="string">'AFNetworking'</span>, <span class="string">'~&gt;3.1.0'</span>  </span><br><span class="line">  </span><br><span class="line">  <span class="comment">#注：非必须，针对库进行模块化才需做子目录的处理</span></span><br><span class="line">  s.subspec <span class="string">'SubPodDemo'</span> <span class="keyword">do</span> <span class="params">|ss|</span></span><br><span class="line">    ss.source_files = <span class="string">'PodDemo/SubPodDemo/**/*.&#123;h,m&#125;'</span></span><br><span class="line">  <span class="keyword">end</span></span><br><span class="line">  </span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure><p>编辑完 <strong>podspec</strong>文件后，需要验证一下这个文件是否可用，如果有任何 <strong>WARNING</strong> 或者 <strong>ERROR</strong> 都是不可以的，它就不能被添加到 <strong>Spec Repo</strong> 中，不过 <strong>Xcode</strong> 的 <strong>WARNINGO</strong> 是可以存在的，验证需要执行命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pod lib lint</span><br></pre></td></tr></table></figure><p>如果看到</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"> -&gt; PodDemo (<span class="number">1.0</span>.<span class="number">0</span>)</span><br><span class="line"></span><br><span class="line">PodDemo passed validation.</span><br></pre></td></tr></table></figure><p>说明验证通过了，不过只是这个 <strong>podspec</strong> 文件是合格的，不一定说明这个 <strong>Pod</strong> 是可用的，我们需要本地验证一下</p><h3 id="本地测试podspec文件"><a href="#本地测试podspec文件" class="headerlink" title="本地测试podspec文件"></a>本地测试podspec文件</h3><hr><p>本地创建一个新的项目，在这个项目的 <strong>Podfile</strong> 文件中直接指定刚才创建编辑好的 <strong>podspec</strong> 文件，测试能否使用。在 <strong>Podfile</strong> 文件中编辑</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">platform <span class="symbol">:ios</span>, <span class="string">'8.0'</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定podspec文件</span></span><br><span class="line">pod <span class="string">'PodDemo'</span>, <span class="symbol">:podspec</span> =&gt; <span class="string">'/Users/Yan/Desktop/PodDemo/PodDemo.podspec'</span></span><br></pre></td></tr></table></figure><p>然后执行 <code>pod install</code>命令安装依赖，打开项目工程，可以看到库文件都被加载到 <strong>Pods</strong>子项目中了。在项目中编写代码，测试库文件无误后就可以提交 <strong>podspec</strong> 到 <strong>Spec Repo</strong>中了</p><h3 id="向Spec-Repo提交podspec"><a href="#向Spec-Repo提交podspec" class="headerlink" title="向Spec Repo提交podspec"></a>向Spec Repo提交podspec</h3><hr><p>注册trunk，查看是否注册过</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pod trunk me</span><br></pre></td></tr></table></figure><p>如果没有注册</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pod trunk register yanff.us@gmail.com <span class="string">"YAN"</span></span><br></pre></td></tr></table></figure><p>注册完后，提交到 <strong>Spec Repo</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pod trunk push PodDemo.podspec</span><br></pre></td></tr></table></figure><p>最后更新一下本地的 <strong>Spec Repo</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pod repo update</span><br></pre></td></tr></table></figure><p>然后输入搜索命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pod search PodDemo</span><br></pre></td></tr></table></figure><p>就可以搜索到刚刚提交的库了</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">-&gt; PodDemo (<span class="number">1.0</span>.<span class="number">0</span>)</span><br><span class="line">   a brief introduction</span><br><span class="line">   pod <span class="string">'PodDemo'</span>, <span class="string">'~&gt; 1.0.0'</span></span><br><span class="line">   - <span class="symbol">Homepage:</span> <span class="symbol">https:</span>/<span class="regexp">/github.com/yanff</span><span class="regexp">/PodDemo</span></span><br><span class="line"><span class="regexp">   - Source:   https:/</span><span class="regexp">/github.com/yanff</span><span class="regexp">/PodDemo.git</span></span><br><span class="line"><span class="regexp">   - Versions: 1.0.0 [master repo]</span></span><br></pre></td></tr></table></figure><p><strong>自此，我们也成为了开源主义的接班人，公有库的制作已经完毕了，其他人可以通过CocoaPods使用我们制作的库了</strong></p><h3 id="关于更新和维护"><a href="#关于更新和维护" class="headerlink" title="关于更新和维护"></a>关于更新和维护</h3><hr><p>如果想要更新和维护版本，只需要在<code>PodDemo/Classes</code>中进行源码的修改，然后在<strong>Podsepc</strong>文件中修改文件的路径以及版本号，需要注意的是，版本号一定要对应相应仓库的<strong>tag</strong> ，而且每次进行修改的时候，版本号不能低于原来的版本号，然后再向 <strong>Spec Repo</strong> 提交新的<strong>podspec</strong></p><h3 id="更多"><a href="#更多" class="headerlink" title="更多"></a>更多</h3><hr><ul><li><h6 id="CocoaPods不完全食用指南-—-入门篇"><a href="#CocoaPods不完全食用指南-—-入门篇" class="headerlink" title="CocoaPods不完全食用指南 — 入门篇"></a><a href="https://blog.nubi.im/archives/b76b30a0.html">CocoaPods不完全食用指南 — 入门篇</a></h6></li><li><h6 id="CocoaPods不完全食用指南-—-私有篇"><a href="#CocoaPods不完全食用指南-—-私有篇" class="headerlink" title="CocoaPods不完全食用指南 — 私有篇"></a><a href="https://blog.nubi.im/archives/87342b1d.html">CocoaPods不完全食用指南 — 私有篇</a></h6></li><li><h6 id="CocoaPods不完全食用指南-—-指令集"><a href="#CocoaPods不完全食用指南-—-指令集" class="headerlink" title="CocoaPods不完全食用指南 — 指令集"></a><a href="https://blog.nubi.im/archives/fd41bff3.html">CocoaPods不完全食用指南 — 指令集</a></h6></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;img src=&quot;/archives/32fee8af/0.png&quot; class=&quot;&quot;&gt;
    
    </summary>
    
    
    
      <category term="CocoaPods" scheme="https://blog.nubi.im/tags/CocoaPods/"/>
    
  </entry>
  
  <entry>
    <title>CocoaPods不完全食用指南 — 入门篇</title>
    <link href="https://blog.nubi.im/archives/b76b30a0.html"/>
    <id>https://blog.nubi.im/archives/b76b30a0.html</id>
    <published>2017-08-24T03:06:54.000Z</published>
    <updated>2020-05-13T11:18:42.000Z</updated>
    
    <content type="html"><![CDATA[<img src="/archives/b76b30a0/0.png" class=""><a id="more"></a><h3 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h3><hr><h4 id="1-什么是-CocoaPods"><a href="#1-什么是-CocoaPods" class="headerlink" title="1. 什么是 CocoaPods"></a>1. 什么是 CocoaPods</h4><p>每种语言发展到一个阶段，就会出现相应的依赖管理工具，例如 <strong>Java</strong> 的 Maven 、<strong>Node.js</strong> 的 NPM 。而CocoaPods， 就是 <strong>OS X</strong> 和 <strong>iOS</strong> 下 的一个第三方库管理工具。它的源码在 <strong>Github</strong> 上管理，项目开始于 2011 年 8 月 12 日，经过多年发展，现在已经成为 <strong>OS X</strong> 和 <strong>iOS</strong>  开发的依赖管理标准工具，它的出现使得我们可以节省设置和更新第三方开源库的时间。</p><h4 id="2-CocoaPods-的好处"><a href="#2-CocoaPods-的好处" class="headerlink" title="2. CocoaPods 的好处"></a>2. CocoaPods 的好处</h4><p>使用 CocoaPods 可以很方便地查找新的第三方库，在引入第三方库时可以自动为我们配置好依赖的环境，包括配置编译阶段、连接器选项，甚至是 ARC 环境下的 -fno-objc-arc 配置等。这些类库是比较“标准的”，从而可以便捷的管理第三方库。</p><h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><hr><p>CocoaPods 依赖于 <strong>Ruby</strong> 环境，目前 <strong>OS X *<em>系统默认已经可以运行 *</em>Ruby</strong>。<strong>Gem</strong> 是一个管理 <strong>Ruby</strong> 库和程序的标准包，我们可以通过 <strong>Gem</strong> 安装 CocoaPods 。 </p><h4 id="1-更换Ruby源"><a href="#1-更换Ruby源" class="headerlink" title="1. 更换Ruby源"></a>1. 更换Ruby源</h4><p>因为 <strong>Ruby</strong> 的软件源 <strong>rubygems.org</strong> 使用亚马逊的云服务，国内访问受限，需要更新一下<strong>ruby</strong>的源</p><p><strong>注意：在终端输入命令时，取$后面部分输入</strong></p><p>查看当前的 <strong>Ruby</strong> 源</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gem sources -l</span><br></pre></td></tr></table></figure><p>移除当前的 <strong>Ruby</strong> 源</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo gem sources --remove https://rubygems.org/</span><br></pre></td></tr></table></figure><p>设置当前 <strong>Ruby</strong> 的源为国内的</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo gem sources -a https://gems.ruby-china.com/</span><br></pre></td></tr></table></figure><p>再次查看当前的 <strong>Ruby</strong> 源</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gem sources -l</span><br></pre></td></tr></table></figure><p>如果 <strong>Terminal</strong> 输出：</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">*** CURRENT SOURCES ***</span><br><span class="line"></span><br><span class="line"><span class="symbol">https:</span>/<span class="regexp">/gems.ruby-china.com/</span></span><br></pre></td></tr></table></figure><p>则 <strong>Ruby</strong> 源已经设置成功</p><h4 id="2-升级Gem"><a href="#2-升级Gem" class="headerlink" title="2. 升级Gem"></a>2. 升级Gem</h4><p>如果 <strong>Gem</strong> 的版本过低也可能导致安装失败，先升级 <strong>Gem</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo gem update --system</span><br></pre></td></tr></table></figure><p>升级成功后会提示: <strong>Latest version currently installed. Aborting.</strong></p><h4 id="3-安装CocoaPods"><a href="#3-安装CocoaPods" class="headerlink" title="3. 安装CocoaPods"></a>3. 安装CocoaPods</h4><p>执行安装 CocoaPods 命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo gem install cocoapods</span><br></pre></td></tr></table></figure><p>如果报以下错误：</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">ERROR:</span>  While executing gem ... (Errno::EPERM)</span><br><span class="line">Operation <span class="keyword">not</span> permitted - <span class="regexp">/usr/bin</span><span class="regexp">/xcodeproj</span></span><br></pre></td></tr></table></figure><p>说明没有权限，需要输入</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo gem install -n /usr/<span class="built_in">local</span>/bin cocoapods</span><br></pre></td></tr></table></figure><p>安装成功后</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pod setup</span><br></pre></td></tr></table></figure><p>然后会出现 <strong>Setting up CocoaPods master repo</strong>，此时需要等待的时间较久，这一步是 Cocoapods 在将它的信息下载到 <strong>~/.cocoapods</strong> 目录下。<br>你可以<code>Command + N</code>新建一个终端窗口，执行命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> ~/.cocoapods/</span><br><span class="line">du -sh *</span><br></pre></td></tr></table></figure><p>查看下载进度，安装成功后,你会看到 <strong>Setup completed</strong></p><p><strong>注意：</strong>CocoaPods 1.8.0以后不再需要执行 <code>pod setup</code> ，而是会在执行 <code>pod search xxxx</code> 时自动创建索引。</p><h3 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h3><hr><h4 id="1-新建-Podfile文件"><a href="#1-新建-Podfile文件" class="headerlink" title="1. 新建 Podfile文件"></a>1. 新建 Podfile文件</h4><p>使用时需要在你的项目根目录下新建一个名为 <strong>Podfile</strong> 的文件，在工程目录</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">touch Podfile</span><br></pre></td></tr></table></figure><h4 id="2-查找第三方库"><a href="#2-查找第三方库" class="headerlink" title="2. 查找第三方库"></a>2. 查找第三方库</h4><p>以 <strong>AFNetworking</strong> 为例</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pod search AFNetworking</span><br></pre></td></tr></table></figure><p>如果出现</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[!] Unable to find a pod with name, author, summary, <span class="keyword">or</span> description matching <span class="string">`AFNetworking`</span></span><br></pre></td></tr></table></figure><p>这是因为之前pod search的时候生成了缓存文件 <strong>search_index.json</strong> ，执行 </p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rm ~/Library/Caches/CocoaPods/search_index.json</span><br></pre></td></tr></table></figure><p>来删除该文件，然后再次搜索<br>若搜索后会出现</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">-&gt; AFNetworking (<span class="number">3.1</span>.<span class="number">0</span>)</span><br><span class="line">   A delightful iOS <span class="keyword">and</span> OS X networking framework.</span><br><span class="line">   pod <span class="string">'AFNetworking'</span>, <span class="string">'~&gt; 3.1.0'</span></span><br><span class="line">   - <span class="symbol">Homepage:</span> <span class="symbol">https:</span>/<span class="regexp">/github.com/</span>AFNetworking/AFNetworking</span><br><span class="line">   - <span class="symbol">Source:</span>   <span class="symbol">https:</span>/<span class="regexp">/github.com/</span>AFNetworking/AFNetworking.git</span><br><span class="line">   - <span class="symbol">Versions:</span> <span class="number">3.1</span>.<span class="number">0</span>, <span class="number">3.0</span>.<span class="number">4</span>, <span class="number">3.0</span>.<span class="number">3</span>, <span class="number">3.0</span>.<span class="number">2</span>, <span class="number">3.0</span>.<span class="number">1</span>, <span class="number">3.0</span>.<span class="number">0</span>, <span class="number">3.0</span>.<span class="number">0</span>-beta.<span class="number">3</span>,</span><br><span class="line">   <span class="number">3.0</span>.<span class="number">0</span>-beta.<span class="number">2</span>, <span class="number">3.0</span>.<span class="number">0</span>-beta.<span class="number">1</span>, <span class="number">2.6</span>.<span class="number">3</span>, <span class="number">2.6</span>.<span class="number">2</span>, <span class="number">2.6</span>.<span class="number">1</span>, <span class="number">2.6</span>.<span class="number">0</span>, <span class="number">2.5</span>.<span class="number">4</span>, <span class="number">2.5</span>.<span class="number">3</span>, <span class="number">2.5</span>.<span class="number">2</span>,</span><br><span class="line">   <span class="number">2.5</span>.<span class="number">1</span>, <span class="number">2.5</span>.<span class="number">0</span>, <span class="number">2.4</span>.<span class="number">1</span>, <span class="number">2.4</span>.<span class="number">0</span>, <span class="number">2.3</span>.<span class="number">1</span>, <span class="number">2.3</span>.<span class="number">0</span>, <span class="number">2.2</span>.<span class="number">4</span>, <span class="number">2.2</span>.<span class="number">3</span>, <span class="number">2.2</span>.<span class="number">2</span>, <span class="number">2.2</span>.<span class="number">1</span>, <span class="number">2.2</span>.<span class="number">0</span>,</span><br><span class="line">   <span class="number">2.1</span>.<span class="number">0</span>, <span class="number">2.0</span>.<span class="number">3</span>, <span class="number">2.0</span>.<span class="number">2</span>, <span class="number">2.0</span>.<span class="number">1</span>, <span class="number">2.0</span>.<span class="number">0</span>, <span class="number">2.0</span>.<span class="number">0</span>-RC3, <span class="number">2.0</span>.<span class="number">0</span>-RC2, <span class="number">2.0</span>.<span class="number">0</span>-RC1, <span class="number">1.3</span>.<span class="number">4</span>,</span><br><span class="line">   <span class="number">1.3</span>.<span class="number">3</span>, <span class="number">1.3</span>.<span class="number">2</span>, <span class="number">1.3</span>.<span class="number">1</span>, <span class="number">1.3</span>.<span class="number">0</span>, <span class="number">1.2</span>.<span class="number">1</span>, <span class="number">1.2</span>.<span class="number">0</span>, <span class="number">1.1</span>.<span class="number">0</span>, <span class="number">1.0</span>.<span class="number">1</span>, <span class="number">1.0</span>, <span class="number">1.0</span>RC3, <span class="number">1.0</span>RC2,</span><br><span class="line">   <span class="number">1.0</span>RC1, <span class="number">0</span>.<span class="number">10.1</span>, <span class="number">0</span>.<span class="number">10.0</span>, <span class="number">0</span>.<span class="number">9.2</span>, <span class="number">0</span>.<span class="number">9.1</span>, <span class="number">0</span>.<span class="number">9.0</span>, <span class="number">0</span>.<span class="number">7.0</span>, <span class="number">0</span>.<span class="number">5.1</span> [master repo]</span><br><span class="line">   - <span class="symbol">Subspecs:</span></span><br><span class="line">     - AFNetworking/Serialization (<span class="number">3.1</span>.<span class="number">0</span>)</span><br><span class="line">     - AFNetworking/Security (<span class="number">3.1</span>.<span class="number">0</span>)</span><br><span class="line">     - AFNetworking/Reachability (<span class="number">3.1</span>.<span class="number">0</span>)</span><br><span class="line">     - AFNetworking/NSURLSession (<span class="number">3.1</span>.<span class="number">0</span>)</span><br><span class="line">     - AFNetworking/UIKit (<span class="number">3.1</span>.<span class="number">0</span>)</span><br></pre></td></tr></table></figure><p>我们需要用到上面的 <code>pod &#39;AFNetworking&#39;, &#39;~&gt; 3.1.0&#39;</code></p><h4 id="3-编辑Podfile"><a href="#3-编辑Podfile" class="headerlink" title="3. 编辑Podfile"></a>3. 编辑Podfile</h4><p>使用vim编辑 <strong>Podfile</strong> 文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vim Podfile</span><br></pre></td></tr></table></figure><p>会出现</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line"><span class="string">"podfile"</span> 0L, 0C</span><br></pre></td></tr></table></figure><p>按下键盘上的英文 <code>I</code> 键，会变成</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">-- INSERT --</span><br></pre></td></tr></table></figure><p>然后就可以编辑了，输入一下文字</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">platform :ios, <span class="string">'8.0'</span> <span class="comment">#当前工程最低支持iOS 8.0</span></span><br><span class="line"></span><br><span class="line">inhibit_all_warnings! <span class="comment">#屏蔽所有的警告</span></span><br><span class="line"></span><br><span class="line">target <span class="string">'NAME'</span> <span class="keyword">do</span>    <span class="comment">#NAME是工程的名字</span></span><br><span class="line"></span><br><span class="line">pod <span class="string">'AFNetworking'</span>, <span class="string">'~&gt; 3.1.0'</span> <span class="comment">#导入AFNetworking 3.1.0的版本</span></span><br><span class="line"></span><br><span class="line">end</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">-- INSERT --</span><br></pre></td></tr></table></figure><p>接下来保存文件，按下键盘的 <code>esc</code> 键，然后按下输入 <code>:wq</code>，按下 <code>enter</code>键就保存退出了</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">platform :ios, <span class="string">'8.0'</span> <span class="comment">#当前工程最低支持iOS 8.0</span></span><br><span class="line"></span><br><span class="line">inhibit_all_warnings! <span class="comment">#屏蔽所有的警告</span></span><br><span class="line"></span><br><span class="line">target <span class="string">'Project'</span> <span class="keyword">do</span>    <span class="comment"># Project是工程的名字</span></span><br><span class="line"></span><br><span class="line">pod <span class="string">'AFNetworking'</span>, <span class="string">'~&gt; 3.1.0'</span> <span class="comment">#导入AFNetworking 3.1.0的版本</span></span><br><span class="line"></span><br><span class="line">end</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">~</span><br><span class="line">:wq</span><br></pre></td></tr></table></figure><h4 id="4-导入第三方库"><a href="#4-导入第三方库" class="headerlink" title="4. 导入第三方库"></a>4. 导入第三方库</h4><p>执行命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pod install</span><br></pre></td></tr></table></figure><p>出现</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[!] Please close any current Xcode sessions <span class="keyword">and</span> use <span class="string">`Project.xcworkspace`</span> <span class="keyword">for</span> this project from now on.</span><br><span class="line">Sending stats</span><br><span class="line">Pod installation complete! There is <span class="number">1</span> dependency from the Podfile <span class="keyword">and</span> <span class="number">1</span> total pod installed.</span><br></pre></td></tr></table></figure><p>即表示执行成功，此时工程目录会多出 <strong>Project.xcworkspace</strong>、<strong>Podfile.lock</strong> 文件和 <strong>Pods</strong>文件夹，上面提醒我们从现在开始，打开 <strong>Project.xcworkspace</strong> 来开发，进入工程后，引入头文件不再是</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">#import &quot;AFNetworking.h&quot;</span><br></pre></td></tr></table></figure><p>而是</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">#import &lt;AFNetworking.h&gt;</span><br></pre></td></tr></table></figure><h3 id="原理和说明"><a href="#原理和说明" class="headerlink" title="原理和说明"></a>原理和说明</h3><hr><ul><li><p>**  第三方库会被编译成.a静态库供我们真正的工程使用：**<br>CocoaPods 会将所有的第三方库以 <strong>target</strong> 的方式组成一个名为 <strong>Pods</strong> 的工程，该工程就放在刚才新生成的 <strong>Pods</strong> 目录下。整个第三方库工程会生成一个名称为 <strong>libPods.a</strong> 的静态库提供给我们自己的工程使用。<br>对于资源文件，CocoaPods 提供了一个名为 <strong>Pods-resources.sh</strong> 的 <strong>bash</strong> 脚本，该脚本在每次项目编译的时候都会执行，将第三方库的各种资源文件复制到目标目录中。</p></li><li><p>** 我们的工程和第三方库所在的工程会由一个新生成的 workspace 管理：**<br>为了方便我们直观的管理工程和第三方库，工程和<strong>Pods</strong>工程会被以 <strong>workspace</strong> 的形式组织和管理。</p></li><li><p>**  原来的工程设置已经被更改了，这时候我们直接打开原来的工程文件去编译就会报错，只能使用新生成的 workspace 来进行项目管理。** </p></li><li><p>**  CocoaPods 通过一个名为 Pods.xcconfig 的文件来在编译时设置所有的依赖和参数** </p></li></ul><h3 id="更多"><a href="#更多" class="headerlink" title="更多"></a>更多</h3><hr><ul><li><h6 id="CocoaPods不完全食用指南-—-制作篇"><a href="#CocoaPods不完全食用指南-—-制作篇" class="headerlink" title="CocoaPods不完全食用指南 — 制作篇"></a><a href="https://blog.nubi.im/archives/32fee8af.html">CocoaPods不完全食用指南 — 制作篇</a></h6></li><li><h6 id="CocoaPods不完全食用指南-—-私有篇"><a href="#CocoaPods不完全食用指南-—-私有篇" class="headerlink" title="CocoaPods不完全食用指南 — 私有篇"></a><a href="https://blog.nubi.im/archives/87342b1d.html">CocoaPods不完全食用指南 — 私有篇</a></h6></li><li><h6 id="CocoaPods不完全食用指南-—-指令集"><a href="#CocoaPods不完全食用指南-—-指令集" class="headerlink" title="CocoaPods不完全食用指南 — 指令集"></a><a href="https://blog.nubi.im/archives/fd41bff3.html">CocoaPods不完全食用指南 — 指令集</a></h6></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;img src=&quot;/archives/b76b30a0/0.png&quot; class=&quot;&quot;&gt;
    
    </summary>
    
    
    
      <category term="CocoaPods" scheme="https://blog.nubi.im/tags/CocoaPods/"/>
    
  </entry>
  
  <entry>
    <title>公司开发者账号申请流程（2017最新版）</title>
    <link href="https://blog.nubi.im/archives/beb65d75.html"/>
    <id>https://blog.nubi.im/archives/beb65d75.html</id>
    <published>2017-08-16T08:51:00.000Z</published>
    <updated>2020-05-13T11:18:42.000Z</updated>
    
    <content type="html"><![CDATA[<img src="/archives/beb65d75/0.png" class=""><a id="more"></a><h3 id="说明"><a href="#说明" class="headerlink" title="说明"></a>说明</h3><p>Apple 开发者账号，除给大学使用的教育账号外，共有个人账号、公司账号、企业账号三种：</p><ul><li>个人账号：个人申请用于开发 Apple App 所使用的账号，仅限于个人使用，可以在 App Store 发布应用，申请比较容易，<strong>￥688.00/年  ($99.00/year)</strong></li><li>公司账号：以公司名义申请的开发者账号，用于公司内部的开发者共用，可以在 App Store 发布应用，申请流程相对麻烦，<strong>￥688.00/年  ($99.00/year)</strong></li><li>企业账号：一般是公司规模在 500 人以上的企业，用于内部测试、分发应用的账号，不能在 App Store 发布应用，申请流程相对麻烦，<strong>￥1988/年 ($299.00/year)</strong></li></ul><h3 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h3><ul><li><strong>已经注册好的Apple ID</strong></li><li><strong>visa/万事达信用卡</strong>(目前visa单币卡不能支付)</li></ul><h3 id="Apple-开发者公司账号申请步骤："><a href="#Apple-开发者公司账号申请步骤：" class="headerlink" title="Apple 开发者公司账号申请步骤："></a>Apple 开发者公司账号申请步骤：</h3><h5 id="1-打开-Apple-开发者账号申请链接地址："><a href="#1-打开-Apple-开发者账号申请链接地址：" class="headerlink" title="1. 打开 Apple 开发者账号申请链接地址："></a>1. 打开 Apple 开发者账号申请<a href="https://developer.apple.com/programs/" target="_blank" rel="noopener">链接地址</a>：</h5><img src="/archives/beb65d75/1.jpg" class="" title="申请首页"><p>点击<code>Enroll</code>(上图红框中按钮)，进入申请页面：</p><img src="/archives/beb65d75/2.jpg" class="" title="申请页面"><h5 id="2-上面的页面介绍了开发者账号的种类，以及申请每个种类账号所需做的准备。点击Start-Your-Enrollment，进入下一页面。"><a href="#2-上面的页面介绍了开发者账号的种类，以及申请每个种类账号所需做的准备。点击Start-Your-Enrollment，进入下一页面。" class="headerlink" title="2. 上面的页面介绍了开发者账号的种类，以及申请每个种类账号所需做的准备。点击Start Your Enrollment，进入下一页面。"></a>2. 上面的页面介绍了开发者账号的种类，以及申请每个种类账号所需做的准备。点击<code>Start Your Enrollment</code>，进入下一页面。</h5><h5 id="3-如果您此时没有登录，会跳转到登录页面先登录您的-Apple-ID，之后进入下面的页面："><a href="#3-如果您此时没有登录，会跳转到登录页面先登录您的-Apple-ID，之后进入下面的页面：" class="headerlink" title="3. 如果您此时没有登录，会跳转到登录页面先登录您的 Apple ID，之后进入下面的页面："></a>3. 如果您此时没有登录，会跳转到登录页面先登录您的 Apple ID，之后进入下面的页面：</h5>   <img src="/archives/beb65d75/3.jpg" class="" title="类型选择页面"><p>   点击红框内的选项框，可看到如下选项：<br>   <img src="/archives/beb65d75/4.jpg" class="" title="类型选择框"><br>   选择红框内的<code>Company / Organization</code>，您将看到如下提示：<br>   <img src="/archives/beb65d75/5.jpg" class="" title="类型选择提示"></p><h5 id="4-这些提示描述了加入公司开发者计划所需要具备的条件，特别注意的是，您的公司必须拥有一个邓白氏码-D-U-N-S-Number-。如果您的公司拥有一个，在后面的步骤中，直接填写即可。如您不清楚，可以点击上图红框中的Check-now-gt-，浏览器会为您新建一个窗口／标签，跳转到如下页面："><a href="#4-这些提示描述了加入公司开发者计划所需要具备的条件，特别注意的是，您的公司必须拥有一个邓白氏码-D-U-N-S-Number-。如果您的公司拥有一个，在后面的步骤中，直接填写即可。如您不清楚，可以点击上图红框中的Check-now-gt-，浏览器会为您新建一个窗口／标签，跳转到如下页面：" class="headerlink" title="4. 这些提示描述了加入公司开发者计划所需要具备的条件，特别注意的是，您的公司必须拥有一个邓白氏码(D-U-N-S? Number)。如果您的公司拥有一个，在后面的步骤中，直接填写即可。如您不清楚，可以点击上图红框中的Check now &gt;，浏览器会为您新建一个窗口／标签，跳转到如下页面："></a>4. 这些提示描述了加入公司开发者计划所需要具备的条件，特别注意的是，您的公司必须拥有一个邓白氏码(D-U-N-S? Number)。如果您的公司拥有一个，在后面的步骤中，直接填写即可。如您不清楚，可以点击上图红框中的<code>Check now &gt;</code>，浏览器会为您新建一个窗口／标签，跳转到如下页面：</h5>  <img src="/archives/beb65d75/6.jpg" class="" title="检查邓白氏码"><p>  请按照下面的提示填写相关信息：<br>  <img src="/archives/beb65d75/7.jpg" class="" title="邓白氏信息填写"></p>  <blockquote><ol><li>点击，选择 China</li><li>填写公司名称，使用罗马字符，英语，如：Apple Inc.</li><li>填写公司所在街道，使用罗马字符，英语，要与营业执照内容一致</li><li>填写公司所在城市，使用罗马字符，英语，要与营业执照内容一致</li><li>点击，选择公司所在省份</li><li>填写邮政编码</li><li>点击，选择 86</li><li>填写联系电话，手机、座机均可，座机要有区号</li><li>填写名字，使用罗马字符</li><li>填写姓氏，使用罗马字符</li><li>点击，选择 86</li><li>填写工作电话，手机、座机均可，座机要有区号</li><li>如果有分机号，填写在这里</li><li>填写工作 Email 地址，如果您的公司已经拥有邓白氏码，将发送的这个邮箱里</li><li>输入上图的验证码</li><li>如果 15 中的验证码看不清，可点击这里更换</li><li>所有信息填写完成后，这个按钮将变为蓝底白字，点击进入下一页面</li></ol></blockquote><h5 id="5-完成上面的步骤后，如果您的公司已经拥有邓白氏码，将在一步确认之后，发送到您填写的工作邮箱中；如果没有，可以将这个信息提交到邓白氏公司，经审核后会得到邓白氏码。"><a href="#5-完成上面的步骤后，如果您的公司已经拥有邓白氏码，将在一步确认之后，发送到您填写的工作邮箱中；如果没有，可以将这个信息提交到邓白氏公司，经审核后会得到邓白氏码。" class="headerlink" title="5. 完成上面的步骤后，如果您的公司已经拥有邓白氏码，将在一步确认之后，发送到您填写的工作邮箱中；如果没有，可以将这个信息提交到邓白氏公司，经审核后会得到邓白氏码。"></a>5. 完成上面的步骤后，如果您的公司已经拥有邓白氏码，将在一步确认之后，发送到您填写的工作邮箱中；如果没有，可以将这个信息提交到邓白氏公司，经审核后会得到邓白氏码。</h5><ul><li>大概2、3天时间，上海邓白氏分公司会给您打电话，核实您提供的公司信息，他们的工作人员会告知您已经接受了您的申请，请耐心等待14天左右，会把邓白氏码发到您预留的邮箱里。</li></ul><h5 id="6-回到这个页面："><a href="#6-回到这个页面：" class="headerlink" title="6. 回到这个页面："></a>6. 回到这个页面：</h5>  <img src="/archives/beb65d75/8.jpg" class="" title="类型选择提示"><p>  点击<code>Continue</code>，进入下一页，填写相关信息。</p><h5 id="7-由于信息较多，将页面分别截图，并提示填写。"><a href="#7-由于信息较多，将页面分别截图，并提示填写。" class="headerlink" title="7. 由于信息较多，将页面分别截图，并提示填写。"></a>7. 由于信息较多，将页面分别截图，并提示填写。</h5>   <img src="/archives/beb65d75/9.jpg" class="" title="个人信息填写">   <img src="/archives/beb65d75/10.jpg" class="" title="组织信息填写"><h5 id="8-以上信息填写完成后，点击红框内的Continue-进入下一页面"><a href="#8-以上信息填写完成后，点击红框内的Continue-进入下一页面" class="headerlink" title="8. 以上信息填写完成后，点击红框内的Continue,进入下一页面"></a>8. 以上信息填写完成后，点击红框内的<code>Continue</code>,进入下一页面</h5>   <img src="/archives/beb65d75/11.jpg" class="" title="信息确认"><p>   这个页面为最后的信息确认页面，如信息无误，按照图中提示操作，并点击红框内的<code>Submit</code>提交</p><h5 id="9-完成以后，等待苹果公司的确认电话，电话中会核实相关信息，确认完成后，即可填写信用卡信息，缴费，完成申请。"><a href="#9-完成以后，等待苹果公司的确认电话，电话中会核实相关信息，确认完成后，即可填写信用卡信息，缴费，完成申请。" class="headerlink" title="9. 完成以后，等待苹果公司的确认电话，电话中会核实相关信息，确认完成后，即可填写信用卡信息，缴费，完成申请。"></a>9. 完成以后，等待苹果公司的确认电话，电话中会核实相关信息，确认完成后，即可填写信用卡信息，缴费，完成申请。</h5><h5 id="10-申请期间有任何疑问，可以拨打苹果开发者中心的电话-400-670-1855-咨询。"><a href="#10-申请期间有任何疑问，可以拨打苹果开发者中心的电话-400-670-1855-咨询。" class="headerlink" title="10. 申请期间有任何疑问，可以拨打苹果开发者中心的电话 400-670-1855 咨询。"></a>10. 申请期间有任何疑问，可以拨打苹果开发者中心的电话 400-670-1855 咨询。</h5><p><strong>注：</strong>所有过程中，只有在接到苹果公司电话后缴纳开发者计划的首年年费 <strong>￥688.00</strong> ，其他步骤均不收费。</p>]]></content>
    
    <summary type="html">
    
      &lt;img src=&quot;/archives/beb65d75/0.png&quot; class=&quot;&quot;&gt;
    
    </summary>
    
    
    
      <category term="Apple ID" scheme="https://blog.nubi.im/tags/Apple-ID/"/>
    
  </entry>
  
</feed>
