<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Ruby China 社区 iOS 节点</title>
    <link>https://ruby-china.org/</link>
    <description>Ruby China 社区 iOS 节点最新发帖。</description>
    <item>
      <title>Gear 浏览器对于「油猴」脚本的技术实现原理</title>
      <description>&lt;p&gt;&lt;img src="https://user-images.githubusercontent.com/1467904/89486421-9d94c500-d7d5-11ea-8f4a-1d79e206c371.png" title="" alt="Gear"&gt;
自从 5 月发布了里程碑 2.0 版本后，直到差不多三个月的现在已经发布了大大小小共 14 个版本。进行了大量的改进和修复，同时也有不少新的功能。由于 Gear 的几大核心功能一直都没有详细介绍，在此公开一些内部实现的原理，以方便大家了解。&lt;/p&gt;
&lt;h3 id="油猴脚本"&gt;油猴脚本&lt;/h3&gt;
&lt;p&gt;直到目前为止，Gear 依然是 iOS 首个支持油猴脚本的浏览器。有部分人认为一些浏览器支持执行 JavaScript 脚本代码就是所谓支持插件。事实上支持油猴脚本和支持 JavaScript 脚本其实是两回事。&lt;/p&gt;

&lt;p&gt;在 iOS 上实现在页面加载前注入 JavaScript 脚本其实就是两行代码的问题。只需要调用：&lt;/p&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;userScript&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;WKUserScript&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;injectionTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;WKUserScriptInjectionTime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;forMainFrameOnly&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;webView&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;configuration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;userContentController&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addUserScript&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;userScript&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;文档：&lt;a href="https://developer.apple.com/documentation/webkit/wkuserscript/1537750-init" rel="nofollow" target="_blank" title=""&gt;Apple Developer Documentation - WKUserScript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;核心就是第一行代码，第一个参数就是要注入的 JavaScript 代码，第二个是注入的时间，可选 atDocumentStart 或 atDocumentEnd，第三个是是否只针对主 frame 执行。&lt;/p&gt;

&lt;p&gt;就这，其实只需要几分钟的时间就能让 Web 浏览器实现执行 JavaScript 脚本（插件）的能力了。&lt;/p&gt;

&lt;p&gt;但是，支持油猴脚本却是更加复杂的问题了。绝大部分油猴脚本都是无法通过此方式直接执行的。&lt;/p&gt;

&lt;p&gt;首先，油猴脚本的头部注释配置定义了该脚本的执行环境、引入外部文件（如各种框架、数据、图片等）、权限授予、接口授予、以及各种相关信息。必须对此信息进行解析和保存，并在执行的时候配置好对应的代码执行环境。&lt;/p&gt;

&lt;p&gt;还要给每个脚本配备独立的数据存储方式，不能和页面的共享。同时还要解决资源跨域访问等问题。&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ==UserScript==&lt;/span&gt;
&lt;span class="c1"&gt;// @name         New Userscript&lt;/span&gt;
&lt;span class="c1"&gt;// @namespace    http://tampermonkey.net/&lt;/span&gt;
&lt;span class="c1"&gt;// @version      0.1&lt;/span&gt;
&lt;span class="c1"&gt;// @description  try to take over the world!&lt;/span&gt;
&lt;span class="c1"&gt;// @author       You&lt;/span&gt;
&lt;span class="c1"&gt;// @match        http://example.com&lt;/span&gt;
&lt;span class="c1"&gt;// @require      https://cdn.staticfile.org/jquery/3.3.1/jquery.js&lt;/span&gt;
&lt;span class="c1"&gt;// @resource     count  https://greasyfork.org/scripts/by-site.json&lt;/span&gt;
&lt;span class="c1"&gt;// @connect      translate.google.com&lt;/span&gt;
&lt;span class="c1"&gt;// @run-at       document-idle&lt;/span&gt;
&lt;span class="c1"&gt;// @grant        unsafeWindow&lt;/span&gt;
&lt;span class="c1"&gt;// @grant        GM_addStyle&lt;/span&gt;
&lt;span class="c1"&gt;// @grant        GM_getValue&lt;/span&gt;
&lt;span class="c1"&gt;// @grant        GM_setValue&lt;/span&gt;
&lt;span class="c1"&gt;// ==/UserScript==&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use strict&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Your code here...&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello World&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;})();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上是一个简单的油猴脚本代码。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;其次，事实上目前桌面浏览器主要是这三大扩展支持执行用户脚本。而「油猴」只是其中一个的名字。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/greasemonkey/greasemonkey" rel="nofollow" target="_blank" title=""&gt;GitHub - greasemonkey/greasemonkey: Greasemonkey is a user script manager for Firefox.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/violentmonkey/violentmonkey" rel="nofollow" target="_blank" title=""&gt;GitHub - violentmonkey/violentmonkey: Violentmonkey provides userscripts support for browsers.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Tampermonkey/tampermonkey" rel="nofollow" target="_blank" title=""&gt;GitHub - Tampermonkey/tampermonkey: Tampermonkey is the most popular userscript manager.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Greasemonkey 主要对应 Firefox，而 Tampermonkey（目前最新已经不公开源代码，非开源）主要对应 Chrome 或基于 Chromium 的浏览器。它们内部都有不少地方调用了浏览器的内部接口来实现一些特殊功能。所以 Tampermonkey 也比较好移植到 Android 上。&lt;/p&gt;

&lt;p&gt;有兴趣的，可以阅读其源代码，看看是如何实现的。&lt;/p&gt;

&lt;p&gt;而在 iOS 上，是无法直接使用以上任何一个项目的代码来实现油猴脚本的支持。在思考了各种方案后，最终 Gear 则是选择了完全重新写一个脚本引擎来进行支持。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://user-images.githubusercontent.com/1467904/89486503-cfa62700-d7d5-11ea-9107-26b86bdbfa95.png" title="" alt="Gear"&gt;&lt;/p&gt;

&lt;p&gt;目前 Gear 选择的是通过 messageHandlers 来实现页面 JavaScript 与 Swift 原生代码进行数据的处理和通讯。例如跨域请求、数据存储等。并使用了缓存的方案，来加速脚本的加载和执行。原理上执行的效率会比单纯的移植高。而且还为此设计了一套 UI 交互来实现脚本的管理与安装等。于是你现在在 Gear 上可以在安装 Bilibili Evolved 这类的脚本来看 B 站，并使用各种特殊功能了……&lt;/p&gt;

&lt;p&gt;&lt;img src="https://user-images.githubusercontent.com/1467904/89486730-4b07d880-d7d6-11ea-9c26-8609eadb9e1a.png" title="" alt="Gear Bilibili"&gt;&lt;/p&gt;

&lt;p&gt;当然，由于 Gear 的脚本引擎是完全自己开发的，并且还要同时兼顾 Greasemonkey 和 Tampermonkey 脚本的情况，所以目前还有一些接口还没有完全支持。&lt;/p&gt;

&lt;p&gt;而且各个脚本代码的质量不一，各种奇怪的代码写法、各种代码重写、错误的引用、动不动就加载十几 MB 框架文件的情况等等，只能逐行代码来调试脚本。&lt;/p&gt;

&lt;p&gt;目前 Gear 依然会不断对引擎进行升级来增强其兼容性。现在依然保持每隔一到两周进行一次更新，每次都会带来新的功能和实质性的改进。&lt;/p&gt;

&lt;p&gt;如果在使用脚本过程中发现有问题，也可以直接反馈到 contact@gear4.app。我这边会逐个进行测试和修复，尽量让其能在 Gear 运作正常。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;Gear 官网：&lt;a href="https://gear4.app" rel="nofollow" target="_blank"&gt;https://gear4.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;App Store: &lt;a href="https://apps.apple.com/cn/app/gear-browser/id1458962238?ls=1" rel="nofollow" target="_blank"&gt;https://apps.apple.com/cn/app/gear-browser/id1458962238?ls=1&lt;/a&gt;&lt;/p&gt;</description>
      <author>Catfan</author>
      <pubDate>Thu, 06 Aug 2020 16:57:30 +0800</pubDate>
      <link>https://ruby-china.org/topics/40244</link>
      <guid>https://ruby-china.org/topics/40244</guid>
    </item>
    <item>
      <title>给 cocoapods 的 spec 类如何扩展方法</title>
      <description>&lt;p&gt;cocoapods 的 spec 类扩展方法，我写在 cocoapods 源码里面可以，但是写在 podfile 里面不行，提示扩展的方法找不到，代码如下，请教各位大神，错误出在哪里？&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Spec 
      def spec_test
         puts "测试"
      end  
 end
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>lxs091021119</author>
      <pubDate>Sat, 20 Oct 2018 20:48:49 +0800</pubDate>
      <link>https://ruby-china.org/topics/37655</link>
      <guid>https://ruby-china.org/topics/37655</guid>
    </item>
    <item>
      <title>Ruby China iOS 12 原生应用</title>
      <description>&lt;h2 id="下载"&gt;下载&lt;/h2&gt;
&lt;p&gt;在 App Store 中搜索「Ruby」，或者打开链接 &lt;a href="https://itunes.apple.com/cn/app/id999870130?ls=1&amp;amp;mt=8" rel="nofollow" target="_blank"&gt;https://itunes.apple.com/cn/app/id999870130?ls=1&amp;amp;mt=8&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="介绍"&gt;介绍&lt;/h2&gt;
&lt;p&gt;首个版本写于 2015 年 Swift 发布不久，此后移动端技术又有了日新月异的发展，于是最近从零开始重写了整个应用，以反映当前的最佳实践。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;使用 Swift 4 重写了所有代码，更换了第三方库。&lt;/li&gt;
&lt;li&gt;根据「iOS 12 人机界面规范」重新设计了用户界面。&lt;/li&gt;
&lt;li&gt;支持所有系统特性，新增了支持 iPhone XS、iPad 分屏、Face ID、动态字体等。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="开源"&gt;开源&lt;/h2&gt;
&lt;p&gt;开源在 &lt;a href="https://github.com/swordray/ruby-china-ios" rel="nofollow" target="_blank"&gt;https://github.com/swordray/ruby-china-ios&lt;/a&gt;，欢迎 star 和 PR。另外其中有关 hybrid 开发的代码被抽取到一个单独的库 &lt;a href="https://github.com/swordray/JXWebViewController" rel="nofollow" target="_blank" title=""&gt;JXWebViewController&lt;/a&gt;。&lt;/p&gt;</description>
      <author>swordray</author>
      <pubDate>Sun, 30 Sep 2018 22:01:49 +0800</pubDate>
      <link>https://ruby-china.org/topics/37580</link>
      <guid>https://ruby-china.org/topics/37580</guid>
    </item>
    <item>
      <title>现在还推荐使用 Turbolinks + Native 来做 iOS app 吗</title>
      <description>&lt;p&gt;主要团队人比较少，目前没专职的 iOS 工程师。&lt;/p&gt;

&lt;p&gt;ruby-china 的 iOS 版也是一波三折，最新版正是 turbolinks+native，不知道现在还推荐这个吗。&lt;/p&gt;</description>
      <author>tim_lang</author>
      <pubDate>Wed, 12 Sep 2018 10:01:46 +0800</pubDate>
      <link>https://ruby-china.org/topics/37474</link>
      <guid>https://ruby-china.org/topics/37474</guid>
    </item>
    <item>
      <title>iOS 进程问题</title>
      <description>&lt;h4 id="写了一个协议方法"&gt;写了一个协议方法&lt;/h4&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public func onEvent(event:MidiEvent, ms:Int64) 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并做了判断 &lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if event is NoteOn {

  myLabel.backgroundColor=UIColor.yellow

}
else if let e = event as? NoteOff {

            myLabel.backgroundColor=UIColor.blue

}
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="现在我播放MIDI音乐时,不断进入这两个判断,但是为什么Label的颜色不会一直变,而是播完后只显示最后一次的颜色蓝色?"&gt;现在我播放 MIDI 音乐时，不断进入这两个判断，但是为什么 Label 的颜色不会一直变，而是播完后只显示最后一次的颜色蓝色？&lt;/h4&gt;</description>
      <author>yangyangnote</author>
      <pubDate>Mon, 12 Mar 2018 17:18:22 +0800</pubDate>
      <link>https://ruby-china.org/topics/35217</link>
      <guid>https://ruby-china.org/topics/35217</guid>
    </item>
    <item>
      <title>苹果开发的一个八卦，大家怎么看</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/137d90e02e4796f2a9b4d6bc0407dd39.jpg!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>gakki</author>
      <pubDate>Wed, 08 Mar 2017 13:30:52 +0800</pubDate>
      <link>https://ruby-china.org/topics/32480</link>
      <guid>https://ruby-china.org/topics/32480</guid>
    </item>
    <item>
      <title>TesterHome iOS 客户端上架历程</title>
      <description>&lt;p&gt;最近几天和 TesterHome 的小伙伴一起完成了 TesterHome iOS 客户端的上架。TesterHome 的网站是在 Ruby China 的基础上进行修改的，此次客户端也是从 Ruby China iOS 客户端基础上修改。因此此记录也适用于 Ruby China 的同学，乃至以后其他使用 homeland 的同学。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;在此特别对 Ruby China 社区一直以来对 TesterHome 社区的支持表示感谢！&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="原材料"&gt;原材料&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;iOS 收费开发者证书&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ruby-china/ruby-china-ios" rel="nofollow" target="_blank" title=""&gt;ruby-china-ios 客户端源码&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="第一步，修改 ruby-china-ios 客户端源码中的配置"&gt;第一步，修改 ruby-china-ios 客户端源码中的配置&lt;/h2&gt;
&lt;p&gt;ruby-china-ios 默认配置是对应 ruby-china 的，需要先改为 testerhome 的配置才能获取到 testerhome 的相关信息。&lt;/p&gt;

&lt;p&gt;修改方法：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;创建 testerhome 第三方应用授权&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;点击右上角用户头像-&amp;gt;【个人资料设置】，选择右侧的【管理我的应用】&lt;/p&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2016/68b65f90d4c2fa8e3d42926388538d0a.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;点击右上角【注册新应用】，输入应用相关信息（回调地址具体填法后续再确定），点击提交&lt;/p&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2016/6497161cb7cc09fa3aae28b7a629a545.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2016/7ade0187ee75d85bc625b0bf4f102dc9.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;记录下 &lt;strong&gt;应用 ID&lt;/strong&gt; 和 &lt;strong&gt;私钥&lt;/strong&gt; 的值，待会配置客户端要用到。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;打开项目的 &lt;code&gt;Constants.swift&lt;/code&gt; 文件&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2016/74ff2960d2ef6fe3b87a3018a0e6c2bb.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;把 ROOT_URL 改为 &lt;code&gt;https://testerhome.com&lt;/code&gt;，OAUTH_CLIENT_ID 改为上一步获取到的 &lt;strong&gt;应用 ID&lt;/strong&gt;，OAUTH_SECRET 改为上一步获取到的 &lt;strong&gt;私钥&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;其它一些内容带有 ruby-china 的地方也对应改为 testerhome，主题、图标等也根据需要进行调整。具体修改内容可查看 &lt;a href="https://github.com/testerhome/ruby-china-ios/commits/master" rel="nofollow" target="_blank"&gt;https://github.com/testerhome/ruby-china-ios/commits/master&lt;/a&gt; 对应的提交：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2016/adbc64fd11b68813e3151f69bf7eb996.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="第二步、配置推送证书"&gt;第二步、配置推送证书&lt;/h2&gt;
&lt;p&gt;推送证书需要在 iOS 开发者后台中配置，同时也需要在 testerhome 后台配置 &lt;code&gt;apns_pem&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;iOS 开发者后台生成推送证书&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;步骤基本和 &lt;a href="https://cn.avoscloud.com/docs/ios_push_cert.html#%E6%B3%A8%E5%86%8C_App_ID" title=""&gt;iOS 推送证书设置指南&lt;/a&gt; 里面一致。大致步骤：&lt;/p&gt;

&lt;p&gt;1、修改 APP ID，启用推送（特别留意 development 和 distribution 的都要 enable，否则自己本地测试收不到推送）&lt;/p&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2016/77c0b5746f739b11e56606adc0465aa7.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;2、在开发者后台生成 Apple Push Notification service SSL (Sandbox &amp;amp; Production)  证书&lt;/p&gt;

&lt;p&gt;3、下载证书（一个 .cer 文件），双击导入到钥匙串&lt;/p&gt;

&lt;p&gt;4、打开钥匙串，找到这个证书（正常是 Apple Push Service 开头），右键导出成 p12 文件，后续假设文件名为 &lt;code&gt;cert.p12&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;5、使用下面的命令生成一个 pem 文件&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ openssl pkcs12 -in cert.p12 -out website.pem -nodes -clcerts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;6、把 website.pem 的内容（&lt;code&gt;cat website.pem&lt;/code&gt;）配置到后台-&amp;gt;全局配置-&amp;gt; apns_pem 中。&lt;/p&gt;
&lt;h2 id="测试推送"&gt;测试推送&lt;/h2&gt;
&lt;p&gt;在本机架设一个 homeland 网站，按照上面的步骤添加新的应用并配置到 iOS 客户端中：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2016/6ba5502eb4e8510aa8b8139af88920f0.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;正常来说，当前客户端登录的用户收到一个通知（如帖子被回复或者被 @）就会有推送出现。&lt;/p&gt;
&lt;h2 id="第三步、app store 上架"&gt;第三步、app store 上架&lt;/h2&gt;
&lt;p&gt;步骤基本和 &lt;a href="http://www.jianshu.com/p/b1b77d804254" rel="nofollow" target="_blank" title=""&gt;iOS App 上架流程 (2016 详细版）&lt;/a&gt;一致。大致步骤：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;生成 distribution 证书，然后下载、导入 keychain&lt;/li&gt;
&lt;li&gt;生成描述文件，然后下载、导入 keychain&lt;/li&gt;
&lt;li&gt;上 itunes connect，创建 app 并填写相关信息&lt;/li&gt;
&lt;li&gt;xcode 里面去掉所有断点，然后点击菜单栏 Product -&amp;gt; Archive（灰色的话检查下是不是选了模拟器，应该选择真机或者 Generic iOS Device）&lt;/li&gt;
&lt;li&gt;Archive 完成后，选择右侧的 validate 验证包。&lt;/li&gt;
&lt;li&gt;验证没问题，点击 Upload to App Store 即可开始上传。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;上传完应用，应用信息也配置好后，点击 itunes connect 里面的 send for review 就开始进入审核队列了。&lt;/p&gt;
&lt;h2 id="坑"&gt;坑&lt;/h2&gt;
&lt;p&gt;这过程中，因为不熟练，遇到了一个坑，卡了一天：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;测试时无论是 adhoc 包还是调试包都收不到推送&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;原因有两个：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;开发者后台中 development 的推送为 Configurable，相当于没开启，所以一直没收到。&lt;strong&gt;解决方法：手动开启。&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;网上找到的 pem 配置文章生成 pem 的方式都是先生成证书的 pem，然后生成私钥的 pem，最后合并在一起。而 ruby-china 用的是另一种方式。鉴别方式：看 sidekiq 后台的错误里面有没有 &lt;code&gt;OpenSSL::PKey::RSAError: Neither PUB key nor PRIV key: nested asn1 error&lt;/code&gt; 。如果有，那基本上就是 pem 配置不正确导致和苹果推送服务器通讯失败了。&lt;strong&gt;解决方法：用上面正文里的那个命令生成 pem 内容即可。&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>chenhengjie123</author>
      <pubDate>Wed, 07 Dec 2016 21:46:33 +0800</pubDate>
      <link>https://ruby-china.org/topics/31837</link>
      <guid>https://ruby-china.org/topics/31837</guid>
    </item>
    <item>
      <title>利用 Workflow 显示附近的免费 Wi-Fi</title>
      <description>&lt;p&gt;得益于 Workflow 自 1.5.3 版本起更新的 Get Content of URL 动作，该 App 的潜力得到了极大的提升。本文分享一种有趣的用法，搜寻附近的免费 Wi-Fi 并择一显示在系统地图上。&lt;/p&gt;
&lt;h2 id="简介"&gt;简介&lt;/h2&gt;
&lt;p&gt;本 Workflow 主要分三部分，从通知中心运行（下载地址：&lt;a href="https://workflow.is/workflows/1175edbb0578459586b845373a185f9b" rel="nofollow" target="_blank"&gt;https://workflow.is/workflows/1175edbb0578459586b845373a185f9b&lt;/a&gt;）&lt;/p&gt;

&lt;p&gt;获取当前地理位置；&lt;/p&gt;

&lt;p&gt;通过网络资源获取附近的免费 Wi-Fi 资源；&lt;/p&gt;

&lt;p&gt;将所选 Wi-Fi 显示在系统地图上&lt;/p&gt;

&lt;p&gt;大体的步骤很少，所以是非常简单的。下面将逐步介绍。&lt;/p&gt;
&lt;h2 id="1. 获取当前地理位置"&gt;1. 获取当前地理位置&lt;/h2&gt;
&lt;p&gt;这个直接利用 Workflow 自带的 Get Current Location 动作就可以获取，由此获得的地理信息包含经纬度，分别使用 Get Details of Locations 提取即可。经纬度信息将用在步骤 2 中。&lt;/p&gt;
&lt;h2 id="2. 获取附近免费 Wi-Fi 信息"&gt;2. 获取附近免费 Wi-Fi 信息&lt;/h2&gt;
&lt;p&gt;这里就直接使用聚合数据的 全国 Wi-Fi API 了，只需要注册个账号就可以申请 API key，没有使用限制，Wi-Fi API 申请地址：&lt;a href="https://www.juhe.cn/docs/api/id/18" rel="nofollow" target="_blank"&gt;https://www.juhe.cn/docs/api/id/18&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/4bd8799140808666fe1666cb0c7b919a.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;请求方式为 Get/Post，总共有 6 个输入参数：&lt;/p&gt;

&lt;p&gt;lon：经度，使用上一步获取的经度；&lt;/p&gt;

&lt;p&gt;lat：纬度，使用上一步获取的纬度；&lt;/p&gt;

&lt;p&gt;gtype：所传递经纬类型，1：百度 2：谷歌 3：gps，填 gps；&lt;/p&gt;

&lt;p&gt;r：搜索范围，单位 M，填 1000 即可，太远懒得跑；&lt;/p&gt;

&lt;p&gt;key：应用 APPKEY，申请后可以获得，或者直接使用我的；&lt;/p&gt;

&lt;p&gt;dtype：返回数据的格式，不用填。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/7d65d3d9e30377a4ed87d20e94e2fcd9.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;如上填写就可以获取到返回的 json 数据了，参照 API 文档页面的介绍逐层提取数据即可。&lt;/p&gt;

&lt;p&gt;每个 Wi-Fi 的数据形式如下：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
        "name":"瑞尔威饭店",
        "intro":"中F1旅馆门厅；中F2办公区；中F3-F7奇数层走廊；中F4,F6走廊；东F2餐厅，办公；东F3-F7奇数层走廊；东F4,F6走廊；西F3-F7走廊；西F1快餐厅；西B1公共区域",
        "address":"北京市丰台区北京市丰台区莲花池东路116-2号",
        "google_lat":"39.896877",
        "google_lon":"116.325342",
        "baidu_lat":"39.9026269139",
        "baidu_lon":"116.33193121541",
        "province":"北京市",
        "city":"北京市",
        "distance":2959
        },
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="注意"&gt;注意&lt;/h3&gt;
&lt;p&gt;唯一关键的地方是，如果附近有多个 Wi-Fi，则服务器会返回多组数据，这时必须要将它们排成列表供使用者选择。而未经处理的 Dictionary 数据在 Choose from List 动作中的显示统一是「Dictionary」，不利于使用者查看。这里介绍两种解决方式：&lt;/p&gt;
&lt;h3 id="使用 Set Name 动作"&gt;使用 Set Name 动作&lt;/h3&gt;
&lt;p&gt;在使用 Repeat with Each 动作对 Wi-Fi 位置信息进行逐个处理时，首先提取用于显示的信息，如 Wi-Fi 名称、距离，再使用 Set Name 对每个 Dictionary 数据命名：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/1195f1b51d280f09779f7c55c1cc7424.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;这样在接下来的 Choose from List 动作中所有 Dictionary 都将显示自己独特的名字，而不是一个个干巴巴的「Dictionary」。在使用者做出选择后，就可以安排其它的 Get Dictionary Value 动作来进一步获取数据了。&lt;/p&gt;

&lt;p&gt;该方式唯一的缺点就是在只有一个 Dictionary 数据时，由于 Workflow 开发者更新了 Choose from List 动作，此时会显示 Dictionary 中的键与键值，所以需要安排额外的动作对此进行处理。&lt;/p&gt;
&lt;h3 id="使用 Text 动作"&gt;使用 Text 动作&lt;/h3&gt;
&lt;p&gt;该方式在 Repeat with Each 动作结束后，会产生一个文本 List，随后的 Choose from List 动作将列出每个文本的首行。在使用者做出选择后，需要通过 Match Text 动作使用正则表达式对经纬度数据进行匹配，语法如下：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(?&amp;lt;=lat:).*?(?=\n)
(?&amp;lt;=lon:).*$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;优点是避免了 Set Name 方案的问题，缺点是每一次循环都需要将经度纬度提取出来，当数据有成百上千个时会多浪费点时间。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/913080e524d02437da9c6514527ebed9.jpg!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="3. 在系统地图显示 Wi-Fi 位置"&gt;3. 在系统地图显示 Wi-Fi 位置&lt;/h2&gt;
&lt;p&gt;查询苹果地图相关的 文档 后，可以知道该 URL 为：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://maps.apple.com/?ll=纬度,经度&amp;amp;q=名称
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将从步骤二中获取的数据填入并访问即可。&lt;/p&gt;
&lt;h2 id="使用"&gt;使用&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;通知中心访问：&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/330cf532229ca789bede5a0faf06c857.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;苹果地图显示位置：&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/5845be5706d1039207e7802d0e8c0abc.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;只有两步操作，所以还是很快捷的。虽然距离的显示有点问题，但还在我可以接受的范围内。不过聚合数据的 Wi-Fi 数量不算特别多，不知是否会进一步更新数据库。&lt;/p&gt;</description>
      <author>longjian</author>
      <pubDate>Wed, 07 Dec 2016 13:12:23 +0800</pubDate>
      <link>https://ruby-china.org/topics/31824</link>
      <guid>https://ruby-china.org/topics/31824</guid>
    </item>
    <item>
      <title>Pokemon GO - 国内玩家通过 Xcode 改 GPS 玩游戏教程 </title>
      <description>&lt;p&gt;最近 &lt;strong&gt;Pokémon GO&lt;/strong&gt; 火啊！不过目前国内没法玩，GPS 定位出来周围没怪物...&lt;/p&gt;

&lt;p&gt;来技术宅的解决方案！！ &lt;img title=":sunglasses:" alt="😎" src="https://twemoji.ruby-china.com/2/svg/1f60e.svg" class="twemoji"&gt; &lt;img title=":sunglasses:" alt="😎" src="https://twemoji.ruby-china.com/2/svg/1f60e.svg" class="twemoji"&gt; &lt;/p&gt;

&lt;p&gt;前提条件：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;macOS&lt;/li&gt;
&lt;li&gt;Xcode &lt;/li&gt;
&lt;li&gt;iOS 开发者账户&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;将下面的文件保存为 &lt;code&gt;PokemonLocation.gpx&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;gpx&lt;/span&gt; &lt;span class="na"&gt;creator=&lt;/span&gt;&lt;span class="s"&gt;"Xcode"&lt;/span&gt; &lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;"1.1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;wpt&lt;/span&gt; &lt;span class="na"&gt;lat=&lt;/span&gt;&lt;span class="s"&gt;"37.799"&lt;/span&gt; &lt;span class="na"&gt;lon=&lt;/span&gt;&lt;span class="s"&gt;"-122.4715"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;PokemonLocation&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/wpt&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/gpx&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Xcode 创建一个空白的 iOS 项目，把这个文件加进去，引用的方式而不是 Copy，编译运行到你的手机。&lt;/p&gt;

&lt;p&gt;这个时候 iPhone 上面空白项目启动起来了，Home 最小化，启动 &lt;strong&gt;Pokémon GO&lt;/strong&gt;，等待进入到游戏界面。&lt;/p&gt;

&lt;p&gt;回到 Xcode，打开 &lt;code&gt;PokemonLocation.gpx&lt;/code&gt; 进入 XML 的编辑界面。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/3f97834102a1f760ab710c2ba75a70fd.png!large" width="320px" alt=""&gt;&lt;/p&gt;

&lt;p&gt;状态栏下面那个定位图标，点击选择 &lt;code&gt;PokemonLocation&lt;/code&gt;，游戏里面就动了（原理是 Xcode 让 iOS 设备篡改了 GPS 坐标）&lt;/p&gt;

&lt;p&gt;接下来你要不断的修改 lat, lng 的值（建议修改幅度是小数点最后两位 10 以内），然后保存，选择菜单里面的 &lt;code&gt;PokemonLocation&lt;/code&gt; 来实现移动。&lt;/p&gt;
&lt;h3 id="然后，你可以下载我的自动化工具"&gt;然后，你可以下载我的自动化工具&lt;/h3&gt;
&lt;p&gt;有浏览器界面可以实现移动，自动点击更新 GPS 到设备，操作更简单！&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/89a7d3ca30a12ecd421b36986d7a7aa1.png!large" width="450px" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/huacnlee/PokemonGoMove" rel="nofollow" target="_blank"&gt;https://github.com/huacnlee/PokemonGoMove&lt;/a&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/c5772e7408a60109ea22cafb969aa86b.jpg!large" width="320px" alt=""&gt; &lt;img src="https://l.ruby-china.com/photo/2016/b1bbd21deb32c99f6e54e33f4b8cec26.jpg!large" width="320px" alt=""&gt; &lt;img src="https://l.ruby-china.com/photo/2016/85aa2df3ded3d77143308f05a0809939.jpg!large" width="320px" alt=""&gt;&lt;/p&gt;</description>
      <author>huacnlee</author>
      <pubDate>Tue, 12 Jul 2016 21:06:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/30510</link>
      <guid>https://ruby-china.org/topics/30510</guid>
    </item>
    <item>
      <title>Ruby China iOS App 开始支持 3D Touch 了</title>
      <description>&lt;p&gt;直接上图上代码，另祝大家新春快乐~～&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/swordray/ruby-china-ios/commit/7c178729464bec24420d1f94634a7e4ebb571f0b" rel="nofollow" target="_blank"&gt;https://github.com/swordray/ruby-china-ios/commit/7c178729464bec24420d1f94634a7e4ebb571f0b&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/5756e7de1e368f7f539c8ade03bc0341.png" title="" alt=""&gt; &lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/76acc5c55649ce33487e040c73b717b1.png" title="" alt=""&gt; &lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/bc55ffbebfade71d43aa59468c956733.png" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>swordray</author>
      <pubDate>Sun, 07 Feb 2016 13:47:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/28964</link>
      <guid>https://ruby-china.org/topics/28964</guid>
    </item>
    <item>
      <title>给女朋友的 iOS 开发教程 iOS With Girlfriend</title>
      <description>&lt;p&gt;因为女朋友准备学习 iOS 开发，所以我开始录制一系列的 iOS 开发教程的视频，这个系列的名字就叫 iOS With Girlfriend 吧&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/76bf341a2d7895dd5f9f88890d20348e.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/21a3a5bf86eb7f78b997a3902c17a5d1.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/b65bb93d84cebc7b69168a11c213c6da.png" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="第零期：Intro"&gt;第零期：Intro&lt;/h2&gt;
&lt;p&gt;B 站&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//player.bilibili.com/player.html?aid=2953140" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;/
Youtube&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//www.youtube.com/embed/LEQpV9znZsk" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="第一期：Design"&gt;第一期：Design&lt;/h2&gt;
&lt;p&gt;B 站&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//player.bilibili.com/player.html?aid=2962044" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;/
Youtube&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//www.youtube.com/embed/Jfl0ICjnfwc" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="第二期：Design An App"&gt;第二期：Design An App&lt;/h2&gt;
&lt;p&gt;B 站&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//player.bilibili.com/player.html?aid=2999240" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;/
Youtube&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//www.youtube.com/embed/6sVNdc8naIk" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <author>kevinzhow</author>
      <pubDate>Sat, 03 Oct 2015 23:30:28 +0800</pubDate>
      <link>https://ruby-china.org/topics/27549</link>
      <guid>https://ruby-china.org/topics/27549</guid>
    </item>
    <item>
      <title>想学 iOS 开发，已经看了大部分 “斯坦福大学公开课” 了，接下来怎么自学好呢？</title>
      <description>&lt;p&gt;已经看了大部分“斯坦福大学公开课”了，但是感觉他的例子还是复杂了一些，虽然是跟着做了一部分，但是越往后越多不懂。而且视频对着代码非常的麻烦，想看看有没有推荐更合适的 swift 和 iOS 教程呢，最好有个简单例子，可以让我循序渐进，Swift 现在已经知道怎么回事了，就是 iOS 的开发不懂的还是太多了。&lt;/p&gt;</description>
      <author>QueXuQ</author>
      <pubDate>Wed, 26 Aug 2015 19:17:18 +0800</pubDate>
      <link>https://ruby-china.org/topics/27093</link>
      <guid>https://ruby-china.org/topics/27093</guid>
    </item>
    <item>
      <title>Ruby China iOS App 发布！</title>
      <description>&lt;p&gt;开源在 GitHub：&lt;a href="https://github.com/swordray/ruby-china-ios" rel="nofollow" target="_blank"&gt;https://github.com/swordray/ruby-china-ios&lt;/a&gt;
App Store:&lt;a href="https://appsto.re/cn/Y6mM7.i" rel="nofollow" target="_blank"&gt;https://appsto.re/cn/Y6mM7.i&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;为什么从零开发这个 App 呢&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;感谢 &lt;a href="/huacnlee" class="user-mention" title="@huacnlee"&gt;&lt;i&gt;@&lt;/i&gt;huacnlee&lt;/a&gt; 提供的全新 API v3&lt;/li&gt;
&lt;li&gt;告别 Objective-C，使用 Swift 1.2 开发（即将支持 2.0）&lt;/li&gt;
&lt;li&gt;受益于 iOS 8 的新 API，可以方便的支持 iPhone / iPad 的各个方向，包括自动切换 6 Plus 横屏模式&lt;/li&gt;
&lt;li&gt;遵守 Apple iOS 人机交互指南的设计理念&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/4b74084a8787275f75f5c6985b2120c7.png" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>swordray</author>
      <pubDate>Tue, 30 Jun 2015 17:42:05 +0800</pubDate>
      <link>https://ruby-china.org/topics/26257</link>
      <guid>https://ruby-china.org/topics/26257</guid>
    </item>
    <item>
      <title>RubyMotion 的 一个深坑</title>
      <description>&lt;p&gt;项目中刚好用到 objective-c 的一个开源项目 Masonry
示例代码如下&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.edges.equalTo(superview).with.insets(padding);
}];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用 RubyMotion 和 motion-cocoapods 安装&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Motion&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Project&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;App&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setup&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pods&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;pod&lt;/span&gt; &lt;span class="s1"&gt;'Masonry'&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;调用&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mas_makeConstraints&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="c1"&gt;# Line 24&lt;/span&gt;
      &lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;center&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equalTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;superview&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一切看上去都很美好，直到现实给了我一耳光&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*** Terminating app due to uncaught exception 'ArgumentError', reason: 'guess_view_controller.rb:24:in `block in viewDidLoad': wrong number of arguments (1 for 0) (ArgumentError)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那就检查下到底哪里出了问题&lt;/p&gt;

&lt;p&gt;&lt;code&gt;p make.center.method('equalTo').arity # return 0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;妹啊，为啥跟文档说的不一样的。。。
看完源码才知道。。。
 &lt;code&gt;equalTo&lt;/code&gt;返回的是个 block，而 objective-c 的 block 就是 TM 的直接调用的。。。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- (MASConstraint * (^)(id))equalTo {
    return ^id(id attribute) {
        return self.equalToWithRelation(attribute, NSLayoutRelationEqual);
    };
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;好吧，改过来就好了&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mas_makeConstraints&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="c1"&gt;# Line 24&lt;/span&gt;
      &lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;center&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equalTo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;superview&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;本来这只是个小事情，可是难道以后 Objective-C 的库，类似的情况我都要去翻下源码才能确定是不是这个问题嘛。。。
累觉。。还是爱&lt;/p&gt;</description>
      <author>serco</author>
      <pubDate>Thu, 21 May 2015 13:52:22 +0800</pubDate>
      <link>https://ruby-china.org/topics/25683</link>
      <guid>https://ruby-china.org/topics/25683</guid>
    </item>
    <item>
      <title>这里有没有 iOS 开发的程序员，进来讨论一个问题吧。</title>
      <description>&lt;p&gt;ios 跟服务器结合登录问题，有没有一个比较好的，比较完整的解决方案。求推荐。讲讲思路也行。业务场景需要设备的 idfa，和 uuid 信息进行识别。目前这种登录之后拿一个 token 回来的方式，我感觉不是很好。。。我想问下，大家都是在用什么方式做登录的事情。&lt;/p&gt;</description>
      <author>hanluner</author>
      <pubDate>Thu, 23 Apr 2015 22:23:51 +0800</pubDate>
      <link>https://ruby-china.org/topics/25278</link>
      <guid>https://ruby-china.org/topics/25278</guid>
    </item>
    <item>
      <title>用 ReactNative 写了个 RubyChina 客户端，写得内牛满面</title>
      <description>&lt;p&gt;内牛满面的是 准备开始写的时候发现 &lt;a href="https://github.com/ruby-china/ruby-china/commit/f3ae8e67e6cb9feae7a98698cd619b919873404a" rel="nofollow" target="_blank" title=""&gt;RubyChina API 禁掉了&lt;/a&gt;...
于是转到&lt;a href="https://www.kimonolabs.com" rel="nofollow" target="_blank" title=""&gt;kimono&lt;/a&gt;生成 API，折腾数据转换等等
勉强可以用，继续开发&lt;/p&gt;

&lt;p&gt;昨晚正快要昨晚第一版时，又一次内牛满面，&lt;a href="https://ruby-china.org/topics/25006" title=""&gt;突然发现 RubyChina 改版了&lt;/a&gt;，于是乎之前生成的 API 好几个不能用了
继续折腾半天现在勉强可以用了 = =！&lt;/p&gt;

&lt;p&gt;kimino 请求速度很慢，实时性也较差，等 rubychina 哪天再开放 API 了再切换过来吧～&lt;/p&gt;

&lt;p&gt;&lt;a href="/huacnlee" class="user-mention" title="@huacnlee"&gt;&lt;i&gt;@&lt;/i&gt;huacnlee&lt;/a&gt;  什么时候再开放 API？&lt;/p&gt;
&lt;h3 id="基本功能"&gt;基本功能&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;精选主题&lt;/li&gt;
&lt;li&gt;分类节点&lt;/li&gt;
&lt;li&gt;节点主题&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="部分截图"&gt;部分截图&lt;/h3&gt;&lt;h5 id="首页"&gt;首页&lt;/h5&gt;
&lt;p&gt;&lt;img src="http://henter.qiniudn.com/ios/home.png" title="" alt="home"&gt;&lt;/p&gt;
&lt;h5 id="分类节点"&gt;分类节点&lt;/h5&gt;
&lt;p&gt;&lt;img src="http://henter.qiniudn.com/ios/nodes.png" title="" alt="nodes"&gt;&lt;/p&gt;
&lt;h5 id="主题详细页"&gt;主题详细页&lt;/h5&gt;
&lt;p&gt;&lt;img src="http://henter.qiniudn.com/ios/topic.png" title="" alt="topic"&gt;&lt;/p&gt;
&lt;h4 id="关于"&gt;关于&lt;/h4&gt;
&lt;p&gt;&lt;img src="http://henter.qiniudn.com/ios/about.png" title="" alt="about"&gt;&lt;/p&gt;
&lt;h3 id="TODO"&gt;TODO&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;缓存&lt;/li&gt;
&lt;li&gt;用户页&lt;/li&gt;
&lt;li&gt;下拉刷新&lt;/li&gt;
&lt;li&gt;用户登录（等开放 API）&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;代码在： &lt;a href="http://github.com/henter/ReactNativeRubyChina" rel="nofollow" target="_blank"&gt;http://github.com/henter/ReactNativeRubyChina&lt;/a&gt;&lt;/p&gt;</description>
      <author>henter</author>
      <pubDate>Mon, 06 Apr 2015 10:00:14 +0800</pubDate>
      <link>https://ruby-china.org/topics/25017</link>
      <guid>https://ruby-china.org/topics/25017</guid>
    </item>
    <item>
      <title>git 协作开发 iOS  .pbxproj 总是冲突，大家是怎么做的？</title>
      <description>&lt;p&gt;希望有经验的可以分享一下&lt;/p&gt;</description>
      <author>fresh_fish</author>
      <pubDate>Tue, 13 Jan 2015 11:42:30 +0800</pubDate>
      <link>https://ruby-china.org/topics/23700</link>
      <guid>https://ruby-china.org/topics/23700</guid>
    </item>
    <item>
      <title>字符创和日期之间的转换</title>
      <description>&lt;p&gt;求大神。。。str = ”12/28/14 01:51 PM“转换成 "2014-12-28 01:51:00
Date，或者 Time 类里边儿有相应的转化方法没。。。。。&lt;/p&gt;</description>
      <author>easonlovejiven</author>
      <pubDate>Thu, 08 Jan 2015 11:05:14 +0800</pubDate>
      <link>https://ruby-china.org/topics/23605</link>
      <guid>https://ruby-china.org/topics/23605</guid>
    </item>
    <item>
      <title>同一个 app 中  如何处理类似多个 TabBar?</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/dec35db32b1c15a1f8a9a5180c0c1ef7.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;第一个是主界面的 tabbar，我在前面加了个 UITabBarController，
第二个图是某个特殊的界面，也需要单独的一套 tabbar，我如果再加上一个 UITabBarController  第二个不会生效，
于是我又加了个 Tab Bar 的控件，增加了多个 item  但是这样的话 头部的 nav 就没法统一控制了，有什么办法实现这样的效果？&lt;/p&gt;</description>
      <author>tsinghan</author>
      <pubDate>Wed, 07 Jan 2015 19:49:39 +0800</pubDate>
      <link>https://ruby-china.org/topics/23599</link>
      <guid>https://ruby-china.org/topics/23599</guid>
    </item>
    <item>
      <title>开发 app 的后台，用 ror 或者 Sinatra 能否合适？</title>
      <description>&lt;p&gt;开放性问题，希望大家分享点经验。&lt;/p&gt;</description>
      <author>alex_cheng</author>
      <pubDate>Tue, 30 Dec 2014 16:25:36 +0800</pubDate>
      <link>https://ruby-china.org/topics/23480</link>
      <guid>https://ruby-china.org/topics/23480</guid>
    </item>
  </channel>
</rss>
