<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
  <title>CocoaPods Blog</title>
  <description>Updates for the fascinating developments happening in the CocoaPods world.</description>
  <link>https://blog.cocoapods.org</link>
  <atom:link href="https://blog.cocoapods.org/feed.articles.xml" rel="self" type="application/rss+xml" />
  
  
  <item>
    <title>CocoaPods Trunk: Minor security updates</title>
    <description>&lt;p&gt;Hey folks, strange enough we got two separate security folks pointing out the same flaw in Trunk within a week of each other. I&amp;#39;ve shipped the fixes a month ago, it&amp;#39;s worth both explaining what was fixed and giving credit to the two researchers: &lt;a href=&quot;https://github.com/splitline&quot;&gt;splitline&lt;/a&gt; from &lt;a href=&quot;https://devco.re/en/&quot;&gt;DEVCORE&lt;/a&gt; and &lt;a href=&quot;https://joshua.hu/&quot;&gt;Joshua Rogers&lt;/a&gt; from &lt;a href=&quot;https://aisle.com/&quot;&gt;AISLE&lt;/a&gt; Research Team.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;When you sign up to CocoaPods trunk, rather than having you set up a password in the CLI we email you a token which you click to verify your current session as being valid. So, you would register by running this command:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;&amp;gt; pod trunk register orta.therox@gmail.com
[!] Please verify the session by clicking the link in the verification email that has been sent to orta.therox@gmail.com
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;That triggers a verification email, which would have looked like :&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;Hi Orta Therox,

Please confirm your CocoaPods session by clicking the following link:

    https://trunk.cocoapods.org/sessions/verify/51efd813

If you did not request this you do not need to take any further action.

Kind regards,
the CocoaPods team
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Accepting the token by clicking the link sets up the authentication for my local CLI as being verified.&lt;/p&gt;

&lt;p&gt;The flaw here is that &lt;code&gt;51efd813&lt;/code&gt; is a &lt;em&gt;relatively&lt;/em&gt; small space of characters, and we didn&amp;#39;t have any protection around someone requesting a verification for basically every possible token (e.g. &lt;code&gt;11111111&lt;/code&gt; to &lt;code&gt;ffffffff&lt;/code&gt;.)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/splitline&quot;&gt;splitline&lt;/a&gt; fom DEVCORE sent me a very interesting way to think about it, with a proof of concept script by using a &lt;a href=&quot;https://en.wikipedia.org/wiki/Birthday_attack&quot;&gt;birthday attack&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Step 1: Register a lot of times for the email you want, to increase the odds of it working.&lt;/li&gt;
&lt;li&gt;Step 2: Send random verification requests to Trunk&lt;/li&gt;
&lt;li&gt;Step 3: Check all of the sessions to see if they were verified&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With a reasonable enough amount of time, and tens of thousands of requests on each step, you can verify a token for an email address you don&amp;#39;t own.&lt;/p&gt;

&lt;h2 id=&quot;the-fix&quot;&gt;The fix&lt;/h2&gt;

&lt;p&gt;The &lt;a href=&quot;https://github.com/CocoaPods/trunk.cocoapods.org/pull/601&quot;&gt;Pull Request is here&lt;/a&gt; which converts the 8 characters to 20 characters (making the search space significantly larger) and adding the verification system to our request throttler, making it much harder to search the space!&lt;/p&gt;

&lt;h3 id=&quot;worst-case-scenario&quot;&gt;Worst case scenario&lt;/h3&gt;

&lt;p&gt;Like with the &lt;a href=&quot;https://blog.cocoapods.org/CocoaPods-Trunk-RCE/&quot;&gt;RCE in 2021&lt;/a&gt; I can&amp;#39;t prove this hasn&amp;#39;t been actively used. However, just because it hasn&amp;#39;t been proved, doesn&amp;#39;t mean it hasn&amp;#39;t happened. This touches code which has been in trunk since launch, and 11 years is a long time.&lt;/p&gt;

&lt;p&gt;The worst case scenario is that an attacker could have used this technique to get access to upload a CocoaPod version which contains malicious code. For a few years now we&amp;#39;ve been emailing Podspec authors when a new version comes out, so it&amp;#39;s likely someone would have been notified if this has happened to them.&lt;/p&gt;

&lt;h3 id=&quot;for-more-information&quot;&gt;For more information&lt;/h3&gt;

&lt;p&gt;We want to offer our thanks to &lt;a href=&quot;https://github.com/splitline&quot;&gt;splitline&lt;/a&gt; from &lt;a href=&quot;https://devco.re/en/&quot;&gt;DEVCORE&lt;/a&gt; and &lt;a href=&quot;https://joshua.hu/&quot;&gt;Joshua Rogers&lt;/a&gt; from &lt;a href=&quot;https://aisle.com/&quot;&gt;AISLE&lt;/a&gt; Research Team for their thorough reporting! They mentioned a few other things not noted in this blog post but we fixed around XSS and our throttler.&lt;/p&gt;

&lt;p&gt;CocoaPods is ran by a set of volunteers in their spare time. If you have any questions or comments about this advisory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open an issue in &lt;a href=&quot;https://github.com/CocoaPods/trunk.cocoapods.org&quot;&gt;the trunk repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Email us at our private security email: &lt;a href=&quot;mailto:info@cocoapods.org&quot;&gt;info@cocoapods.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you&amp;#39;re not sure of the email address you used for a pod, use &lt;code&gt;pod trunk info [pod_name]&lt;/code&gt; to see the connected email accounts.&lt;/p&gt;
</description>
    <pubDate>Wed, 18 Feb 2026 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-Trunk-Security-Thanks</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-Trunk-Security-Thanks</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods Trunk Read-only Plan</title>
    <description>&lt;p&gt;&lt;strong&gt;TLDR: In two years we plan to turn CocoaPods trunk to be read-only. At that point, no new versions or pods will be added to trunk.&lt;/strong&gt; - Note, this post has been updated in May 2025.&lt;/p&gt;

&lt;p&gt;Last month I wrote about how CocoaPods is currently being maintained, I also noted that we were discussing converting the main CocoaPods spec repo &amp;quot;trunk&amp;quot; to be read-only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We are discussing that on a very long, multi-year, basis we can drastically simplify the security of CocoaPods trunk by converting the Specs Repo to be read-only. Infrastructure like the Specs repo and the CDN would still operate as long as GitHub and jsDelivr continue to exist, which is pretty likely to be a very long time. &lt;strong&gt;This will keep all existing builds working&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I plan to implement the read-only mode so that when someone submits a new Podspec to CocoaPods, it will always be denied at the server level. I would then convert the &amp;quot;CocoaPods/Specs&amp;quot; repo to be marked as &amp;quot;Archived&amp;quot; on GitHub which should cover all of our bases.&lt;/p&gt;

&lt;p&gt;Making the switch will not break builds for people using CocoaPods in 2026 onwards, but at that point, you&amp;#39;re not getting any more updates to dependencies which come though CocoaPods trunk. This shouldn&amp;#39;t affect people who use CocoaPods with their own specs repos, or have all of their dependencies vendored (e.g. they all come from npm.)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;May 2025&lt;/em&gt; Update: Since this post was originally written, we&amp;#39;ve had enough security researchers abusing scripting capabilities in CocoaPods that we are now introducing a block on allowing new CocoaPods to use the &lt;a href=&quot;https://guides.cocoapods.org/syntax/podspec.html#prepare_command&quot;&gt;&lt;code&gt;prepare_command&lt;/code&gt;&lt;/a&gt; field in a Podspec. Any existing Pods using &lt;a href=&quot;https://guides.cocoapods.org/syntax/podspec.html#prepare_command&quot;&gt;&lt;code&gt;prepare_command&lt;/code&gt;&lt;/a&gt; are hard-coded to bypass this check.&lt;/p&gt;

&lt;h2 id=&quot;timeline&quot;&gt;Timeline&lt;/h2&gt;

&lt;p&gt;My goal is to send 2 very hard-to-miss notifications en-masse, and then do a test run a month before the final shutdown.&lt;/p&gt;

&lt;h3 id=&quot;may-2025&quot;&gt;May 2025&lt;/h3&gt;

&lt;p&gt;We are stopping new CocoaPods from being added which use the &lt;a href=&quot;https://guides.cocoapods.org/syntax/podspec.html#prepare_command&quot;&gt;&lt;code&gt;prepare_command&lt;/code&gt;&lt;/a&gt; field&lt;/p&gt;

&lt;h3 id=&quot;mid-late-2025&quot;&gt;Mid-late 2025&lt;/h3&gt;

&lt;p&gt;I will email all email addresses for people who have contributed a Podspec, informing them of the impending switch to read-only, and linking them to this blog post.&lt;/p&gt;

&lt;h3 id=&quot;september-october-2026&quot;&gt;September-October 2026&lt;/h3&gt;

&lt;p&gt;I will, again, email all email addresses for people who have contributed a Podspec, informing them of the impending switch to read-only, and linking them to this blog post, noting that they have roughly a month before we do a test run of going read-only.&lt;/p&gt;

&lt;h3 id=&quot;november-1-7th-2026&quot;&gt;November 1-7th 2026&lt;/h3&gt;

&lt;p&gt;I will trigger a test run, giving automation a chance to break early&lt;/p&gt;

&lt;h3 id=&quot;december-2nd-2026&quot;&gt;December 2nd 2026&lt;/h3&gt;

&lt;p&gt;I will switch trunk to not accept new Podspecs permanently. This is a Wednesday after American Thanksgiving, so I think folks won&amp;#39;t be in rush mode.&lt;/p&gt;

&lt;h2 id=&quot;contact&quot;&gt;Contact&lt;/h2&gt;

&lt;p&gt;These dates are not set in stone, and maybe someone out there has a good reason for us to amend the timeline. I don&amp;#39;t think I&amp;#39;m amenable to moving it forwards, but within reason there&amp;#39;s space for backwards.&lt;/p&gt;

&lt;p&gt;If you have questions, you can contact the team via &lt;a href=&quot;mailto:info@cocoapods.org&quot;&gt;info@cocoapods.org&lt;/a&gt;, me personally at &lt;a href=&quot;mailto:cocoapods@orta.io&quot;&gt;cocoapods@orta.io&lt;/a&gt; or reach out to me via Bluesky: &lt;a href=&quot;https://bsky.app/profile/orta.io/&quot;&gt;@orta.io&lt;/a&gt;.&lt;/p&gt;
</description>
    <pubDate>Sat, 30 Nov 2024 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-Specs-Repo</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-Specs-Repo</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods Support & Maintenance Plans</title>
    <description>&lt;p&gt;&lt;strong&gt;TLDR: We&amp;#39;re still keeping it ticking, but we&amp;#39;re being more up-front that CocoaPods is in maintenance mode.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CocoaPods is about 13 years old now, and the landscape of iOS development has changed a lot in that time. I remember the fragmented islets of small shared libraries (like: ASIHTTPRequest, Three20, SBJson, SSToolkit, iCarousel) with tricky upgrade instructions and complicated build setups. CocoaPods simplified that process enough that it turned into the de-facto way to share code in the iOS and Mac community.&lt;/p&gt;

&lt;p&gt;In &lt;a href=&quot;https://x.com/orta/status/672436829250052102&quot;&gt;2015&lt;/a&gt;, Apple announce that the CocoaPods project &lt;a href=&quot;https://www.npr.org/2024/06/17/g-s1-4912/apple-app-store-obsolete-sherlocked-tapeacall-watson-copy&quot;&gt;had been Sherlocked&lt;/a&gt; because they were going to be creating their own package manager: Swift Package Manager. This move effectively took all the wind out of the sails of CocoaPods, slowing active development of the project as competing with Apple on their own turf is rarely a battle worth your volunteer hours.&lt;/p&gt;

&lt;p&gt;Since Swift Package Managers announcement 9 years ago, members of the core team have individually had reasons for continual maintenance: a sense of duty, being employed to work on libraries or apps which use CocoaPods, working on build infra for large projects where CocoaPods is a key part of the build process or just a love of the community.&lt;/p&gt;

&lt;p&gt;However, with time - these links become more tenuous too, jobs change, people move to new ecosystems and we&amp;#39;ve slowly been moving CocoaPods to an place where work only happens when something external causes it. That could be security issues like I&amp;#39;ve reported the last few years on the blog, or Xcode breaking changes which require us to tweak some settings and make a new build.&lt;/p&gt;

&lt;p&gt;If CocoaPods&amp;#39; only audience were native Cocoa developers, CocoaPods&amp;#39; usage should be on the decline, however, that is not the case. The popularity of React Native and Flutter have ensured that &lt;a href=&quot;https://www.ruby-toolbox.com/projects/cocoapods&quot;&gt;most metrics of usage/traffic&lt;/a&gt; have been steadily rising over time.&lt;/p&gt;

&lt;p&gt;This puts CocoaPods in a strange place, a lot of the maintainers don&amp;#39;t use it, Apple have been maintaining a replacement for 9 years and the new users of the project barely even know that CocoaPods exists or what it does.&lt;/p&gt;

&lt;p&gt;So, we concluded we need to figure out what is going on with the project and how we have been treating it as maintainers over the last few years.&lt;/p&gt;

&lt;h3 id=&quot;how-cocoapods-is-maintained&quot;&gt;How CocoaPods Is Maintained&lt;/h3&gt;

&lt;p&gt;Strictly speaking, &lt;strong&gt;we don&amp;#39;t plan on changing how we&amp;#39;re maintaining CocoaPods&lt;/strong&gt;. We&amp;#39;re just going to start being clear how CocoaPods has been maintained:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We will make sure to handle systemic security issues to trunk&lt;/li&gt;
&lt;li&gt;We will aim to make at least 2 releases a year to keep up-to-date with Xcode updates&lt;/li&gt;
&lt;li&gt;We will aim to look at support requests for trunk every 6 months&lt;/li&gt;
&lt;li&gt;We will keep the website infrastructure from not falling over completely&lt;/li&gt;
&lt;li&gt;We are open to PRs which make CocoaPods more future-friendly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What we will not be doing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We don&amp;#39;t actively follow GitHub issues as a support avenue for individuals&lt;/li&gt;
&lt;li&gt;We aren&amp;#39;t planning on active CocoaPods development in terms of new features&lt;/li&gt;
&lt;li&gt;We aren&amp;#39;t going to make guarantees about handling PRs from people adding new features, or application-level bugs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;new-contributors&quot;&gt;New contributors&lt;/h3&gt;

&lt;p&gt;This is where people would normally say &lt;em&gt;&amp;quot;If we had more volunteers or money etc&amp;quot;&lt;/em&gt; but we&amp;#39;re not sure that this would help, the skills of maintaining build tooling in Ruby have grown increasingly less relevant over the years to the point that the overlap between &amp;quot;knows how to handle an Xcode project&amp;quot; and &amp;quot;knows what&amp;#39;s going on in a complex ruby project&amp;quot; is pretty slim.&lt;/p&gt;

&lt;p&gt;We&amp;#39;re open to the idea that multiple people who are well motivated to do the necessary volunteer work may be out there, but the search, training and mentoring is also a big ask for existing folks who have little enough time for the project.&lt;/p&gt;

&lt;h3 id=&quot;long-term-plans&quot;&gt;Long term plans&lt;/h3&gt;

&lt;h4 id=&quot;read-only-specs&quot;&gt;Read-only Specs&lt;/h4&gt;

&lt;p&gt;We are discussing that on a very long, multi-year, basis we can drastically simplify the security of CocoaPods trunk by converting the Specs Repo to be read-only. Infrastructure like the Specs repo and the CDN would still operate as long as GitHub and jsDelivr continue to exist, which is pretty likely to be a very long time. &lt;strong&gt;This will keep all existing builds working&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At least for projects like React Native, this could be fine as-is, as most of their libraries come via npm instead of the Trunk, I can&amp;#39;t talk to how Flutter&amp;#39;s ecosystem works as I have no exposure to it. &lt;/p&gt;

&lt;p&gt;We&amp;#39;d make the Specs repo read-only by offering a date when Trunk (our CocoaPods Specs repo authentication server) will be disabled. As trunk is the main target in a supply-chain attack, this would nix all the key issues there. I think we&amp;#39;d be open to this changing if there is a popular alternative client for the Specs Repo was maintained and used by a reasonable number of the community.&lt;/p&gt;

&lt;p&gt;We would have a specific blog post with a comprehensive plan if/when this idea settles with us, and to be very explicit: &lt;em&gt;the announced date would be years away.&lt;/em&gt;&lt;/p&gt;

&lt;h4 id=&quot;i-use-cocoapods-as-a-hidden-abstraction-in-my-framework&quot;&gt;I use CocoaPods as a Hidden Abstraction in My Framework&lt;/h4&gt;

&lt;p&gt;E.g. I maintain Unity, React Native, Flutter etc. A lot of these projects will (and should) be migrating to Swift Package Manager with time. As specified above, we are not breaking anything but bugs you may raise are unlikely to get fixed. &lt;/p&gt;

&lt;p&gt;If you run these sorts of frameworks and are commercially exposed here, then we&amp;#39;re open to chatting - I think no-one on the current team is interested in working on this full time but that doesn&amp;#39;t mean we can&amp;#39;t find ways to have others who consider this a part of &lt;em&gt;their job role&lt;/em&gt; taking over parts of what keeps CocoaPods ticking. You can mail all of us at &lt;a href=&quot;mailto:info@cocoapods.org&quot;&gt;info@cocoapods.org&lt;/a&gt; or me personally at &lt;a href=&quot;mailto:cocoapods@orta.io&quot;&gt;cocoapods@orta.io&lt;/a&gt; if you prefer.&lt;/p&gt;

&lt;h3 id=&quot;plodding-on&quot;&gt;Plodding on&lt;/h3&gt;

&lt;p&gt;Long term maintenance of public infra is often a long grind with the occasional thanks, so I want to try leave this on a &amp;quot;thanks&amp;quot; and give a shout out of all the folks who have been helping to keep the project alive: Eloy, Fabio, Danielle, Dimitris, Eric, Samuel, Paul, Igor, Boris, Florian, Keith, Karla, Emma, Marin, Michele, Joshua, Delisa, Kyle, Olivier, Hugo, Nate, Muhammed, Ben, and Marius . Plus, anyone who ended up in the CocoaPods Slack!&lt;/p&gt;
</description>
    <pubDate>Tue, 13 Aug 2024 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-Support-Plans</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-Support-Plans</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods Trunk: 3 Remote Code Execution found, 2023</title>
    <description>&lt;p&gt;Over the last month, security researchers at &lt;a href=&quot;https://evasec.io&quot;&gt;evasec.io&lt;/a&gt; have been reached out to us about three separate vulnerabilities in CocoaPods Trunk (the server which handles updates to Pods). We&amp;#39;ve been working with evasec to patch these issues as they come up. Looking at all three combined, I felt we needed to reset all user sessions again, which is why I&amp;#39;m writing on the blog post instead of &lt;a href=&quot;https://www.theverge.com/23929222/puzzmo-newspaper-games-crossword-zach-gage&quot;&gt;working on Puzzmo&lt;/a&gt; which just shipped this week.&lt;/p&gt;

&lt;p&gt;There are three key issues reported against Trunk, which were promptly fixed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1. It was still possible to use the &lt;a href=&quot;https://blog.cocoapods.org/Claim-Your-Pods/&quot;&gt;&amp;#39;claim your pod&amp;#39;&lt;/a&gt; process to take over a Pod when someone had removed all prior maintainers from it&lt;/li&gt;
&lt;li&gt;2. The email which is sent out to verify your email address can be tricked to change to link to a third party&lt;/li&gt;
&lt;li&gt;3. The part of trunk which verifies your email address could be used to execute shell commands on the trunk server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Being able to execute arbitrary shell commands on the server gave a possible attacker the ability to read our environment variables, which could be used to write to the CocoaPods/Specs repo and read the trunk database. Being able to trick people into clicking on a link which would take them to a third party site could be used to steal their session keys. I can&amp;#39;t guarantee neither of these happened, and I&amp;#39;d rather be on the safe side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This means you will need to log in again to trunk again to deploy any new Podspecs&lt;/strong&gt;. If you have automated deployment to CocoaPods working with a stored ENV VAR right now, &lt;strong&gt;this will break&lt;/strong&gt;, and you will need to &lt;code&gt;pod trunk register&lt;/code&gt; again and replace your &lt;code&gt;COCOAPODS_TRUNK_TOKEN&lt;/code&gt;. We&amp;#39;re sorry, I know that sucks, but it also &lt;em&gt;guarantees&lt;/em&gt; that you are the only person with write access to your pods.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are not a pod author, you do not need to do anything&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://evasec.io&quot;&gt;evasec.io&lt;/a&gt; are still in the process of writing up the full technical details of how the exploits worked, so I&amp;#39;ll both update this post with links to their write-ups when they are ready, as well as do a new blog post with the details at a higher level to describe how they work to folks who are not intimate with server architectures. &lt;/p&gt;

&lt;!-- more --&gt;

&lt;h3 id=&quot;worst-case-scenario&quot;&gt;Worst case scenario&lt;/h3&gt;

&lt;p&gt;Like with the &lt;a href=&quot;https://blog.cocoapods.org/CocoaPods-Trunk-RCE/&quot;&gt;RCE in 2021&lt;/a&gt; I can&amp;#39;t prove these have been actively used. However, just because it hasn&amp;#39;t been proved, doesn&amp;#39;t mean it hasn&amp;#39;t happened. This touches code which has been in trunk since launch, and 9 years is a long time.&lt;/p&gt;

&lt;p&gt;The worst case scenario is that an attacker could have used this technique to get access to our trunk database. The trunk database contains the same emails which are public in the git history of the Specs repo. The table of information in the database which should not be seen are session keys. These keys act like unique passwords to accounts, and session keys are used to connect authenticated users to pods. We are wiping all session keys, which ensures no-one other than those with access to their emails can post updates to those pods.&lt;/p&gt;

&lt;h3 id=&quot;for-more-information&quot;&gt;For more information&lt;/h3&gt;

&lt;p&gt;We want to offer our thanks to &lt;a href=&quot;https://evasec.io&quot;&gt;evasec.io&lt;/a&gt;(EVA) for their thorough reports!&lt;/p&gt;

&lt;p&gt;CocoaPods is ran by a set of volunteers in their spare time. If you have any questions or comments about this advisory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open an issue in &lt;a href=&quot;https://github.com/CocoaPods/trunk.cocoapods.org&quot;&gt;the trunk repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Email us at our private security email: &lt;a href=&quot;mailto:info@cocoapods.org&quot;&gt;info@cocoapods.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you&amp;#39;re not sure of the email address you used for a pod, use &lt;code&gt;pod trunk info [pod_name]&lt;/code&gt; to see the connected email accounts.&lt;/p&gt;
</description>
    <pubDate>Sat, 28 Oct 2023 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-Trunk-RCEs-2023</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-Trunk-RCEs-2023</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods Web Hosting now Sponsored by Emerge Tools</title>
    <description>&lt;p&gt;I&amp;#39;m very happy to announce that &lt;a href=&quot;https://www.emergetools.com&quot;&gt;Emerge Tools&lt;/a&gt; is now sponsoring the web hosting costs of CocoaPods!&lt;/p&gt;

&lt;p&gt;We&amp;#39;re super thankful that Emerge is stepping in to help us out with this. CocoaPods.org, Trunk, and all the other websites we maintain are a critical part of the CocoaPods ecosystem, and we&amp;#39;re glad to have Emerge&amp;#39;s support to keep them running.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Emerge Tools is a suite of revolutionary products designed to supercharge mobile apps and the teams that build them. They&amp;#39;re a small startup working in a space that is near and dear to our hearts, and when they heard that the CocoaPods maintainers had been paying for hosting out-of-pocket for years, they were eager to step up and help out.&lt;/p&gt;
</description>
    <pubDate>Wed, 21 Jun 2023 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Web-Hosting-Sponsored-by-Emerge</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Web-Hosting-Sponsored-by-Emerge</guid>
  </item>
  
  
  
  <item>
    <title>1.11 Arrives!</title>
    <description>&lt;p&gt;&lt;em&gt;CocoaPods 1.11&lt;/em&gt; raises the minimum Ruby version to 2.6 while adding support for Ruby 3.0. It also adds support for &amp;#39;On Demand Resources&amp;#39; and contains numerous bug fixes and improvements!&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h3 id=&quot;ruby-2-6-and-ruby-3-0&quot;&gt;Ruby 2.6 and Ruby 3.0&lt;/h3&gt;

&lt;p&gt;With the release of 1.11, the minimum version of Ruby required to run CocoaPods is now 2.6. By doing so, we were also able to bump a few other dependencies (such as ActiveSupport and Addressable) that were often colliding with other setups. We hope this unblocks developers and makes CocoaPods a bit more flexible.&lt;/p&gt;

&lt;p&gt;Ruby 3.0 is also now supported and is part of CocoaPods CI going forward! This will ensure new changes and fixes are always tested and verified against Ruby 3.0 before they are merged.&lt;/p&gt;

&lt;h3 id=&quot;on-demand-resources&quot;&gt;On Demand Resources&lt;/h3&gt;

&lt;p&gt;In a nutshell, &lt;a href=&quot;https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/index.html&quot;&gt;On Demand Resources&lt;/a&gt; allow developers to ship smaller app bundles by downloading assets on-demand instead of pre-shipping them.&lt;/p&gt;

&lt;p&gt;With CocoaPods 1.11, pod authors may now specify a set of resources to be integrated as on demand resources for a given application.&lt;/p&gt;

&lt;p&gt;Here&amp;#39;s an example &lt;code&gt;podspec&lt;/code&gt; that uses the new &lt;code&gt;on_demand_resources&lt;/code&gt; DSL:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Pod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;MyGameAssets&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;1.0&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# ... rest of root spec entries go here&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;on_demand_resources&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;&amp;#39;level1_assets&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;level1/**/*.png&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;&amp;#39;level2_assets&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;level2/**/*.png&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Each key specifies a tag and each value is a glob for the paths to include. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: On demand resource paths specified within &lt;code&gt;on_demand_resources&lt;/code&gt; are &lt;em&gt;not&lt;/em&gt; required to be also specified within &lt;code&gt;resources&lt;/code&gt; DSL or &lt;code&gt;resource_bundle&lt;/code&gt; DSL.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;All&lt;/em&gt; on demand resources specified will be automatically integrated to the user&amp;#39;s targets project and CocoaPods 1.11 will take care of updating all known asset tags of the user&amp;#39;s project.&lt;/p&gt;

&lt;p&gt;For example, give the following &lt;code&gt;Podfile&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;MyGameApp&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;MyGameAssets&amp;#39;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;on_demand_resources&lt;/code&gt; specified within the &lt;code&gt;MyGameAssets.podspec&lt;/code&gt; will be integrated and added to the &lt;code&gt;MyGameApp&lt;/code&gt; target!&lt;/p&gt;

&lt;h3 id=&quot;other-notable-enhancements&quot;&gt;Other Notable Enhancements&lt;/h3&gt;

&lt;p&gt;The following DSL options have been added or expanded to serve different use-cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;project_header_files&lt;/code&gt; DSL: Pod authors may now specific a set of &lt;code&gt;project_header_files&lt;/code&gt; that are part of their pod. This helps designate specific headers that are meant to be used only by the pod itself. When the library is built, these headers will &lt;em&gt;not&lt;/em&gt; appear in the build directory.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New &lt;code&gt;script_phase&lt;/code&gt; execution positions: The &lt;code&gt;script_phase&lt;/code&gt; DSL has been extended to accept &lt;code&gt;before_headers&lt;/code&gt; and &lt;code&gt;after_headers&lt;/code&gt; option for the &lt;code&gt;execution_position&lt;/code&gt;. This is useful when a script phase must be executed before or after the &amp;quot;Copy Headers&amp;quot; phase.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;pre_integrate_hook&lt;/code&gt; DSL: Similar to the &lt;code&gt;post_integrate_hook&lt;/code&gt; DSL added in version &lt;a href=&quot;https://blog.cocoapods.org/CocoaPods-1.10.0-beta/&quot;&gt;1.10&lt;/a&gt;, this new hook will be executed before the user&amp;#39;s project is integrated with the generated Pods project. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;xcode-13-support&quot;&gt;Xcode 13 Support&lt;/h3&gt;

&lt;p&gt;A new version of the &lt;code&gt;Xcodeproj&lt;/code&gt; gem has shipped that adds initial support for Xcode 13 projects. To update, run &lt;code&gt;gem update xcodeproj&lt;/code&gt; or if you are using &lt;a href=&quot;https://bundler.io/&quot;&gt;Bundler&lt;/a&gt; then run &lt;code&gt;bundle update xcodeproj&lt;/code&gt; instead.&lt;/p&gt;

&lt;p&gt;CocoaPods 1.11 by default includes the latest version of the &lt;code&gt;Xcodeproj&lt;/code&gt; gem allowing it to work with Xcode 13 right out of the box.&lt;/p&gt;

&lt;p&gt;That&amp;#39;s it!&lt;/p&gt;

&lt;h3 id=&quot;whats-next&quot;&gt;What&amp;#39;s Next&lt;/h3&gt;

&lt;p&gt;Like any other open source project, CocoaPods is maintained and improved by a handful of folks on their spare time. There is no official roadmap and new features will depend upon the community&amp;#39;s appetite to build them! We welcome new contributors and assistance from anyone who wants to improve CocoaPods!&lt;/p&gt;

&lt;p&gt;We believe that CocoaPods continues to play a significant role for iOS development. It has particularly found strong footing in alternative mobile frameworks such as &lt;a href=&quot;https://reactnative.dev/&quot;&gt;React Native&lt;/a&gt;, &lt;a href=&quot;https://flutter.dev/&quot;&gt;Flutter&lt;/a&gt; and &lt;a href=&quot;https://kotlinlang.org/lp/mobile/&quot;&gt;Kotlin Multiplatform&lt;/a&gt; and we hope this release provides pod authors and iOS developers with more powerful tools and features.&lt;/p&gt;

&lt;p&gt;As always, we would like to thank all of our contributors who helped make this release happen!&lt;/p&gt;

&lt;p&gt;Checkout the &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/releases/tag/1.11.0.beta.1&quot;&gt;changelog&lt;/a&gt; to see the full list of changes.&lt;/p&gt;
</description>
    <pubDate>Mon, 09 Aug 2021 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-1.11.0-beta</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-1.11.0-beta</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods Trunk: Remote Code Execution found</title>
    <description>&lt;p&gt;Part of the server-side validation for uploading a new CocoaPod to the central repository of Podspecs &lt;a href=&quot;https://blog.cocoapods.org/CocoaPods-Trunk/&quot;&gt;(trunk)&lt;/a&gt; could be exploited to execute arbitrary shell commands on the trunk server. &lt;/p&gt;

&lt;p&gt;We were contacted via &lt;a href=&quot;https://mastodon.mit.edu/@maxj&quot;&gt;Max Justicz&lt;/a&gt; this morning who provided us with a great technical write-up and showed how to trigger it for ourselves. The exploit is a combination of un-sanitized user input getting through to a git call param which can be used to send remote payloads. &lt;/p&gt;

&lt;p&gt;Being able to execute arbitrary shell commands on the server gave a possible attacker the ability to read the environment variables, which could be used to write to the CocoaPods/Specs repo and read the trunk database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This means you will need to log in again to trunk again to deploy any new Podspecs&lt;/strong&gt;. If you have automated deployment to CocoaPods working right now, &lt;strong&gt;this will break&lt;/strong&gt;, and you will need to &lt;code&gt;pod trunk register&lt;/code&gt; again and replace your &lt;code&gt;COCOAPODS_TRUNK_TOKEN&lt;/code&gt;. We&amp;#39;re sorry, I know that sucks, but it also &lt;em&gt;guarantees&lt;/em&gt; that you are the only person with write access to your pods.&lt;/p&gt;

&lt;p&gt;If you are not a pod author, you do not need to do anything.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h3 id=&quot;patched&quot;&gt;Patched&lt;/h3&gt;

&lt;p&gt;This vulnerability was introduced on &lt;a href=&quot;https://github.com/CocoaPods/trunk.cocoapods.org/pull/137&quot;&gt;Jun 4th, 2015&lt;/a&gt; and has been fixed as of &lt;a href=&quot;https://github.com/CocoaPods/trunk.cocoapods.org/pull/303&quot;&gt;11am GMT April 19th 2021&lt;/a&gt;. The issue has been patched server-side and does not affect your CocoaPods installation.&lt;/p&gt;

&lt;p&gt;As most of the commits in the Specs repo are automated through trunk, we have &lt;a href=&quot;https://github.com/orta/specs-repo-git-scanner&quot;&gt;built some introspection tools&lt;/a&gt; to validate the Specs repo commits are ones which have been created by publishing/deprecating/deleting through trunk. The majority of other commits in the repo are around setting up infra for the CDN support, and CocoaPods release pushes. We don&amp;#39;t think the CocoaPods Specs repo has been tampered with.&lt;/p&gt;

&lt;h3 id=&quot;how-the-exploit-worked&quot;&gt;How the exploit worked&lt;/h3&gt;

&lt;p&gt;During the deploy of a podspec to trunk, the server validates that the repo is accessible to git. This is done to help fix potentially broken podspecs with typoes, local auth which won&amp;#39;t work for others or external repos don&amp;#39;t have tags already set up. This validation used to rely on using the git CLI on trunk using &lt;code&gt;git ls-remote&lt;/code&gt; to replicate the same check as a user&amp;#39;s git would, but &lt;code&gt;ls-remote&lt;/code&gt; has a parameter &lt;a href=&quot;https://git-scm.com/docs/git-ls-remote&quot;&gt;&lt;code&gt;--upload-pack&lt;/code&gt;&lt;/a&gt; which can be used to execute a new shell.&lt;/p&gt;

&lt;p&gt;This meant an attacker could create a specially crafted podspec via &lt;a href=&quot;https://guides.cocoapods.org/syntax/podspec.html#source&quot;&gt;&lt;code&gt;source&lt;/code&gt;&lt;/a&gt;, which would trigger the &lt;code&gt;--upload-pack&lt;/code&gt; param and execute an arbitrary command on trunk.&lt;/p&gt;

&lt;h3 id=&quot;worst-case-scenario&quot;&gt;Worst case scenario&lt;/h3&gt;

&lt;p&gt;We&amp;#39;ve not been able to prove that anyone has used this method before Max&amp;#39;s report today. However, just because it hasn&amp;#39;t been proved, doesn&amp;#39;t mean it hasn&amp;#39;t happened. 6 years is a long time. &lt;/p&gt;

&lt;p&gt;The worst case scenario is that an attacker could have used this technique to get access to our trunk database. The trunk database contains the same emails which are public in the git history of the Specs repo. The table of information in the database which should not be seen are session keys. These keys act like unique passwords to accounts, and session keys are used to connect authenticated users to pods. We are wiping all session keys.&lt;/p&gt;

&lt;p&gt;From the side of our investigation, &lt;em&gt;we cannot automatically detect if someone has deployed a poisoned copy of a Pod&lt;/em&gt;. If you want to verify that your Pods have not had an un-expected release, you can use this app to shows the &lt;code&gt;sources&lt;/code&gt; for every version of a Pod: &lt;a href=&quot;https://pod-sources.cocoapods.org&quot;&gt;https://pod-sources.cocoapods.org&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;for-more-information&quot;&gt;For more information&lt;/h3&gt;

&lt;p&gt;CocoaPods is ran by a set of volunteers in their spare time. If you have any questions or comments about this advisory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open an issue in &lt;a href=&quot;https://github.com/CocoaPods/trunk.cocoapods.org&quot;&gt;the trunk repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Email us at our private security email: &lt;a href=&quot;mailto:info@cocoapods.org&quot;&gt;info@cocoapods.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The security advisory on GitHub: &lt;a href=&quot;https://github.com/CocoaPods/trunk.cocoapods.org/security/advisories/GHSA-gx9h-rv35-v9hh&quot;&gt;GHSA-gx9h-rv35-v9hh&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you&amp;#39;re not sure of the email address you used to use, use &lt;code&gt;pod trunk info [pod_name]&lt;/code&gt; to see the connected email accounts.&lt;/p&gt;
</description>
    <pubDate>Mon, 19 Apr 2021 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-Trunk-RCE</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-Trunk-RCE</guid>
  </item>
  
  
  
  <item>
    <title>1.10 Beta Begins!</title>
    <description>&lt;p&gt;&lt;em&gt;CocoaPods 1.10&lt;/em&gt; drops support for Ruby 2.0, adds support for Ruby 2.7 and adds initial support for Xcode 12 as well as a revamped XCFramework integration process!&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h3 id=&quot;ruby-2-0-is-out-2-7-is-in&quot;&gt;Ruby 2.0 is out, 2.7 is in!&lt;/h3&gt;

&lt;p&gt;In the 1.10 release, CocoaPods no longer supports Ruby 2.0 and bumps the minimum version to Ruby 2.3.3! Support for Ruby 2.0 has been dropped for years and macOS with High Sierra has been shipping with Ruby 2.3.3 as the default version.&lt;/p&gt;

&lt;p&gt;We hope that this update will unblock other gems that in the past were blocked by CocoaPods as well as address several vulnerabilities that have been fixed since then.&lt;/p&gt;

&lt;p&gt;Finally, all CocoaPods related gems have been updated to work with Ruby 2.7 and all known warnings have been fixed during installation.&lt;/p&gt;

&lt;h3 id=&quot;revamped-xcframework-integration&quot;&gt;Revamped XCFramework Integration&lt;/h3&gt;

&lt;p&gt;With this release, the biggest change is the removal of the &lt;code&gt;Prepare Artifacts&lt;/code&gt; script. Similar to the &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/pull/9547&quot;&gt;reworked dSYM support&lt;/a&gt; in this release, the logic to embed a &lt;code&gt;.framework&lt;/code&gt; slice has now moved from the app to each pod target with a new script phase, &lt;code&gt;Copy XCFrameworks&lt;/code&gt;. Handling of dSYMs and bitcode symbol maps have also moved.&lt;/p&gt;

&lt;p&gt;This rework assisted in fixing several bugs and enabled the support of additional features such as static library support and framework user targets!&lt;/p&gt;

&lt;h3 id=&quot;xcode-12-support&quot;&gt;Xcode 12 Support&lt;/h3&gt;

&lt;p&gt;With CocoaPods 1.10 initial support for Xcode 12 has been added. Xcode 12 is still in beta, so it is expected that a few more updates will be required to fully support it. Please file any &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/new&quot;&gt;issues&lt;/a&gt; for us to diagnose and fix prior to 1.10 launching!&lt;/p&gt;

&lt;h3 id=&quot;post_integrate-hook-dsl&quot;&gt;&lt;code&gt;post_integrate&lt;/code&gt; Hook DSL&lt;/h3&gt;

&lt;p&gt;CocoaPods has always offered various hooks into its installation lifecycle. This allows users to customize several aspects of the installation process and perform changes to their project. With this release, we are adding a new &lt;code&gt;post_integrate&lt;/code&gt; hook that is executed after the CocoaPods integration step is completed.&lt;/p&gt;

&lt;p&gt;In your &lt;code&gt;Podfile&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;post_integrate&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;installer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Perform post integration steps here!&amp;#39;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Integration is the last step of the installation process and is responsible for integrating the generated &lt;code&gt;Pods.xcodeproj&lt;/code&gt; with the user&amp;#39;s project. This hook will be executed right after this is completed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This hook is executed &lt;em&gt;after&lt;/em&gt; all &lt;code&gt;.xcodeproj&lt;/code&gt; have been saved (written to disk). Performing changes to the &lt;code&gt;Pods.xcodeproj&lt;/code&gt; will require an additional &lt;code&gt;save&lt;/code&gt; but that can be slow. It is recommended to use a &lt;code&gt;post_install&lt;/code&gt; hook instead if you anticipate making changes to the &lt;code&gt;Pods.xcodeproj&lt;/code&gt; before it gets saved to disk.&lt;/p&gt;

&lt;h3 id=&quot;ensure_bundler-dsl&quot;&gt;&lt;code&gt;ensure_bundler!&lt;/code&gt; DSL&lt;/h3&gt;

&lt;p&gt;Many projects use &lt;a href=&quot;https://bundler.io/&quot;&gt;Bundler&lt;/a&gt; under the hood and when working with CocoaPods. That is because Bundler ensures a consistent environment which can be useful for teams that work on the same project.&lt;/p&gt;

&lt;p&gt;In 1.10, a new &lt;code&gt;ensure_bundler!&lt;/code&gt; DSL can be added to your &lt;code&gt;Podfile&lt;/code&gt; to specify a version requirement of the Bundler version.&lt;/p&gt;

&lt;p&gt;Here&amp;#39;s an example:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;ensure_bundler!&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;gt; 2.0&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;That&amp;#39;s it!&lt;/p&gt;

&lt;h3 id=&quot;whats-next&quot;&gt;What&amp;#39;s Next&lt;/h3&gt;

&lt;p&gt;CocoaPods has come a long way since its inception, and we hope to revisit some of the older implementations regarding resource support (not resource bundles) that have been the source of issues for larger repositories that ship multiple apps.&lt;/p&gt;

&lt;p&gt;Additionally, we are still considering adding support for local sources that would be helpful for monorepos and allow CocoaPods to discover local pods automatically.&lt;/p&gt;

&lt;p&gt;Thanks to all of our contributors who helped make this release happen!&lt;/p&gt;

&lt;p&gt;Checkout the &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/releases/tag/1.10.0.beta.1&quot;&gt;changelog&lt;/a&gt; to see the full list of changes.&lt;/p&gt;
</description>
    <pubDate>Fri, 17 Jul 2020 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-1.10.0-beta</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-1.10.0-beta</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 1.9 Beta has arrived!</title>
    <description>&lt;p&gt;&lt;em&gt;CocoaPods 1.9&lt;/em&gt; adds support for XCFrameworks, configuration-based dependencies for pod authors, code coverage in generated schemes, and other enhancements and bug fixes!&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;This release includes several quality-of-life enhancements in addition to important bug fixes.&lt;/p&gt;

&lt;h3 id=&quot;xcframework-support&quot;&gt;XCFramework Support&lt;/h3&gt;

&lt;p&gt;With the release of Xcode 11, Apple introduced a new bundle format using the &lt;code&gt;.xcframework&lt;/code&gt; file extension. This format allows multiple copies of a framework compiled for different architectures and platforms to be combined into a single structure. XCFrameworks are also required for binary dependencies to support the new &lt;em&gt;Catalyst&lt;/em&gt; platform introduced in macOS &lt;em&gt;Catalina&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This release introduces support for Pod authors to ship vendored XCFrameworks using the existing &lt;a href=&quot;https://guides.cocoapods.org/syntax/podspec.html#vendored_frameworks&quot;&gt;vendored_framework&lt;/a&gt; DSL. Example:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Pod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;         &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ToastLib&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;1.0.0&amp;#39;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# ...rest of attributes here&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vendored_frameworks&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ButterLib.xcframework&amp;#39;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;For apps that include Pods which vendor dynamic frameworks, a new script phase with the name &lt;code&gt;[CP] Prepare Artifacts&lt;/code&gt; will be added to the project to facilitate including the &lt;code&gt;.xcframework&lt;/code&gt; into the app bundle.&lt;/p&gt;

&lt;p&gt;For additional details on how to create an XCFramework, check out Apple&amp;#39;s WWDC talk &lt;a href=&quot;https://developer.apple.com/videos/play/wwdc2019/416/&quot;&gt;Binary Frameworks in Swift&lt;/a&gt; which introduced the format.&lt;/p&gt;

&lt;h3 id=&quot;configuration-based-dependencies-for-podspecs&quot;&gt;Configuration-based dependencies for Podspecs&lt;/h3&gt;

&lt;p&gt;CocoaPods has long supported excluding dependencies from configurations in which they are not needed. For example, debug-only dependencies used during development can be included using the &lt;code&gt;:configurations&lt;/code&gt; option on the &lt;code&gt;pod&lt;/code&gt; Podfile DSL:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;BananaApp&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Toast&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:configurations&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;Debug&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;This release extends this functionality to Pod authors. The same &lt;code&gt;:configurations&lt;/code&gt; option may now be used with the &lt;code&gt;dependency&lt;/code&gt; Podspec DSL:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Pod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;         &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ToastLib&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;1.0.0&amp;#39;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# ...rest of attributes here&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dependency&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ButterDebugging&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:configurations&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;Debug&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dependency&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ErrorReportingTool&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:configurations&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;Release&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Only &lt;code&gt;Debug&lt;/code&gt; and &lt;code&gt;Release&lt;/code&gt; configurations are currently supported. Support for specifying a custom configuration name might be added in the future. &lt;/p&gt;

&lt;h3 id=&quot;code-coverage-in-test-specs&quot;&gt;Code Coverage in Test Specs&lt;/h3&gt;

&lt;p&gt;CocoaPods first introduced the ability to configure the generated Xcode schemes for Podspecs in version &lt;a href=&quot;/CocoaPods-1.7.0-beta&quot;&gt;1.7&lt;/a&gt;. This release adds support for enabling code coverage for tests by specifying the &lt;code&gt;code_coverage&lt;/code&gt; option within the &lt;code&gt;scheme&lt;/code&gt; DSL:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Pod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;         &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Networking&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;1.0.0&amp;#39;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# ...rest of attributes here&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Tests&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scheme&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;ss&quot;&gt;:code_coverage&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:environment_variables&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;FOO&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;BAR&amp;#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h3 id=&quot;swift-version-variants&quot;&gt;Swift Version Variants&lt;/h3&gt;

&lt;p&gt;As new Swift versions are released, Pod authors have added support for compiling their source with multiple Swift versions by using the &lt;code&gt;swift_versions&lt;/code&gt; Podspec DSL.&lt;/p&gt;

&lt;p&gt;To better support this, the Podfile DSL was updated in &lt;a href=&quot;/CocoaPods-1.7.0-beta&quot;&gt;1.7&lt;/a&gt; to allow users to specify what versions of Swift their apps support, using the &lt;code&gt;supports_swift_version&lt;/code&gt; DSL.&lt;/p&gt;

&lt;p&gt;If two different targets include the same dependency but require &lt;em&gt;different&lt;/em&gt; Swift versions, CocoaPods will now create multiple different targets for the same Pod to accommodate the different Swift versions used.&lt;/p&gt;

&lt;p&gt;Given the following Pod:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Pod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;         &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;CannonPodder&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;1.0.0&amp;#39;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# ...rest of attributes here&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;swift_versions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;4.0&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;5.0&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;and the following Podfile:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;SampleApp&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;supports_swift_version&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;lt; 5.0&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;CannonPodder&amp;#39;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;SecondApp&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;supports_swift_version&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;gt;= 5.0&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;CannonPodder&amp;#39;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Two different versions of the &lt;code&gt;CannonPodder&lt;/code&gt; target will be created.&lt;/p&gt;

&lt;p&gt;&lt;center&gt;
&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/CocoaPods-1.9.0/swift_variants.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/CocoaPods-1.9.0/swift_variants.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;This ensures the correct Swift version is used for each target that depends on the Pod.&lt;/p&gt;

&lt;h3 id=&quot;use_frameworks-linkage-customization&quot;&gt;&lt;code&gt;use_frameworks!&lt;/code&gt; Linkage Customization&lt;/h3&gt;

&lt;p&gt;iOS 8.0 introduced the ability for apps to ship dynamically linked frameworks. To support this, CocoaPods introduced the &lt;code&gt;use_frameworks!&lt;/code&gt; DSL which made all Pods be compiled as dynamically-linked frameworks. Frameworks do not have any inherent &lt;em&gt;linkage&lt;/em&gt;, but Swift initially required dynamic linking to be used in iOS apps. It is possible to wrap a statically-linked library in a &lt;code&gt;.framework&lt;/code&gt; bundle.&lt;/p&gt;

&lt;p&gt;Now that Swift supports static linking, CocoaPods has expanded this DSL to allow specifying the type of linkage preferred.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;use_frameworks!&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:linkage&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:static&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;This is the first step in providing more control to CocoaPods users over how Pods are packaged and linked into their dependent binaries. For more details, check out the &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/9099&quot;&gt;RFC&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;whats-next&quot;&gt;What&amp;#39;s Next&lt;/h3&gt;

&lt;p&gt;In future versions, we will continue to expand the customization points for how pods are integrated into projects.&lt;/p&gt;

&lt;p&gt;Thanks to all of our contributors who helped make this release happen!&lt;/p&gt;

&lt;p&gt;Checkout the &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/releases/tag/1.9.0.beta.1&quot;&gt;changelog&lt;/a&gt; to see the full list of changes.&lt;/p&gt;
</description>
    <pubDate>Mon, 16 Dec 2019 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-1.9.0-beta</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-1.9.0-beta</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 1.8 Beta is Here!</title>
    <description>&lt;p&gt;&lt;em&gt;CocoaPods 1.8&lt;/em&gt; switches the CDN as the default spec repo source and comes with a few enhancements!&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h3 id=&quot;cdn-as-default&quot;&gt;CDN as Default&lt;/h3&gt;

&lt;p&gt;CDN support was first introduced in the &lt;a href=&quot;/CocoaPods-1.7.0-beta&quot;&gt;1.7 release&lt;/a&gt; and was finalized in &lt;a href=&quot;/CocoaPods-1.7.2&quot;&gt;1.7.2&lt;/a&gt;. It aims to speed up initial setup and dependency analysis dramatically. With 1.8, CocoaPods &lt;em&gt;no longer&lt;/em&gt; requires cloning the now huge &lt;a href=&quot;https://github.com/CocoaPods/Specs&quot;&gt;master specs repo&lt;/a&gt; in order to function and users may integrate their projects with CocoaPods almost instantly.&lt;/p&gt;

&lt;p&gt;Here&amp;#39;s video demonstration of integrating and building an iOS project with a fresh install of CocoaPods 1.8 in &lt;em&gt;less than a minute&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;center&gt;
  &lt;video width=&quot;640&quot; height=&quot;400&quot; controls&gt;
    &lt;source src=&quot;/assets/blog_img/CocoaPods-1.8.0/cocoapods-cdn-video.mp4&quot; type=&quot;video/mp4&quot;&gt;
  &lt;/video&gt;
&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;You may safely delete the &lt;a href=&quot;https://github.com/CocoaPods/Specs&quot;&gt;master specs repo&lt;/a&gt; with the following steps:&lt;/p&gt;

&lt;p&gt;First, edit your &lt;code&gt;Podfile&lt;/code&gt; to set the CDN as the primary source:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;diff language-diff&quot; data-lang=&quot;diff&quot;&gt;&lt;span class=&quot;gd&quot;&gt;- source &amp;#39;https://github.com/CocoaPods/Specs.git&amp;#39;&lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+ source &amp;#39;https://cdn.cocoapods.org/&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Afterwards, run the following command to remove it from your managed repo list:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;pod repo remove master
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: If you wish to continue using the &lt;code&gt;git&lt;/code&gt; based source then you must ensure it is &lt;em&gt;explicitly&lt;/em&gt; specified in your &lt;code&gt;Podfile&lt;/code&gt; via the &lt;code&gt;source&lt;/code&gt; DSL, otherwise CocoaPods will automatically use CDN for dependency resolution.&lt;/p&gt;

&lt;p&gt;And that&amp;#39;s it! For more information regarding CDN, please read our previous blog post &lt;a href=&quot;/CocoaPods-1.7.2&quot;&gt;here&lt;/a&gt;!&lt;/p&gt;

&lt;h3 id=&quot;info_plist-podspec-dsl&quot;&gt;&lt;code&gt;info_plist&lt;/code&gt; Podspec DSL&lt;/h3&gt;

&lt;p&gt;CocoaPods automatically generates &lt;code&gt;Info.plist&lt;/code&gt; files for pods, app specs and test specs when appropriate, such as when a &lt;code&gt;Podfile&lt;/code&gt; requires dynamic frameworks by specifying the &lt;code&gt;use_frameworks!&lt;/code&gt; option.&lt;/p&gt;

&lt;p&gt;Podspecs now support modifying the contents of their generated &lt;code&gt;Info.plist&lt;/code&gt; files via the &lt;code&gt;info_plist&lt;/code&gt; DSL. While we anticipate this will be most often used to modify the bundle identifier of a framework, any key-value pair can be included. The values specified will overwrite any default values that are included by CocoaPods.&lt;/p&gt;

&lt;p&gt;Here&amp;#39;s an example:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Pod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;         &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;NetworkingLib&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;1.0.0&amp;#39;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# ...rest of attributes here&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;info_plist&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;&amp;#39;CFBundleIdentifier&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;com.awesomecompany.networking&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;&amp;#39;SERVER_URL&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;https://example.com/api&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;With app specs introduced in &lt;a href=&quot;/CocoaPods-1.7.0-beta&quot;&gt;1.7&lt;/a&gt;, pod authors were able to describe an application, such as a demo app, for their pods. The new &lt;code&gt;info_plist&lt;/code&gt; DSL enhances the functionality of app specs even further by allowing podspecs to customize the generated &lt;code&gt;Info.plist&lt;/code&gt;, which contains important settings such as the bundle identifier, iOS security and privacy settings, device orientation support, and more.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Pod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;         &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ToastLib&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;1.0.0&amp;#39;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# ...rest of attributes here&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app_spec&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ToastCatalog&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;app_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;info_plist&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;s1&quot;&gt;&amp;#39;CFBundleIdentifier&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;com.bakery.ToastCatalog&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;s1&quot;&gt;&amp;#39;UISupportedInterfaceOrientations&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&amp;#39;UIInterfaceOrientationPortrait&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&amp;#39;UIInterfaceOrientationLandscapeLeft&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&amp;#39;UIInterfaceOrientationLandscapeRight&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;s1&quot;&gt;&amp;#39;UILaunchStoryboardName&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;LaunchScreen&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;s1&quot;&gt;&amp;#39;UIMainStoryboardFile&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;AppStoryboard&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;s1&quot;&gt;&amp;#39;NSLocationWhenInUseUsageDescription&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ToastCatalog uses your location to find nearby Toast!&amp;#39;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;It&amp;#39;s important to note that the &lt;code&gt;info_plist&lt;/code&gt; attribute will have &lt;em&gt;no&lt;/em&gt; effect in situations where an &lt;code&gt;Info.plist&lt;/code&gt; file is not generated, such as when pods are integrated as static libraries. If your library requires data that&amp;#39;s included in the &lt;code&gt;Info.plist&lt;/code&gt; to always be present, we recommend including it as a resource instead.&lt;/p&gt;

&lt;p&gt;For more details on how this works and the rational behind it, check out the RFC &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/8753&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;project_name-podfile-dsl&quot;&gt;&lt;code&gt;project_name&lt;/code&gt; Podfile DSL&lt;/h3&gt;

&lt;p&gt;CocoaPods &lt;a href=&quot;/CocoaPods-1.7.0-beta&quot;&gt;1.7&lt;/a&gt; introduced the &lt;a href=&quot;https://guides.cocoapods.org/syntax/podfile.html#install_bang&quot;&gt;&lt;code&gt;generate_multiple_pod_projects&lt;/code&gt;&lt;/a&gt; option that installs each pod into its own Xcode project. CocoaPods 1.8 expands further by introducing the &lt;code&gt;project_name&lt;/code&gt; DSL that allows pod consumers to specify the project name to integrate a given pod.&lt;/p&gt;

&lt;p&gt;This opens up plenty of new possibilities for consumers to &lt;em&gt;group&lt;/em&gt; certain pods together that make sense logically. Consider the following example:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;install!&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;cocoapods&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:generate_multiple_pod_projects&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;MyApp&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;use_frameworks!&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Moya&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:project_name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Networking&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Alamofire&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:project_name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Networking&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Result&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:project_name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Networking&amp;#39;&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;MyAppTests&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;inherit!&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:search_paths&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;OCMock&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:project_name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Testing&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Will produce the following result:&lt;/p&gt;

&lt;p&gt;&lt;center&gt;
&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/CocoaPods-1.8.0/project_name.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/CocoaPods-1.8.0/project_name.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;It is up to the consumers to choose their own grouping and provide helper methods in their &lt;code&gt;Podfile&lt;/code&gt; that automatically apply the project name to use. For example, another grouping idea is to group pods by their platform such as &lt;code&gt;iOS&lt;/code&gt; or &lt;code&gt;macOS&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The &lt;code&gt;project_name&lt;/code&gt; option currently requires the &lt;code&gt;generate_multiple_pod_projects&lt;/code&gt; installation option to &lt;em&gt;also&lt;/em&gt; be enabled in order for it to function. Incremental installation has also been updated to take into consideration the project name used for each pod and will continue to work as expected.&lt;/p&gt;

&lt;h3 id=&quot;test-spec-enhancements&quot;&gt;Test Spec Enhancements&lt;/h3&gt;

&lt;p&gt;Test specs have become an integral part of CocoaPods and a couple new features have been added.&lt;/p&gt;

&lt;h4 id=&quot;ui-test-bundle-support&quot;&gt;UI Test Bundle Support&lt;/h4&gt;

&lt;p&gt;Support for &amp;quot;UI Test Bundles&amp;quot; is now possible and you may now specify the &lt;code&gt;test_type&lt;/code&gt; to use for a given &lt;code&gt;test_spec&lt;/code&gt;. The default will be &lt;code&gt;:unit&lt;/code&gt; which would create a unit test bundle. Consider the following example of our favorite pod &lt;code&gt;CannonPodder&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Pod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;         &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;CannonPodder&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;1.0.0&amp;#39;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# ...rest of attributes here&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;UITests&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;requires_app_host&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test_type&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:ui&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source_files&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;UITests/**/*.swift&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;This will successfully integrate a &lt;code&gt;CannonPodder-UI-UITests&lt;/code&gt; UI test bundle upon installation and will automatically create an app host to be used for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: UI test bundles &lt;em&gt;require&lt;/em&gt; an app host in order to function, therefore you must always specify &lt;code&gt;requires_app_host&lt;/code&gt; should you choose to integrate a test spec as a UI test bundle.&lt;/p&gt;

&lt;h4 id=&quot;customizable-app-host&quot;&gt;Customizable App Host&lt;/h4&gt;

&lt;p&gt;For most cases, a generated app host for your test spec should be sufficient to execute your tests within it. However, there are cases in which pod authors may want to further customize the app host used for a &lt;code&gt;test_spec&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For example, pod authors may want to specify additional dependencies for their app host or resource bundles to use during testing. App specs are an excellent candidate for this since they provide most of the scaffolding and with 1.8 it is now possible to set an &lt;code&gt;app_spec&lt;/code&gt; as the app host for a &lt;code&gt;test_spec&lt;/code&gt; via the &lt;code&gt;app_host_name&lt;/code&gt; DSL.&lt;/p&gt;

&lt;p&gt;Here&amp;#39;s an example:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Pod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;         &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;CannonPodder&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;1.0.0&amp;#39;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# ...rest of attributes here&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app_spec&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;DemoApp&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;app_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source_files&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;DemoApp/**/*.swift&amp;#39;&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Dependency used only by this app spec.&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;app_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dependency&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Alamofire&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Tests&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;requires_app_host&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Use &amp;#39;DemoApp&amp;#39; as the app host.&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app_host_name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;CannonPodder/DemoApp&amp;#39;&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# ...rest of attributes here&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# This is required since &amp;#39;DemoApp&amp;#39; is specified as the app host.&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dependency&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;CannonPodder/DemoApp&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Will produce the following result:&lt;/p&gt;

&lt;p&gt;&lt;center&gt;
&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/CocoaPods-1.8.0/app_host_name.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/CocoaPods-1.8.0/app_host_name.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;This powerful new feature opens up new possibilities for pod authors who want much more granular control for the app host used for their test specs.&lt;/p&gt;

&lt;h3 id=&quot;whats-next&quot;&gt;What&amp;#39;s Next?&lt;/h3&gt;

&lt;p&gt;CocoaPods 1.8 is a &lt;em&gt;very&lt;/em&gt; exciting release, and we&amp;#39;re very happy for you to try it out, and recommend you upgrade:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;sh language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;gem install cocoapods --pre
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;For future versions, we continue to explore new ways to allow pod authors and pod consumers to configure integrating pods into their project, for example by specifying individual package or linkage settings. We have published a &lt;a href=&quot;https://docs.google.com/document/d/1lr2mHkwhNha5_0Wfa_pYL51MAxoro0LBxx_DUzuSu0Y/edit&quot;&gt;proposal&lt;/a&gt; that we are currently exploring and we welcome your comments!&lt;/p&gt;

&lt;p&gt;As always, we would like to thank all of our contributors for making this release a reality!&lt;/p&gt;

&lt;p&gt;Checkout the &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/releases/tag/1.8.0.beta.1&quot;&gt;changelog&lt;/a&gt; to get the full list of changes.&lt;/p&gt;

&lt;p&gt;🚀&lt;/p&gt;
</description>
    <pubDate>Mon, 05 Aug 2019 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-1.8.0-beta</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-1.8.0-beta</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 1.7.2 &#8212; Master Repo CDN is Finalized!</title>
    <description>&lt;p&gt;&lt;em&gt;CocoaPods 1.7.2&lt;/em&gt; brings with it the final version of CDN support for the &lt;a href=&quot;https://github.com/CocoaPods/Specs&quot;&gt;trunk specs repo&lt;/a&gt;. &lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;It&amp;#39;s been a tale of ridiculous scale, unintended consequences and free open-source plans. CocoaPods is moving to use a CDN which is located at &lt;a href=&quot;https://cdn.cocoapods.org/&quot;&gt;https://cdn.cocoapods.org/&lt;/a&gt; and is still considered experimental. A future release will make it the default spec source.&lt;/p&gt;

&lt;p&gt;A CDN is a Content Delivery Network - what this means for CocoaPods is that using CocoaPods won&amp;#39;t require you to have a local copy of all the public Podspecs on your computer. Saving you about a GB of file storage, and shaving a lot of time off &lt;code&gt;pod install&lt;/code&gt;s.&lt;/p&gt;

&lt;h3 id=&quot;scaling-when-free-and-open-source&quot;&gt;Scaling when free and open source&lt;/h3&gt;

&lt;p&gt;CocoaPods is a free, open-source project run by maintainers in their spare time. As such, it depends on the good graces and sponsorships of multiple tech companies. The initial decision was to store the specs in a GitHub repo, a common practice for a free, open-source project for storing such metadata. &lt;/p&gt;

&lt;p&gt;The first hurdles of scale were encountered in 2016, when traffic to the master spec repo has caused GitHub to &lt;a href=&quot;/Master-Spec-Repo-Rate-Limiting-Post-Mortem&quot;&gt;rate-limit all operations&lt;/a&gt;.&lt;br&gt;
A &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/4989#issuecomment-193772935&quot;&gt;comment from GitHub&lt;/a&gt; at the time stated that this repo alone was using 5 whole server CPUs and consuming terabytes upon terabytes of bandwidth.&lt;/p&gt;

&lt;p&gt;The crisis was averted by &lt;a href=&quot;/Sharding&quot;&gt;sharding the repo&lt;/a&gt; to improve algorithmic performance and by limiting all first-time clones to being shallow. &lt;/p&gt;

&lt;p&gt;This has solved GitHub&amp;#39;s problem, but CocoaPods&amp;#39; users still had to deal with unsatisfactory performance.&lt;/p&gt;

&lt;h3 id=&quot;git-as-a-database&quot;&gt;Git as a Database&lt;/h3&gt;

&lt;p&gt;Git was invented at a time when &amp;quot;slow network&amp;quot; and &amp;quot;no backups&amp;quot; were legitimate design concerns. Running endless builds as part of continuous integration wasn&amp;#39;t commonplace. CDN wasn&amp;#39;t so commonly available.&lt;/p&gt;

&lt;p&gt;There are many stories of git repos hitting the hard envelope of git&amp;#39;s design constraints. &lt;a href=&quot;https://devblogs.microsoft.com/bharry/the-largest-git-repo-on-the-planet/&quot;&gt;Microsoft&amp;#39;s Windows repo&lt;/a&gt; is one example. CocoaPods is another.&lt;/p&gt;

&lt;p&gt;At the time of writing, the spec repo had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;almost 400k commits - half of the Linux Kernel repo!&lt;/li&gt;
&lt;li&gt;over 400k directories&lt;/li&gt;
&lt;li&gt;over 300k spec files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These numbers have caused the repo to take minutes to clone, long times to update and have wasted uncountable CI time. It has also proven to be resistant to tarballing, as this sort of directory structure hits a bottleneck in &lt;code&gt;tar&lt;/code&gt; as well. &lt;/p&gt;

&lt;h3 id=&quot;directory-listing-denied&quot;&gt;Directory Listing Denied&lt;/h3&gt;

&lt;p&gt;It was obvious to many that the spec repo should be put behind a CDN, but there were several constraints:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It had to be a free CDN, as the project is free and open-source.&lt;/li&gt;
&lt;li&gt;It had to allow some way of obtaining directory listings, for retrieving versions of pods.&lt;/li&gt;
&lt;li&gt;It had to auto-update from GitHub as the source of truth.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;a href=&quot;https://github.com/CocoaPods/Core/pull/469&quot;&gt;first implementation&lt;/a&gt; was a shell script, polling GitHub and piping &lt;code&gt;find&lt;/code&gt; into &lt;code&gt;ls&lt;/code&gt; into index files. This ran on a machine that was not open or free and therefore could not be the true solution. Nevertheless, this auto-updated repo was put behind a &lt;a href=&quot;https://www.jsdelivr.com&quot;&gt;jsDelivr CDN&lt;/a&gt; and the client interfacing with it was released in &lt;a href=&quot;/CocoaPods-1.7.0-beta#cdn-support&quot;&gt;1.7.0&lt;/a&gt; labeled &amp;quot;highly experimental&amp;quot;.&lt;/p&gt;

&lt;h3 id=&quot;final-lap-with-netlify&quot;&gt;Final Lap with Netlify&lt;/h3&gt;

&lt;p&gt;The &lt;a href=&quot;https://github.com/CocoaPods/Core/pull/541&quot;&gt;final version&lt;/a&gt; of the CDN for CocoaPods/Specs was implemented on &lt;a href=&quot;https://www.netlify.com&quot;&gt;Netlify&lt;/a&gt;, a static site hosting service supporting flexible site generation. This solution ticked all the boxes: a generous open-source plan, fast CDN and continuous deployment from GitHub.&lt;/p&gt;

&lt;p&gt;Upon each commit, Netlify runs a &lt;a href=&quot;https://github.com/CocoaPods/Specs/tree/master/Scripts&quot;&gt;specialized script&lt;/a&gt; which generates a per-shard index for all the pods and versions in the repo. If you&amp;#39;ve ever noticed that the directory structure for our Podspecs repo was strange, this is what we call sharding. An example of a shard index can be found at &lt;a href=&quot;https://cdn.cocoapods.org/all_pods_versions_2_2_2.txt&quot;&gt;https://cdn.cocoapods.org/all_pods_versions_2_2_2.txt&lt;/a&gt;. This would correspond to &lt;code&gt;~/.cocoapods/repos/master/Specs/2/2/2/&lt;/code&gt; locally. &lt;/p&gt;

&lt;p&gt;Additionally, we create an &lt;code&gt;all_pods.txt&lt;/code&gt; file which contains a list of all pods.  &lt;/p&gt;

&lt;p&gt;Finally, any other request made is redirected to GitHub&amp;#39;s CDN.&lt;/p&gt;

&lt;h3 id=&quot;usage&quot;&gt;Usage&lt;/h3&gt;

&lt;p&gt;Using the CDN for retrieving specs, while &amp;quot;finalized&amp;quot;, should still be considered experimental until we switch it to be default.&lt;/p&gt;

&lt;p&gt;To use the CDN source in your &lt;code&gt;Podfile&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;If you don&amp;#39;t have private specs:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;https://cdn.cocoapods.org/&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;If you have private specs:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;diff language-diff&quot; data-lang=&quot;diff&quot;&gt;source &amp;#39;https://github.com/artsy/Specs.git&amp;#39;
&lt;span class=&quot;gd&quot;&gt;- source &amp;#39;https://github.com/CocoaPods/Specs.git&amp;#39;&lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+ source &amp;#39;https://cdn.cocoapods.org/&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Doing this will break your &lt;code&gt;Podfile.lock&lt;/code&gt;, so you are likely to need to run &lt;code&gt;pod update&lt;/code&gt; to see the changes (be careful, this may update your Pods also).&lt;/p&gt;

&lt;p&gt;If you have a CI setup, it is recommended to cache the new repo dir as it is very small and would save even more time. With 1.7.2 it should be located at &lt;code&gt;~/.cocoapods/repos/cocoapods-&lt;/code&gt; (yes, with a &lt;code&gt;-&lt;/code&gt;), but we&amp;#39;re looking to improve the naming in an upcoming release.&lt;/p&gt;

&lt;p&gt;In an upcoming release, we are planning to make the CDN source the default source!&lt;/p&gt;

&lt;p&gt;P.S. Thanks to &lt;a href=&quot;https://twitter.com/dnkoutso&quot;&gt;@dnkoutso&lt;/a&gt; for all the release work!&lt;/p&gt;

&lt;p&gt;🚀&lt;/p&gt;
</description>
    <pubDate>Fri, 14 Jun 2019 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-1.7.2</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-1.7.2</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 1.7.0 Beta!</title>
    <description>&lt;p&gt;&lt;em&gt;CocoaPods 1.7.0&lt;/em&gt; expands heavily on the improved underlying infrastructure of prior releases with support for multiple Swift versions, app specs and more!&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;This is a huge release which contains a variety of new features to help propel CocoaPods forward.&lt;/p&gt;

&lt;p&gt;Let&amp;#39;s jump right in!&lt;/p&gt;

&lt;h3 id=&quot;support-for-multiple-swift-versions&quot;&gt;Support For Multiple Swift Versions&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;swift_version&lt;/code&gt; DSL that was first introduced in &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/releases/tag/1.4.0&quot;&gt;CocoaPods 1.4.0&lt;/a&gt; has now been expanded to support multiple Swift versions. This helps pod authors and gives consumers more flexibility when it comes to choosing which version of Swift to use when consuming a pod.&lt;/p&gt;

&lt;p&gt;Pod authors can now transcribe that information into their &lt;code&gt;podspec&lt;/code&gt; by simply specifying the additional Swift versions within the &lt;code&gt;swift_versions&lt;/code&gt; DSL.&lt;/p&gt;

&lt;p&gt;Here&amp;#39;s an example &lt;code&gt;podspec&lt;/code&gt; that specifies additional Swift versions it supports:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Pod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;CoconutLib&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;1.0&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# ... rest of root spec entries go here&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;swift_versions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;3.2&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;4.0&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;4.2&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Unless or otherwise specified by the consumer of the &lt;code&gt;CoconutLib&lt;/code&gt; pod, CocoaPods will automatically select the &lt;em&gt;latest&lt;/em&gt; version of Swift during installation which in this example will be &lt;code&gt;4.2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;However, there are many cases in which consumers of a pod might be unable to use the latest Swift version, perhaps because their toolchain does not support it yet. For example, a project that is using an older version of Xcode that does not support Swift 4 will be unable to integrate the &lt;code&gt;CoconutLib&lt;/code&gt; pod and would end up with a compilation error. To solve this, CocoaPods 1.7.0 provides the ability to specify Swift version requirements through the new &lt;code&gt;supports_swift_versions&lt;/code&gt; DSL for each target that is integrated within the &lt;code&gt;Podfile&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;MyApp&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;supports_swift_versions&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;gt;= 3.0&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;lt; 4.0&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;CoconutLib&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;~&amp;gt; 1.0&amp;#39;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;The above configuration will successfully integrate &lt;code&gt;CoconutLib&lt;/code&gt; pod and use Swift &lt;code&gt;3.2&lt;/code&gt; as the version to compile it with. This is because it is the only version satisfied by the requirements specified in the &lt;code&gt;MyApp&lt;/code&gt; target definition and by the list of supported versions of Swift declared within the &lt;code&gt;CoconutLib&lt;/code&gt; &lt;code&gt;podspec&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The &lt;code&gt;supports_swift_versions&lt;/code&gt; DSL can also be declared at the root level of a &lt;code&gt;Podfile&lt;/code&gt; in which case it will apply to all targets within the &lt;code&gt;Podfile&lt;/code&gt;. Furthermore, nested targets (such as test targets) will inherit their Swift requirements from their parent unless they explicitly specify their own Swift version requirements.&lt;/p&gt;

&lt;p&gt;There are many other edge cases that can occur when choosing which Swift version to use. We encourage you to read through the &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/8191&quot;&gt;proposal&lt;/a&gt; for this change to find out more!&lt;/p&gt;

&lt;h4 id=&quot;linting-and-validation&quot;&gt;Linting And Validation&lt;/h4&gt;

&lt;p&gt;It is generally difficult for pod authors to maintain infrastructure to support multiple (primarily older) versions of Swift, therefore, during &lt;code&gt;lint&lt;/code&gt; CocoaPods will choose the &lt;em&gt;latest&lt;/em&gt; version of Swift during validation.&lt;/p&gt;

&lt;p&gt;For pod authors who &lt;em&gt;do&lt;/em&gt; have the infrastructure (such as a CI system) that ensures their pod works with older versions of Swift, the &lt;code&gt;--swift-version&lt;/code&gt; parameter should be used during &lt;code&gt;lint&lt;/code&gt; to override the default behavior.&lt;/p&gt;

&lt;h4 id=&quot;deprecating-swift-version-file&quot;&gt;Deprecating &lt;code&gt;.swift-version&lt;/code&gt; File&lt;/h4&gt;

&lt;p&gt;Up until now, most pod authors have been relying on specifying a &lt;code&gt;.swift-version&lt;/code&gt; file at the root of their repo in order to successfully publish their pod with the Swift version they officially support. However, this information is &lt;em&gt;never&lt;/em&gt; transcribed within the published &lt;code&gt;podspec&lt;/code&gt; and therefore during integration none of it is taken into consideration when choosing which Swift version to use.&lt;/p&gt;

&lt;p&gt;This can cause numerous issues especially when a new version of Swift is released. This is because a consumer will automatically pick the latest version of Swift to use without the pod author officially claiming that it is supported.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We strongly recommend pod authors to migrate over to use the officially supported &lt;code&gt;swift_version&lt;/code&gt; DSL within their &lt;code&gt;podspec&lt;/code&gt; instead.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We also recommend deleting the &lt;code&gt;.swift-version&lt;/code&gt; file in your repo unless you use it for other tools such as &lt;code&gt;swiftenv&lt;/code&gt;. The &lt;code&gt;swift_version&lt;/code&gt; DSL will always take precedence over the &lt;code&gt;.swift-version&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;Finally, a warning will be displayed during &lt;code&gt;lint&lt;/code&gt; that encourages pod authors to migrate away from using the &lt;code&gt;.swift-version&lt;/code&gt; file and in a future major release of CocoaPods we plan to completely remove support for it.&lt;/p&gt;

&lt;h3 id=&quot;app-specs&quot;&gt;App Specs&lt;/h3&gt;

&lt;p&gt;With the recently introduced &lt;a href=&quot;/CocoaPods-1.3.0&quot;&gt;test specs&lt;/a&gt; we were able to build a platform for us to expand on and introduce different types of specifications that can be provided by a pod author. With 1.7.0, we are introducing &lt;em&gt;app specs&lt;/em&gt; which allow pod authors to describe an application from within their &lt;code&gt;podspec&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;App specs can help pod authors in various ways, for example, they can be used to ship a sample app alongside their pod as a tutorial on how consumers can integrate it to their own respective app.&lt;/p&gt;

&lt;p&gt;App specs progress forward the concept of &amp;#39;Isolated Development&amp;#39; in which a &lt;code&gt;podspec&lt;/code&gt; can be used as the single piece of information needed to generate an entire (throwable) workspace to develop on.&lt;/p&gt;

&lt;p&gt;Here&amp;#39;s an example of an app spec declaration:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Pod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;         &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;CoconutLib&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;1.0&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;authors&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Coconut Corp&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Monkey Boy&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;monkey@coconut-corp.local&amp;#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;homepage&lt;/span&gt;     &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;http://coconut-corp.local/coconut-lib.html&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;summary&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Coconuts For the Win.&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;description&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;All the Coconuts&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt;       &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:git&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;http://coconut-corp.local/coconut-lib.git&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:tag&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;v1.0&amp;#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;license&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;ss&quot;&gt;:type&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;MIT&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;ss&quot;&gt;:file&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;LICENSE&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;ss&quot;&gt;:text&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Permission is hereby granted ...&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source_files&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Sources/*.swift&amp;#39;&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app_spec&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;SampleApp&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;app_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source_files&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Sample/*.swift&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;  
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;App specs can leverage the majority of the CocoaPods spec DSL to declare dependencies, build configuration settings, etc. &lt;/p&gt;

&lt;p&gt;By default, app specs are not automatically integrated to a project that is consuming the pod. If you wish to do so you can specify this in your &lt;code&gt;Podfile&lt;/code&gt;, similar to test specs:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt; &lt;span class=&quot;n&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;MyApp&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;use_frameworks!&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;CoconutLib&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;~&amp;gt; 1.0&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:appspecs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;SampleApp&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
 &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;We hope in the future to promote app specs to a top-level concept in which consumer applications are described as an app spec completely eliminating the need of maintaining an &lt;code&gt;.xcodeproj&lt;/code&gt; in order to integrate with CocoaPods.&lt;/p&gt;

&lt;h3 id=&quot;multiple-xcodeproj-generation&quot;&gt;Multiple Xcodeproj Generation&lt;/h3&gt;

&lt;p&gt;Historically, CocoaPods has always generated a single &lt;code&gt;Pods.xcodeproj&lt;/code&gt; that contains all the required targets and build settings for your project to compile. Using just one project that incorporates your entire &lt;code&gt;Podfile&lt;/code&gt; works just fine for smaller projects; however, as your project grows, so will the size of your &lt;code&gt;Pods.xcodeproj&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;The larger the &lt;code&gt;Pods.xcodeproj&lt;/code&gt; file, the longer Xcode has to spend parsing its contents, which we have discovered leads to a degraded Xcode experience. Instead of putting all of your targets into one monolithic Xcode project, we’ve noticed some considerable performance improvements for larger CocoaPods projects by integrating each pod as its own &lt;em&gt;separate&lt;/em&gt; Xcode project and nested under the top-level &lt;code&gt;Pods.xcodeproj&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Additionally, in large codebases this feature can prove particularly useful as developers may opt-in to open only the specific &lt;code&gt;.xcodeproj&lt;/code&gt; they need to work on (found under the &lt;code&gt;Pods/&lt;/code&gt; directory) instead of opening the full workspace which can slow down their development process.&lt;/p&gt;

&lt;p&gt;Whether performance is a problem, or you just prefer setting up your workspace using multiple Xcode projects, CocoaPods now supports this setting using the &lt;code&gt;generate_multiple_pod_projects&lt;/code&gt; installation option.&lt;/p&gt;

&lt;p&gt;You can enable this in your &lt;code&gt;Podfile&lt;/code&gt; like so:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;install!&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;cocoapods&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:generate_multiple_pod_projects&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;By default, this option is turned off, but we encourage you to try it out and report any issues you find to us. We expect that going forward in a future major version update to CocoaPods this becomes the default option when it comes to workspace generation.&lt;/p&gt;

&lt;p&gt;Here&amp;#39;s how it looks:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Without multi-xcodeproj (default)&lt;/em&gt;:
&lt;center&gt;
&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/CocoaPods-1.7.0/no-multi-xcodeproj.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/CocoaPods-1.7.0/no-multi-xcodeproj.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;With multi-xcodeproj&lt;/em&gt;:
&lt;center&gt;
&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/CocoaPods-1.7.0/multi-xcodeproj.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/CocoaPods-1.7.0/multi-xcodeproj.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Warning&lt;/strong&gt;: Switching your project to use multiple &lt;code&gt;.xcodeproj&lt;/code&gt; may result in some compiler errors if your pods have relied on importing headers using the quote syntax for its dependencies. For example &lt;code&gt;#import &amp;quot;PDDebugger.h&amp;quot;&lt;/code&gt; will no longer work in a pod that depends on &lt;code&gt;PonyDebugger&lt;/code&gt;. Instead, we highly suggest you update your headers to correctly import the framework and its associated header: &lt;code&gt;#import &amp;lt;PonyDebugger/PDDebugger.h&amp;gt;&lt;/code&gt;. This is intentional since this feature is currently opt-in.&lt;/p&gt;

&lt;h3 id=&quot;incremental-installation&quot;&gt;Incremental Installation&lt;/h3&gt;

&lt;p&gt;Instead of regenerating your entire workspace every time you run &lt;code&gt;pod install&lt;/code&gt;, CocoaPods now supports only regenerating the pod targets that have changed since your previous installation. Depending on the size of your project, this can save anywhere from a couple seconds to &lt;em&gt;minutes&lt;/em&gt; off every &lt;code&gt;pod install&lt;/code&gt; invocation.&lt;/p&gt;

&lt;p&gt;You can enable this in your &lt;code&gt;Podfile&lt;/code&gt; with the installation option &lt;code&gt;incremental_installation&lt;/code&gt; like so:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;install!&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;cocoapods&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
         &lt;span class=&quot;ss&quot;&gt;:generate_multiple_pod_projects&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
         &lt;span class=&quot;ss&quot;&gt;:incremental_installation&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The &lt;code&gt;incremental_installation&lt;/code&gt; option currently requires the &lt;code&gt;generate_multiple_pod_projects&lt;/code&gt; installation option to also be enabled in order for it to function.&lt;/p&gt;

&lt;h3 id=&quot;scheme-dsl&quot;&gt;&lt;code&gt;scheme&lt;/code&gt; DSL&lt;/h3&gt;

&lt;p&gt;Pod authors are now able to customize the generated scheme for their specs, test specs and the newly released app specs. For now, support for specifying environment variables as well as launch arguments is included and it can be easily expanded in the future.&lt;/p&gt;

&lt;p&gt;Here&amp;#39;s an example:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Pod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;CoconutLib&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;1.0&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# ... rest of root spec entries go here&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Tests&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source_files&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Tests/**/*.swift&amp;#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scheme&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; 
      &lt;span class=&quot;ss&quot;&gt;:launch_arguments&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;Arg1&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Arg2&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
      &lt;span class=&quot;ss&quot;&gt;:environment_variables&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Key1&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Val1&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;   
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;The above will example with produce the following scheme for the test spec &lt;code&gt;Tests&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;center&gt;
&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/CocoaPods-1.7.0/scheme_config.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/CocoaPods-1.7.0/scheme_config.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: You may opt to configure a scheme for a specific platform. For example, &lt;code&gt;test_spec.ios.scheme&lt;/code&gt; will only configure the scheme for iOS targets.&lt;/p&gt;

&lt;h3 id=&quot;xcfilelist-support&quot;&gt;&lt;code&gt;.xcfilelist&lt;/code&gt; Support&lt;/h3&gt;

&lt;p&gt;In CocoaPods 1.7.0 script phases now support usage of &lt;code&gt;.xcfilelist&lt;/code&gt; in order to specify script input and output paths. CocoaPods will automatically detect whether the Xcode project being integrated supports &lt;code&gt;.xcfilelist&lt;/code&gt; and prefer that over separate input/output path entries.&lt;/p&gt;

&lt;p&gt;This reduces the amount of footprint CocoaPods has into the user project but also leverages the ability to use different input/output paths per configuration (e.g. &amp;#39;Debug&amp;#39; vs &amp;#39;Release&amp;#39;).&lt;/p&gt;

&lt;h3 id=&quot;experimental-features&quot;&gt;Experimental Features&lt;/h3&gt;

&lt;p&gt;Along with 1.7.0 we are shipping a couple of exciting and important experimental features!&lt;/p&gt;

&lt;h4 id=&quot;cdn-support-for-the-master-specs-repo&quot;&gt;&lt;a name=&quot;cdn-support&quot;&gt;&lt;/a&gt;CDN Support For The &lt;a href=&quot;https://github.com/CocoaPods/Specs&quot;&gt;Master Specs Repo&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;The &lt;a href=&quot;https://github.com/CocoaPods/Specs&quot;&gt;master specs repo&lt;/a&gt; is crucial to the functionality of CocoaPods, however, over the years its size has grown dramatically making it the number one difficulty to onboard with CocoaPods.&lt;/p&gt;

&lt;p&gt;This is especially true for folks with a slow internet connection since cloning the repo and its entire history becomes almost impossible. Additionally, CI systems are also slowed down dramatically for first time setup since again cloning can take a long time.&lt;/p&gt;

&lt;p&gt;In 1.7.0 we are experimenting with CDN support to avoid cloning the &lt;a href=&quot;https://github.com/CocoaPods/Specs&quot;&gt;master specs repo&lt;/a&gt; on your local machine (or CI) in order to use CocoaPods. This can be enabled by doing replacing the &lt;code&gt;source&lt;/code&gt; of the &lt;a href=&quot;https://github.com/CocoaPods/Specs&quot;&gt;master specs repo&lt;/a&gt; declaration in your &lt;code&gt;Podfile&lt;/code&gt; with:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;c1&quot;&gt;# source &amp;#39;https://github.com/CocoaPods/Specs&amp;#39; comment or remove this line.&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;https://cdn.jsdelivr.net/cocoa/&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Optionally, you may delete the existing &lt;code&gt;git&lt;/code&gt; based repo by running &lt;code&gt;pod repo remove master&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We are expecting either the syntax or the server structure to change again with 1.8.0, and so in adopting this feature in 1.7.0 you should be expecting to have to make changes in the future to keep this working. We don&amp;#39;t intend to support the 1.7.0 version outside of 1.7.x releases.&lt;/p&gt;

&lt;p&gt;We would like to thank &lt;a href=&quot;https://www.jsdelivr.com&quot;&gt;jsDelivr&lt;/a&gt; for their support and help to make this work! For now, we currently plan to maintain both ways of consuming the &lt;a href=&quot;https://github.com/CocoaPods/Specs&quot;&gt;master specs repo&lt;/a&gt; but we strongly encourage you to switch as it is much faster to get started with CocoaPods.&lt;/p&gt;

&lt;p&gt;Depending on the results and stability, we hope that starting with 1.7.0, CocoaPods will no longer require users to clone the &lt;a href=&quot;https://github.com/CocoaPods/Specs&quot;&gt;master specs repo&lt;/a&gt; in order to get started.&lt;/p&gt;

&lt;h4 id=&quot;windows-support&quot;&gt;Windows Support&lt;/h4&gt;

&lt;p&gt;Starting with 1.7.0, we&amp;#39;ve added support for Windows! We encourage Windows users to use CocoaPods and &lt;a href=&quot;https://github.com/cocoapods/cocoapods/issues&quot;&gt;report any issues&lt;/a&gt; to us going forward.&lt;/p&gt;

&lt;h3 id=&quot;whats-next&quot;&gt;What&amp;#39;s Next?&lt;/h3&gt;

&lt;p&gt;CocoaPods 1.7.0 is a very exciting release, and we&amp;#39;re very happy for you to try it out, and recommend you upgrade:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;sh language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;gem install cocoapods --pre
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;For future versions, we hope to substantially improve the integration story of CocoaPods.&lt;/p&gt;

&lt;p&gt;Currently, consumers of pods are limited to an all-or-nothing approach to integrate their project by forcing them to make a choice on whether to use dynamic frameworks everywhere or static libraries everywhere via the &lt;code&gt;use_frameworks!&lt;/code&gt; option.&lt;/p&gt;

&lt;p&gt;On the other hand, pod authors are &lt;em&gt;also&lt;/em&gt; very limited for the options in which they can specify how their pod should be packaged and linked to the consumer target and have to ensure their pod can compile across different permutations of package and link styles. We are in the early stages of planning on how we can improve this further and give both pod authors and consumers better choices.&lt;/p&gt;

&lt;p&gt;As always, we would like to thank all of our contributors for making this release a reality!&lt;/p&gt;

&lt;p&gt;Checkout the &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/releases/tag/1.7.0.beta.1&quot;&gt;changelog&lt;/a&gt; to get the full list of changes.&lt;/p&gt;

&lt;p&gt;🚀&lt;/p&gt;
</description>
    <pubDate>Fri, 22 Feb 2019 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-1.7.0-beta</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-1.7.0-beta</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 1.6.0 Beta Begins!</title>
    <description>&lt;p&gt;&lt;em&gt;CocoaPods 1.6.0&lt;/em&gt; release continues our focus on stability, performance and scalability for large projects.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;We are happy to announce that the first beta of 1.6.0 is now available! In this release, we revamped the build settings generation process to be faster and easier to maintain going forward. We&amp;#39;ve also enhanced the integration of multiple test specs in the same pod.&lt;/p&gt;

&lt;h3 id=&quot;revamped-build-settings&quot;&gt;Revamped Build Settings&lt;/h3&gt;

&lt;p&gt;The generation of build settings (which reside within the &lt;code&gt;.xcconfig&lt;/code&gt; files CocoaPods generates) has been completely rewritten. The primary goal for this rewrite was to clean up the code and make it scale much better on large projects. &lt;/p&gt;

&lt;p&gt;When contributors to CocoaPods make build setting changes it would often cause a cascading amount of performance regressions and trigger an unusual combination of edge cases. This made it very hard to test these changes and verify that each fix works correctly for everyone.&lt;/p&gt;

&lt;p&gt;From a user point of view, this rewrite should have zero effects when you compile your code. If there is anything that does not look right please file an &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/new&quot;&gt;issue&lt;/a&gt; providing steps and include a sample app that demonstrates the problem.&lt;/p&gt;

&lt;p&gt;To demonstrate the results of this rewrite we worked closely with our friends at LinkedIn, who use CocoaPods on a large project. The rewrite, along with some other performance improvements, have decreased &lt;code&gt;pod install&lt;/code&gt; time down to approximately 40 seconds from the original time of 3 minutes or &lt;strong&gt;77% faster&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This change, while mostly invisible, helps guarantee that CocoaPods will scale with your app as it grows. We really want to thank the folks at LinkedIn for their contributions to CocoaPods as well as their time spent to improve this.&lt;/p&gt;

&lt;h3 id=&quot;enhanced-test-spec-integration&quot;&gt;Enhanced Test Spec Integration&lt;/h3&gt;

&lt;p&gt;Test specs are becoming a fundamental piece of CocoaPods for pod authors. The ability to specify your test sources and have them execute through &lt;code&gt;lint&lt;/code&gt; make this feature an invaluable tool and allow to make the &lt;code&gt;podspec&lt;/code&gt; file be the source of truth for your library. Starting with 1.6.0, multiple &lt;code&gt;test_spec&lt;/code&gt; entries will no longer generate a single test bundle target but instead generate a unit test bundle for each one.&lt;/p&gt;

&lt;p&gt;Let&amp;#39;s use the following as an example:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Pod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# ... rest of root spec entries go here&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Unit Test Sources - Those do not require an app host to run. &lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# They also require &amp;#39;OCMock&amp;#39; dependency.&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Tests&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source_files&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Tests/**/*.{h,m}&amp;#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dependency&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;OCMock&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# SnapShot Tests Sources - Those *do* require an app host to run.&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;SnapshotTests&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;requires_app_host&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source_files&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;SnapshotTests/**/*.{h,m}&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Both the &amp;#39;Tests&amp;#39; and &amp;#39;SnapshotTests&amp;#39; test specs would &lt;em&gt;merge&lt;/em&gt; into a single unit test bundle target. This also had the unwanted effect of using an app host for the &amp;#39;Tests&amp;#39; test spec without explicitly having been declared by the pod author.&lt;/p&gt;

&lt;p&gt;It looked like this:&lt;/p&gt;

&lt;p&gt;&lt;center&gt;
&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/CocoaPods-1.6.0-beta/test_specs_before.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/CocoaPods-1.6.0-beta/test_specs_before.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;This means it&amp;#39;s impossible for pod authors to split their test sources and categorize them in different ways, for example using a different set of dependencies, resources, or compiler options.&lt;/p&gt;

&lt;p&gt;With 1.6.0, this will now generate the following:&lt;/p&gt;

&lt;p&gt;&lt;center&gt;
&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/CocoaPods-1.6.0-beta/test_specs_after.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/CocoaPods-1.6.0-beta/test_specs_after.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;Much better!&lt;/p&gt;

&lt;p&gt;We &lt;em&gt;strongly&lt;/em&gt; support the idea of having tests for your code and we aim to build the right tools for supporting this with CocoaPods. Having your &lt;code&gt;podspec&lt;/code&gt; be the source of truth and coupled with recently released &lt;a href=&quot;https://github.com/square/cocoapods-generate&quot;&gt;cocoapods-generate&lt;/a&gt; plugin your developer experience can be much improved and streamlined.&lt;/p&gt;

&lt;h3 id=&quot;longer-beta-cycle&quot;&gt;Longer Beta Cycle&lt;/h3&gt;

&lt;p&gt;We intentionally do not commit on specific release dates for CocoaPods. This is primarily due to the fact that CocoaPods is maintained and improved by the free time of multiple people across the world. Making such commitments would be tough to meet and most likely disappoint everyone.&lt;/p&gt;

&lt;p&gt;The 1.6.0 release will run through a longer beta cycle and will carry the &amp;#39;beta&amp;#39; name for some time before it&amp;#39;s stable. We encourage you to use the 1.6.0 beta and help us by submitting any issues you find.&lt;/p&gt;

&lt;p&gt;To install it use:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;sh language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;gem install cocoapods --pre
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h3 id=&quot;whats-next&quot;&gt;What&amp;#39;s Next?&lt;/h3&gt;

&lt;p&gt;We always like to use this last bit of the blog post as an opportunity to express what we have in mind for the next release (currently aimed to be 1.7.0). More particularly, we would like to extend the &lt;code&gt;swift_version&lt;/code&gt; DSL to support a range of Swift versions instead of just a single version similarly to &lt;a href=&quot;https://swift.org/package-manager/&quot;&gt;Swift Package Manager&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Finally, we&amp;#39;ve been heavily improving the internals of the library and investigating on how to make the &lt;code&gt;pod install&lt;/code&gt; process incremental and change it in ways that make Xcode cope better with very large projects to be more responsive.&lt;/p&gt;

&lt;p&gt;Thank you for making CocoaPods 1.6.0 a reality! We&amp;#39;ve come a long way.&lt;/p&gt;

&lt;p&gt;Checkout the &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/releases/tag/1.6.0.beta.1&quot;&gt;changelog&lt;/a&gt; to get the full list of changes.&lt;/p&gt;

&lt;p&gt;&amp;lt;3&lt;/p&gt;
</description>
    <pubDate>Thu, 16 Aug 2018 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-1.6.0-beta</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-1.6.0-beta</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 1.5.0 &#8212; Swift Static Libraries</title>
    <description>&lt;p&gt;&lt;em&gt;CocoaPods 1.5.0&lt;/em&gt; comes with native support for building Swift pods as static libraries.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Just a few months after the release of CocoaPods 1.4.0, we&amp;#39;re releasing a new version that focuses on enabling &lt;em&gt;everyone&lt;/em&gt; to adopt Swift.&lt;/p&gt;

&lt;h3 id=&quot;swift-static-libraries&quot;&gt;Swift Static Libraries&lt;/h3&gt;

&lt;p&gt;Up until Xcode 9, support for building Swift into static libraries was non-existent and use of dynamic frameworks was required. This was a deal-breaker for some developers, particularly those worried about the launch performance implications of linked many dynamic binaries.&lt;/p&gt;

&lt;p&gt;With CocoaPods 1.5.0, developers are no longer restricted into specifying &lt;code&gt;use_frameworks!&lt;/code&gt; in their &lt;code&gt;Podfile&lt;/code&gt; in order to install pods that use Swift.
Interop with Objective-C should &lt;em&gt;just work&lt;/em&gt;.
However, if your Swift pod depends on an Objective-C, pod you will need to enable &amp;quot;modular headers&amp;quot; (see below) for that Objective-C pod.&lt;/p&gt;

&lt;h3 id=&quot;modular-headers&quot;&gt;Modular Headers&lt;/h3&gt;

&lt;p&gt;When CocoaPods first came out many years ago, it focused on enabling as many existing libraries as possible to be packaged as pods.
That meant making a few tradeoffs, and one of those has to do with the way CocoaPods sets up header search paths. CocoaPods allowed any pod to import any other pod with un-namespaced quote imports.&lt;/p&gt;

&lt;p&gt;For example, pod B could have code that had a &lt;code&gt;#import &amp;quot;A.h&amp;quot;&lt;/code&gt; statement, and CocoaPods will create build settings that will allow such an import to succeed. Imports such as these, however, will not work if you try to add module maps to these pods. We tried to automatically generate module maps for static libraries many years ago, and it broke some pods, so we had to revert.&lt;/p&gt;

&lt;p&gt;In this release, you will be able to opt into stricter header search paths (and module map generation for Objective-C pods). As a pod author, you can add &lt;code&gt;&amp;#39;DEFINES_MODULE&amp;#39; =&amp;gt; &amp;#39;YES&amp;#39;&lt;/code&gt; to your &lt;code&gt;pod_target_xcconfig&lt;/code&gt;. Alternatively, in your Podfile you can add &lt;code&gt;use_modular_headers!&lt;/code&gt; to enable the stricter search paths and module map generation for all of your pods, or you can add &lt;code&gt;:modular_headers =&amp;gt; true&lt;/code&gt; to a single &lt;code&gt;pod&lt;/code&gt; declaration to enable for only that pod.&lt;/p&gt;

&lt;h3 id=&quot;tracking-installation-sources&quot;&gt;Tracking Installation Sources&lt;/h3&gt;

&lt;p&gt;This change happens behind-the-scenes, and opens up some exciting possibilities.
CocoaPods will now store the specs repo that a Pod has been sourced from:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;yaml language-yaml&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;l-Scalar-Plain&quot;&gt;SPEC REPOS&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;l-Scalar-Plain&quot;&gt;https://github.com/CocoaPods/Specs.git&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;p-Indicator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;Alamofire&lt;/span&gt;
    &lt;span class=&quot;p-Indicator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;Moya&lt;/span&gt;
  &lt;span class=&quot;l-Scalar-Plain&quot;&gt;https://github.com/Private/Internal.git&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;p-Indicator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;InteralPod&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;This will enable CocoaPods to be able to tell you when the source for a pod has changed, and will also force a noticeable &lt;code&gt;git diff&lt;/code&gt; in the &lt;code&gt;Podfile.lock&lt;/code&gt;, making sure you&amp;#39;re aware when a Pod comes from a different source. This makes it possible to audit that your private forks are being used, instead of public specs, for example. We consider this a helpful security enhancement, especially for those teams with Security Engineers peering over their shoulders.&lt;/p&gt;

&lt;h3 id=&quot;further-improvements&quot;&gt;Further Improvements&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;CocoaPods will no longer add &lt;em&gt;all&lt;/em&gt; header search paths for each &lt;code&gt;xcconfig&lt;/code&gt; generated and instead, it only adds the header search paths for the dependencies of the pod&lt;/li&gt;
&lt;li&gt;Static frameworks allow mixing Objective-C and Swift&lt;/li&gt;
&lt;li&gt;During pod validation, any output from &lt;code&gt;xcodebuild&lt;/code&gt; is now streamed when using &lt;code&gt;--verbose&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pod install&lt;/code&gt; performance is improved both for pods with many subspecs, as well as pods which specify exact file paths rather than globs&lt;/li&gt;
&lt;li&gt;Script phases used by CocoaPods will now assert that all expected build settings (and environment variables) are set&lt;/li&gt;
&lt;li&gt;Integrating static library pods into static library targets will not cause copy script phases to be run&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;summary&quot;&gt;Summary&lt;/h3&gt;

&lt;p&gt;CocoaPods 1.5.0 is an exciting release. We&amp;#39;re very excited for you to try it out, and recommend you upgrade:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;sh language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;gem install cocoapods
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;After all of this excitement, here&amp;#39;s a taste to whet your appetite for the next CocoaPods version. For 1.6.0, we&amp;#39;re focusing on redesigning core parts of the library to improve CocoaPods performance for very large applications.
So, if you&amp;#39;re feeling like &lt;code&gt;pod install&lt;/code&gt; is taking a tad longer than you&amp;#39;d like, stay tuned 😉&lt;/p&gt;

&lt;p&gt;As always, we would like to thank all of our contributors for making CocoaPods 1.5.0 a reality!&lt;/p&gt;

&lt;p&gt;Checkout the &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/releases/tag/1.5.0&quot;&gt;changelog&lt;/a&gt; to get the full list of changes.&lt;/p&gt;
</description>
    <pubDate>Wed, 04 Apr 2018 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-1.5.0</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-1.5.0</guid>
  </item>
  
  
  
  <item>
    <title>New Service: CocoaPods Metadata generation</title>
    <description>&lt;p&gt;This week we shipped a new behind-the-scenes service for CocoaPods authors: &lt;a href=&quot;https://github.com/CocoaPods/cocoapods-metadata-service&quot;&gt;cocoapods-metadata-service&lt;/a&gt; it handles
a subset of CocoaDocs responsibilities but does not have the requirement of running on a Mac. This makes it easier for
us to maintain.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s been almost a year since &lt;a href=&quot;/CocoaDocs-Documentation-Sunsetting&quot;&gt;we announced that CocoaDocs&lt;/a&gt; was going to be shut down. CocoaDocs&amp;#39; sunsetting
was intially slowed down by the team at &lt;a href=&quot;http://buddybuild.com&quot;&gt;BuddyBuild&lt;/a&gt; offering to take over the project, but the migration wasn&amp;#39;t
finished before they were &lt;a href=&quot;https://www.buddybuild.com/blog/buddybuild-is-now-part-of-apple&quot;&gt;acquired by Apple&lt;/a&gt;. This means they cannot take over community services.&lt;/p&gt;

&lt;p&gt;Instead I&amp;#39;ve started building out a simpler replacement that handles just the needs of the cocoapods.org website. Read
on to find out what that looks like.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h3 id=&quot;why-build-this&quot;&gt;Why build this?&lt;/h3&gt;

&lt;p&gt;CocoaPods&amp;#39; web infrastructure needs to continue to be hardened. We have fewer contributors and a lot more people using
CocoaPods. Moving more of our web services into heroku means we have less diversity in how projects are hosted get run.
Hosting a Mac Mini on the internet is a lot of work, and I wouldn&amp;#39;t wish it on anyone else.&lt;/p&gt;

&lt;p&gt;There&amp;#39;s a tricky thing here though. CocoaDocs would run through the full &lt;code&gt;pod install&lt;/code&gt; process and use the files to
generate a set of useful metrics for each pod:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;sh language-sh&quot; data-lang=&quot;sh&quot;&gt;install_size
total_files
total_comments
total_lines_of_code
doc_percent
readme_complexity
initial_commit_date
rendered_readme_url
license_short_name
license_canonical_url
total_test_expectations
dominant_language
builds_independently
is_vendored_framework
rendered_changelog_url
rendered_summary
spm_support
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Not all of these attributes are feasible when running on heroku because it has an &lt;a href=&quot;https://devcenter.heroku.com/articles/dynos#ephemeral-filesystem&quot;&gt;ephemeral filesystem&lt;/a&gt;. For
example a repo would include example projects and code which are removed by the &lt;code&gt;pod install&lt;/code&gt; - CocoaDocs would then use
the remaining files to generate details on. In order to work on host without a local clone of the pod, some of those
metrics need to be optional.&lt;/p&gt;

&lt;p&gt;I built this service to focus on the most pressing problem first: READMEs, CHANGELOGs and license information.
Basically:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;sh language-sh&quot; data-lang=&quot;sh&quot;&gt;rendered_readme_url
license_short_name
license_canonical_url
rendered_changelog_url
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Some of the other attributes can be added later, for example I see no blockers on adding &lt;code&gt;dominant_language&lt;/code&gt;,
&lt;code&gt;is_vendored_framework&lt;/code&gt;, &lt;code&gt;initial_commit_date&lt;/code&gt;, &lt;code&gt;spm_support&lt;/code&gt; and &lt;code&gt;readme_complexity&lt;/code&gt; to the service, but some
attributes are just not going to be feasible.&lt;/p&gt;

&lt;p&gt;This service has so far focused exclusively on Open Source GitHub projects, with plans to expand to Pods that use
&lt;a href=&quot;https://github.com/CocoaPods/cocoapods-metadata-service/issues/2&quot;&gt;.tar.gz&lt;/a&gt; and &lt;a href=&quot;https://github.com/CocoaPods/cocoapods-metadata-service/issues/1&quot;&gt;zip&lt;/a&gt; files coming soon.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s the first JavaScript project (TypeScript) in the CocoaPods org, because once I worked with TypeScript I couldn&amp;#39;t go
back to Ruby for a new project. This does introduce some complexity though. So I opted to livecode the entire process of
building the v1 and getting the project into production.&lt;/p&gt;

&lt;p&gt;This means if you&amp;#39;re interested in how to build a small NodeJS server in TypeScript, you&amp;#39;ve got a small well-built
example with &lt;a href=&quot;https://www.youtube.com/watch?v=KpX0jRDEv14&amp;list=PLYUbsZda9oHs-MoWKiZNXtvGK9ye8nZZe&quot;&gt;a YouTube playlist of over 5 hours&lt;/a&gt; where I have to explain all of my choices.&lt;/p&gt;

&lt;p&gt;&lt;center&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/videoseries?list=PLYUbsZda9oHs-MoWKiZNXtvGK9ye8nZZe&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;As we rely more on this service, we can continue to provide the rich web-experience with far less dependencies on hard
to maintain infrastructure, which paves the way for CocoaPods to continue being a useful resource for a very long time.&lt;/p&gt;
</description>
    <pubDate>Fri, 16 Mar 2018 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-Metadata-Service</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-Metadata-Service</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 1.4.0 &#8212; Feature packed!</title>
    <description>&lt;p&gt;&lt;em&gt;CocoaPods 1.4.0&lt;/em&gt; comes packed with new features such as app host support for tests, script phases, static framework support and a new Swift version DSL!&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Just after few months after the release of CocoaPods 1.3.0, we unveil a new version that adds a bunch of new powerful features. Let&amp;#39;s get right into it!&lt;/p&gt;

&lt;h3 id=&quot;app-host-support-for-test-specs&quot;&gt;App host support for test specs&lt;/h3&gt;

&lt;p&gt;CocoaPods 1.3.0 introduced support for test specs, but initially, pod authors were unable to use test specs that required an app host. With 1.4.0, you can now specify that an app host is required in order for your tests to execute.&lt;/p&gt;

&lt;p&gt;You can accomplish this by using setting the &lt;code&gt;requires_app_host&lt;/code&gt; attribute within your test spec:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Tests&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;requires_app_host&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source_files&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Tests/**/*.{h,m,swift}&amp;#39;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Once enabled, CocoaPods will automatically create a stub app host and link it with your test bundle targets. This enables you to describe test sources that use &lt;code&gt;UIKit&lt;/code&gt; in order to function. CocoaPods will re-use the same app host across all test specs integrated in your project. For iOS, the app host generated by CocoaPods creates and adds an empty view controller.&lt;/p&gt;

&lt;p&gt;&lt;center&gt;
&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/CocoaPods-1.4.0/app_host_1.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/CocoaPods-1.4.0/app_host_1.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: App host support is not currently available for the &lt;code&gt;watchOS&lt;/code&gt; platform.&lt;/p&gt;

&lt;p&gt;We&amp;#39;ve also made quite a few fixes since the initial launch of test specs in 1.3.0, so we highly recommend upgrading and start using test specs!&lt;/p&gt;

&lt;h3 id=&quot;script-phases&quot;&gt;Script Phases&lt;/h3&gt;

&lt;p&gt;Script phase integration has been a long-awaited and a powerful new feature of CocoaPods 1.4.0. Pod authors as well as app developers can now use CocoaPods to integrate script phases within their podfile or podspec.&lt;/p&gt;

&lt;h4 id=&quot;podfile&quot;&gt;Podfile&lt;/h4&gt;

&lt;p&gt;For app developers, each target now allows you to specify a &lt;code&gt;script_phase&lt;/code&gt; attribute which will automatically integrate a script phase to your target. Here&amp;#39;s an example:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;https://github.com/CocoaPods/Specs&amp;#39;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;install!&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;cocoapods&amp;#39;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;platform&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:ios&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;9.0&amp;#39;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;SampleApp&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Alamofire&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;script_phase&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Hello World&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:script&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;echo &amp;quot;Hello World&amp;quot;&amp;#39;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;This will yield the following result:&lt;/p&gt;

&lt;p&gt;&lt;center&gt;
&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/CocoaPods-1.4.0/script_phases_podfile_1.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/CocoaPods-1.4.0/script_phases_podfile_1.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;This allows you to represent script phases for your app targets within your podfile without having to maintain them within your &lt;code&gt;.xcodeproj&lt;/code&gt;. Each script phase is prefixed with &lt;code&gt;[CP-User]&lt;/code&gt; so you can easily distinguish it as your own, and know that it has been automatically added by CocoaPods. You can have multiple script phases per single target and the order in which you specify them is the order that they will be added into your target.&lt;/p&gt;

&lt;h4 id=&quot;podspec&quot;&gt;Podspec&lt;/h4&gt;

&lt;p&gt;It is often the case that libraries may want to perform a few tasks during compilation. Up until now, pod authors were only able to perform a configuration task via the the &lt;a href=&quot;https://guides.cocoapods.org/syntax/podspec.html#prepare_command&quot;&gt;prepare_command&lt;/a&gt; attribute, however, this only executes when your pod is first installed or updated. Additionally, during execution of the &lt;a href=&quot;https://guides.cocoapods.org/syntax/podspec.html#prepare_command&quot;&gt;prepare_command&lt;/a&gt;, none of the Xcode environment variables are set as they are during build execution.&lt;/p&gt;

&lt;p&gt;With CocoaPods 1.4.0 you are now able to specify a &lt;code&gt;script_phase&lt;/code&gt; attribute within your podspec that executes as part of the build process of your pod, giving you full access to the Xcode build environment. Let&amp;#39;s take a look at an example using our favorite sample pod &amp;#39;CannonPodder&amp;#39;:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Pod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;         &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;CannonPodder&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;1.0.0&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;summary&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;CannonPodder for the win.&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;homepage&lt;/span&gt;     &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;http://cannonpodder-corp.local/cannonpodder-lib.html&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;description&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;All the Cannons&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt;       &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:git&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;http://somewhere.com/cannonpodder.git&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:tag&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;1.0.0&amp;#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;license&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:type&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;MIT&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:text&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Permission is hereby granted ...&amp;#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ios&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;deployment_target&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;9.0&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;osx&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;deployment_target&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;10.10&amp;#39;&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;script_phase&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Hello World&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:script&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;echo &amp;quot;Hello World&amp;quot;&amp;#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source_files&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Sources/**/*.{h,m,swift}&amp;#39;&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;private_header_files&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Sources/Internal/**/*.h&amp;#39;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;The above will automatically add a script phase to the &lt;code&gt;CannonPodder-iOS&lt;/code&gt; and &lt;code&gt;CannonPodder-macOS&lt;/code&gt; targets generated by CocoaPods. It looks like this:&lt;/p&gt;

&lt;p&gt;&lt;center&gt;
&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/CocoaPods-1.4.0/script_phases_podspec_1.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/CocoaPods-1.4.0/script_phases_podspec_1.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;If your pod supports multiple platforms, you can limit a script phase only to a specific platform, for example:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ios&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;script_phase&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Hello iOS World&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:script&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;echo &amp;quot;Hello iOS World&amp;quot;&amp;#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;The above example will only add a script phase to the &lt;code&gt;CannonPodder-iOS&lt;/code&gt; target.&lt;/p&gt;

&lt;p&gt;Additionally, there are times where you would like your script phases to be executed &lt;em&gt;before&lt;/em&gt; compilation in order to perform a configuration step, such as generate some sources or perhaps perform a lint check. Support for this is included with CocoaPods 1.4.0 via the &lt;code&gt;:execution_position&lt;/code&gt; attribute within each &lt;code&gt;script_phase&lt;/code&gt; entry.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;script_phase&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Hello World&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;:script&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;echo &amp;quot;Hello World&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;ss&quot;&gt;:execution_position&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:before_compile&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Generates the following:&lt;/p&gt;

&lt;p&gt;&lt;center&gt;
&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/CocoaPods-1.4.0/script_phases_podspec_2.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/CocoaPods-1.4.0/script_phases_podspec_2.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;CocoaPods will automatically add the script phase before the &lt;code&gt;Compile Sources&lt;/code&gt; phase. This effectively allows you to control at what stage you prefer a script phase to be executed and allows you to perform different type of tasks depending on the compilation phase.&lt;/p&gt;

&lt;p&gt;Here&amp;#39;s a slightly more complicated example that demonstrates two script phases running at different stages:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;script_phases&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Precompile&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;ss&quot;&gt;:script&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;${PODS_TARGET_SRCROOT}/setup.sh&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;ss&quot;&gt;:execution_position&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:before_compile&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Postcompile&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;ss&quot;&gt;:script&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;echo &amp;quot;yay!&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;ss&quot;&gt;:execution_position&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:after_compile&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Currently, the available execution positions are &lt;code&gt;:before_compile&lt;/code&gt;, &lt;code&gt;:after_compile&lt;/code&gt; and &lt;code&gt;:any&lt;/code&gt; which is the default and is reserved internally by CocoaPods. When you use &lt;code&gt;:any&lt;/code&gt;, its behavior currently matches that of &lt;code&gt;:after_compile&lt;/code&gt; but that might change in the future. This is why it is always recommended to specify the &lt;code&gt;execution_position&lt;/code&gt; attribute when defining a &lt;code&gt;script_phase&lt;/code&gt; within your podspec.&lt;/p&gt;

&lt;p&gt;In the future, we are hoping to expand the &lt;code&gt;:execution_phase&lt;/code&gt; attribute and provide more granular options for you specify at which point should your script phase execute.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: If you&amp;#39;d like your script phase to access any of the sources of your pod during execution, then it is &lt;em&gt;highly&lt;/em&gt; recommended to use the &lt;code&gt;${PODS_TARGET_SRCROOT}&lt;/code&gt; environment variable which is set for each pod and is always relative to the path of your pod sources.&lt;/p&gt;

&lt;h4 id=&quot;security-warning&quot;&gt;Security Warning&lt;/h4&gt;

&lt;p&gt;While script phases are a powerful addition to CocoaPods, it is crucial to understand that consuming pods that include script phases may be a high security vulnerability for many. After all, this feature essentially allows pod authors to execute code on your machine if you decide to integrate their pod into your project.&lt;/p&gt;

&lt;p&gt;For this reason, CocoaPods will &lt;strong&gt;always&lt;/strong&gt; display a warning when you install a pod or if you update a pod to a new version that adds script phases as part of it&amp;#39;s build process.&lt;/p&gt;

&lt;p&gt;A warning would be displayed as such (click to enlarge):&lt;/p&gt;

&lt;p&gt;&lt;center&gt;
&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/CocoaPods-1.4.0/script_phases_security_1.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/CocoaPods-1.4.0/script_phases_security_1.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This warning cannot be disabled and it will appear the first time you install a pod or when an existing pod is updated and contains script phases. It is imperative that you inspect the contents of the script phase to ensure no harmful code is executed as part of your compilation process.&lt;/p&gt;

&lt;p&gt;In a future version, CocoaPods will prompt you before executing a &lt;a href=&quot;https://guides.cocoapods.org/syntax/podspec.html#prepare_command&quot;&gt;prepare_command&lt;/a&gt; for a pod in order for you to inspect its contents.&lt;/p&gt;

&lt;h3 id=&quot;static-frameworks&quot;&gt;Static Frameworks&lt;/h3&gt;

&lt;p&gt;Source static frameworks is another powerful new feature of CocoaPods 1.4.0. For the first time, it is possible to distribute sources and build them into a static framework when &lt;code&gt;use_frameworks!&lt;/code&gt; is specified in the &lt;code&gt;Podfile&lt;/code&gt;. Because dynamic libraries cannot depend upon static libraries, it now becomes possible to distribute pods that depend upon other static library frameworks, including the many static frameworks that are released as &lt;code&gt;vendored_frameworks&lt;/code&gt; today.&lt;/p&gt;

&lt;h4 id=&quot;background&quot;&gt;Background&lt;/h4&gt;

&lt;p&gt;A framework is a collection of a library, headers and resources. The library may be either dynamic or static. A static library is linked at build time while a dynamic library is linked and loaded at runtime.&lt;/p&gt;

&lt;p&gt;A dynamic library cannot depend on a static library because a static library may not have the necessary relocations to be loaded at runtime and because if multiple dynamic libraries depended upon the same static library, there would be multiple copies of the static library. The multiple copies is only a code size issue for the code itself, but it will lead to functionality issues for any data in the static library.&lt;/p&gt;

&lt;p&gt;When Apple and Xcode refer to frameworks, dynamic is typically implied. However, the lower level Apple build tools work correctly with both dynamic and static frameworks.&lt;/p&gt;

&lt;p&gt;Historically many binary CocoaPods have been distributed as a &lt;code&gt;vendored_framework&lt;/code&gt; that includes a static library.&lt;/p&gt;

&lt;p&gt;Before 1.4.0, sources could only be built as dynamic frameworks. Therefore, it was not possible to depend on many &lt;code&gt;vendored_framework&lt;/code&gt; CocoaPods. Also, it was not possible for a vendor who delivered their pod in a binary form to convert it to a source CocoaPod and keep it as a static framework.&lt;/p&gt;

&lt;h4 id=&quot;usage&quot;&gt;Usage&lt;/h4&gt;

&lt;p&gt;To enable static framework support add the following to your podspec:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;static_framework&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Voilà!&lt;/p&gt;

&lt;h3 id=&quot;swift-version-dsl&quot;&gt;Swift Version DSL&lt;/h3&gt;

&lt;p&gt;With CocoaPods 1.4.0, you are now able to specify the Swift version your pod officially supports within your podspec via the &lt;code&gt;swift_version&lt;/code&gt; attribute. Since the release of Xcode 9, multiple Swift versions are now allowed per target to be used. CocoaPods always defaulted to the Swift version your app target was using. As Swift evolves the current integration is no longer sustainable. For example, upgrading your project to Swift 4.0 does not necessarily mean that all Swift pods you consume also successfully compile with Swift 4.0 and therefore you had to wait for a new version of a pod to be published before upgrading to the latest version of Swift or resort into using a &lt;code&gt;post_install&lt;/code&gt; hook to edit the configuration manually.&lt;/p&gt;

&lt;p&gt;As a pod author you can now add the following to your podspec:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;swift_version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;4.0&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;This will automatically configure Swift 4.0 for the pod when it&amp;#39;s consumed and regardless of the Swift version the app target uses. As an author you should always test and provide the known version of Swift that successfully works with your pod and update your podspec accordingly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The usage of the &lt;code&gt;.swift-version&lt;/code&gt; file as well as the &lt;code&gt;--swift-version&lt;/code&gt; parameter during &lt;code&gt;lint&lt;/code&gt; is now deprecated. You may continue to use it but you will receive a warning to use the &lt;code&gt;swift_version&lt;/code&gt; attribute instead.&lt;/p&gt;

&lt;p&gt;We aim to improve support for this feature in the future by allowing pod authors to specify a range of Swift versions their pod supports instead of a single Swift version, but for the majority this will be sufficient. We would like to remain detached from Apple&amp;#39;s Swift roadmap and not to have to perform releases of CocoaPods as new versions of Swift and Xcode are introduced.&lt;/p&gt;

&lt;h3 id=&quot;transition-to-https&quot;&gt;Transition to &lt;code&gt;https&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;With this release, publishing a pod using an unencrypted &lt;code&gt;http&lt;/code&gt; source is now deprecated and it is &lt;em&gt;highly&lt;/em&gt; recommended to begin the process of hosting your pod using an &lt;code&gt;https&lt;/code&gt; source. A warning will appear if you attempt to publish a pod in the master repo that&amp;#39;s not using an &lt;code&gt;https&lt;/code&gt; source. In a future release this will become more strict and you will be unable to publish a pod without an &lt;code&gt;https&lt;/code&gt; source.&lt;/p&gt;

&lt;p&gt;Additionally, during installation consumers of pods with unencrypted &lt;code&gt;http&lt;/code&gt; source will also receive a warning notifying them that the source in which the pod is hosted may be unsafe.&lt;/p&gt;

&lt;h3 id=&quot;development-pod-files&quot;&gt;Development Pod Files&lt;/h3&gt;

&lt;p&gt;It is often very useful when you are developing locally on a pod (using the &lt;code&gt;:path&lt;/code&gt; directive) to have all of its associated files (such as documentation files, its podspec and license files) to be easily available and visible so you can view and edit them. In 1.4.0, all of these files are now automatically added to the generated &lt;code&gt;.xcodeproj&lt;/code&gt;! The following files will be automatically added to the workspace:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Podspec&lt;/li&gt;
&lt;li&gt;Docs (in a folder which matches the glob pattern &lt;code&gt;doc{s}{*,.*}&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Custom module map (using the podspec&amp;#39;s &lt;code&gt;module_map&lt;/code&gt; attribute)&lt;/li&gt;
&lt;li&gt;Prefix header (using the Podspec&amp;#39;s &lt;code&gt;prefix_header_file&lt;/code&gt; attribute)&lt;/li&gt;
&lt;li&gt;License (using either the Podspec&amp;#39;s license attribute, or automatically found with the glob pattern &lt;code&gt;licen{c,s}e{*,.*}&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;README (matching the glob pattern &lt;code&gt;readme{*,.*}&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This should enhance your development experience when working with a pod locally.&lt;/p&gt;

&lt;h3 id=&quot;summary&quot;&gt;Summary&lt;/h3&gt;

&lt;p&gt;CocoaPods 1.4.0 is a huge release for propelling iOS development forward and introduces many powerful features. We are very excited for you to try it and highly recommend you upgrade!&lt;/p&gt;

&lt;p&gt;Special thanks to all the contributors for CocoaPods 1.4.0, we couldn&amp;#39;t have done it without you.&lt;/p&gt;

&lt;p&gt;Checkout the &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/releases/tag/1.4.0&quot;&gt;changelog&lt;/a&gt; to get the full list of changes.&lt;/p&gt;

&lt;p&gt;&amp;lt;3&lt;/p&gt;
</description>
    <pubDate>Thu, 18 Jan 2018 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-1.4.0</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-1.4.0</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 1.3.0 &#8212; Test specifications and performance improvements</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;CocoaPods 1.3.0&lt;/em&gt; has been released, which includes support for test specifications and performance improvements specifically around rebuilding your project and preparation for Xcode 9 support!&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;We are happy to announce that CocoaPods 1.3.0 has been released! The primary feature of this release is support for test specifications. Up until now, podspecs were not able to describe test sources which made it difficult to test your pods and required custom workarounds to represent your test sources via other means. With this release, you are now able to describe your test sources within your podspecs!&lt;/p&gt;

&lt;p&gt;Let&amp;#39;s see an an example podspec:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Pod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;         &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;CoconutLib&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;1.0&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;authors&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Coconut Corp&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Monkey Boy&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;monkey@coconut-corp.local&amp;#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;homepage&lt;/span&gt;     &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;http://coconut-corp.local/coconut-lib.html&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;summary&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Coconuts For the Win.&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;description&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;All the Coconuts&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt;       &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:git&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;http://coconut-corp.local/coconut-lib.git&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:tag&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;v1.0&amp;#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;license&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;ss&quot;&gt;:type&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;MIT&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;ss&quot;&gt;:file&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;LICENSE&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;ss&quot;&gt;:text&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Permission is hereby granted ...&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source_files&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Sources/*.{h,m}&amp;#39;&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Tests&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source_files&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Tests/*.{h,m}&amp;#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;test_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dependency&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;OCMock&amp;#39;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# This dependency will only be linked with your tests.&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;  
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Test specifications work just like &lt;a href=&quot;https://guides.cocoapods.org/syntax/podspec.html#subspec&quot;&gt;subspecs&lt;/a&gt;, but they are treated differently by CocoaPods when it comes to integration. Any sources and headers you specify will be automatically added to your test target and all dependencies specified under test specs will &lt;em&gt;only&lt;/em&gt; be linked to your test target. By default, test specs have a dependency to their parent, include all of its transitive dependencies and can import all of its headers (including private headers) for testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: As of right now, test specs will generate unit test bundles which require no app host to be executed. Support for test specs with app hosts will be added in the near future.&lt;/p&gt;

&lt;p&gt;We also updated the lint process to automatically build and run your test sources if any test specifications are present. This functionality is turned on by default and lint will fail if any of your test sources fail to compile or a test run fails. Finally, the flag &lt;code&gt;--skip-tests&lt;/code&gt; has been added to skip tests during lint if for any reason you wish to skip running tests.&lt;/p&gt;

&lt;p&gt;If you wish to consume the tests of a pod, perhaps for local development, then you will have to specify the test specs in your Podfile. For example:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt; &lt;span class=&quot;n&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;MyApp&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;use_frameworks!&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;CoconutLib&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;~&amp;gt; 1.0&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:testspecs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;Tests&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
 &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;When you execute &lt;code&gt;pod install&lt;/code&gt; this will automatically create a test target for the &lt;code&gt;CoconutLib&lt;/code&gt; called &lt;code&gt;CoconutLib-Unit-Tests&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Support for automatic execution of tests has been added to all generated pod &lt;code&gt;xcschemes&lt;/code&gt;. This means you are now able to &lt;code&gt;CMD+U&lt;/code&gt; on the generated pod target to run its tests without having to create or add the test scheme manually.&lt;/p&gt;

&lt;p&gt;Test specifications are a powerful addition to CocoaPods and allows you to represent your test sources within your podspec. It was one of the missing pieces of making podspecs the source of truth for describing your libraries. CocoaPods does a great job in leveraging the file system as the source of truth for library organization and now the same applies to your test sources. This also means you can now have your CI environment build, test and publish your pod using lint as the only command, saving you from managing Xcode projects manually.&lt;/p&gt;

&lt;h3 id=&quot;performance-improvements&quot;&gt;Performance Improvements&lt;/h3&gt;

&lt;p&gt;With this release, we also tackled some of the largest pain points of CocoaPods development. In particular, there are three major updates that address the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;All CocoaPods script phases (such as &amp;#39;Embed Pods Frameworks&amp;#39; and &amp;#39;Copy Pods Resources&amp;#39;) now utilize Xcode&amp;#39;s input and output paths. This means that those phases will &lt;em&gt;not&lt;/em&gt; execute again unless any of their inputs or outputs have changed. This is automatically managed by CocoaPods as you add or remove pods in your &lt;code&gt;Podfile&lt;/code&gt;. This should save a lot of time for developers who often iterate by making a single file change and want fast rebuilds. Internally, we&amp;#39;ve witnessed cases where without editing a single source file it would take 10-15 seconds to complete a rebuild, however, with CocoaPods 1.3.0 the same process now takes less than a second.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CocoaPods generates a handful of files each time you execute &lt;code&gt;pod install&lt;/code&gt;. Those files are necessary for CocoaPods to function and properly integrate your project. However, by regenerating those files even with the same content, Xcode would treat them as &amp;quot;dirty&amp;quot; and often rebuild your project from scratch. This is no longer the case with CocoaPods 1.3.0. The content of each file now is now compared and unless it has changed the file will not be re-written. Executing &lt;code&gt;pod install&lt;/code&gt; again should not cause any of your pods that haven&amp;#39;t changed to rebuild.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We&amp;#39;ve applied a few performance improvements for speeding up &lt;code&gt;pod install&lt;/code&gt; times. This is particularly beneficial for large complex projects with multiple targets and a large number of pods. Keeping &lt;code&gt;pod install&lt;/code&gt; times low allows developers to execute faster by generating their workspace more quickly.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;notable-enhancements&quot;&gt;Notable Enhancements&lt;/h3&gt;

&lt;p&gt;There are a few other things worth noting for this release:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;CocoaPods will automatically detect and copy the &lt;code&gt;.dSYM&lt;/code&gt; files of vendored dynamic frameworks. Place the &lt;code&gt;.dSYM&lt;/code&gt; next to your &lt;code&gt;.framework&lt;/code&gt; for CocoaPods to detect it and copy it to the onto the folder specified by &lt;code&gt;${DWARF_DSYM_FOLDER_PATH}&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Each lint execution now runs in a unique temp folder. This allows for running multiple lint processes in parallel, for example within a CI environment.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Checkout the &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/releases/tag/1.3.0&quot;&gt;changelog&lt;/a&gt; to get the full list of changes.&lt;/p&gt;

&lt;h3 id=&quot;xcode-9&quot;&gt;Xcode 9&lt;/h3&gt;

&lt;p&gt;Apple is moving fast on releasing Xcode 9. We&amp;#39;ve taken notice and we are performing all necessary steps required to ensure a smooth transition. We&amp;#39;ve also seen some new major features, such as the ability to include Swift sources within static libraries and are looking to support them as fast as we can.&lt;/p&gt;

&lt;p&gt;CocoaPods 1.3.0 is an important milestone for CocoaPods as it is maturing as the standard library for iOS dependency management. We would like to thank all contributors for their support and time spent to improve this project!&lt;/p&gt;
</description>
    <pubDate>Tue, 01 Aug 2017 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-1.3.0</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-1.3.0</guid>
  </item>
  
  
  
  <item>
    <title>CocoaDocs documentation sun-setting</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;CocoaDocs&lt;/em&gt; will stop generating DocSets for new libraries and versions using CocoaPods towards the end of May.&lt;/p&gt;

&lt;p&gt;I started &lt;a href=&quot;http://cocoadocs.org/&quot;&gt;CocoaDocs&lt;/a&gt; &lt;a href=&quot;https://twitter.com/orta/status/318481722129907712&quot;&gt;back in&lt;/a&gt; February 2013, and have been running and maintaining it for the last 4 years. CocoaDocs started as a way to generate documentation for Objective-C projects via &lt;a href=&quot;https://github.com/tomaz/appledoc&quot;&gt;Appledoc&lt;/a&gt;. When Swift came out, &lt;a href=&quot;https://github.com/realm/jazzy&quot;&gt;Jazzy&lt;/a&gt; support was added to the app. Since then, CocoaDocs has grown organically over the years into a tool to &lt;a href=&quot;http://blog.cocoapods.org/CocoaPods.org-Take-Two/&quot;&gt;generate useful metadata&lt;/a&gt; for any CocoaPods library used in the CocoaPods.org website.&lt;/p&gt;

&lt;p&gt;I intend to remove the support for generating HTML pages and DocSets for new libraries uploaded to trunk by the end of May.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;I would like to reduce the complexity in CocoaDocs. It&amp;#39;s rare for a week to go by without an issue or two in the &lt;a href=&quot;https://github.com/CocoaPods/cocoadocs.org/&quot;&gt;CocoaDocs repo&lt;/a&gt; about a specific library, or tooling setup that requires human intervention on the server. These issues arise from either Xcode itself, or tools which rely on Xcode infrastructure to do their work. This makes it hard to fix wholesale.&lt;/p&gt;

&lt;p&gt;By removing these parts of the system, I can keep maintaining the aspects of CocoaDocs that are used the most: creating metrics (for search) and README/CHANGELOG summaries for CocoaPods.org.&lt;/p&gt;

&lt;p&gt;I don&amp;#39;t think it&amp;#39;s fair to hoist the maintenance of CocoaDocs on other contributors to CocoaPods. It&amp;#39;s a complex tool that requires a lot of unique knowledge in unrelated areas.&lt;/p&gt;

&lt;p&gt;So, I think this is a great time for someone else to consider re-thinking the original premise of CocoaDocs and create something that works with Swift Package Manager as well as CocoaPods. I hear server-side Swift is becoming a thing, so maybe you can create a new service for the community with it?&lt;/p&gt;

&lt;p&gt;Due to the lengthy time required in a Cocoa project compilation, you probably would end up with a similar architecture as CocoaDocs. This means making a simple REST server, which provides a queue-like infrastructure to parse documentation which uploads the results to a static asset host. In this case CocoaDocs uses S3, and costs somewhere in the range of $20 a month.&lt;/p&gt;

&lt;p&gt;If you decide to give it a shot, let me know once you have a prototype and I&amp;#39;ll happily provide as many resources as I can. We can set up web-hooks from CocoaPods Trunk too.&lt;/p&gt;
</description>
    <pubDate>Tue, 28 Mar 2017 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaDocs-Documentation-Sunsetting</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaDocs-Documentation-Sunsetting</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods Specs Repo Sharding</title>
    <description>&lt;p&gt;In March, CocoaPods hit an unfortunate problem with our &lt;a href=&quot;http://blog.cocoapods.org/Master-Spec-Repo-Rate-Limiting-Post-Mortem/&quot;&gt;Specs Repo&lt;/a&gt; being rate limited. &lt;/p&gt;

&lt;p&gt;We announced that we were &lt;a href=&quot;http://blog.cocoapods.org/Master-Spec-Repo-Rate-Limiting-Post-Mortem/#too-many-directory-entries&quot;&gt;planning on Sharding&lt;/a&gt; the Specs Repo, but were hesitant to do it instantly. Now over six months later we are planning on running the scripts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you are using CocoaPods &lt;code&gt;1.x&lt;/code&gt; - you should not see any changes.&lt;/li&gt;
&lt;li&gt;If you are using CocoaPods &lt;code&gt;0.39&lt;/code&gt; and below, you will see an error saying that your version of CocoaPods is not supported. Previous to this, our minimum version was &lt;code&gt;0.32&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For people who want to continue using 0.x versions, we will be replicating the Specs repo from the commit before the repo was sharded. This means you can add:&lt;/p&gt;

&lt;pre&gt;
&lt;code&gt;
source &quot;https://github.com/CocoaPods/Old-Specs&quot;
&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;To the top of your Podfile, and CocoaPods will only use the archived repo, instead of using the new repo structure. You will also need to set your local Specs repo to a version before the transition:&lt;/p&gt;

&lt;pre&gt;
&lt;code&gt;
cd ~/.cocoapods/repos/master/
git fetch origin master
git checkout v0.32.1
&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;To run &lt;code&gt;pod install&lt;/code&gt;, you will also  need to use &lt;code&gt;--no-repo-update&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We do not have the resources to maintain multiple versions of CocoaPods in our spare time, and so we recommend that instead of doing the above, you migrate to the latest versions of CocoaPods in your projects.&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;We are planning to do it on Friday November the 11th, so there will be scheduled downtime on pushing new Pods to Trunk during the process of updating and verifying that it was successful.&lt;/p&gt;
</description>
    <pubDate>Fri, 28 Oct 2016 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Sharding</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Sharding</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 1.1.0 - Xcode 8 support, improved support for new Swift versions, extensions, frameworks, and more</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;CocoaPods 1.1.0&lt;/em&gt; has been released, and it comes with improved support for extensions, frameworks, and new Swift versions, as well as Xcode 8 support and error handling improvements.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;CocoaPods 1.1.0 has been released! This release features improvements for integrating extension targets into your projects, as well as support for the latest from Apple: Xcode 8, new extensions types, and the latest iOS. Specifically for those of you working with extension targets, this means &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/4203&quot;&gt;smoother App Store submissions&lt;/a&gt;. For Xcode 8 and iOS 10, this release has support for the new Swift version settings when building your project and distributing your pods, and it has support for new target types like messages extensions and messages applications. Finally, we&amp;#39;ve integrated some new error recovery tooling to help when you encounter an unexpected error using CocoaPods, and we&amp;#39;ve made &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/pull/5934&quot;&gt;some&lt;/a&gt; &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/pull/5837&quot;&gt;performance&lt;/a&gt; &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/pull/5927&quot;&gt;improvements&lt;/a&gt; to &lt;code&gt;pod install&lt;/code&gt; when running it for large projects.&lt;/p&gt;

&lt;h3 id=&quot;extensions&quot;&gt;Extensions&lt;/h3&gt;

&lt;p&gt;This update improves support for integrating extension and framework targets. Extensions targets are a bit different than application targets because they require a &lt;a href=&quot;https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionOverview.html#//apple_ref/doc/uid/TP40014214-CH2-SW5&quot;&gt;host app&lt;/a&gt;. For CocoaPods, this means that &lt;code&gt;pod install&lt;/code&gt; has to locate any host targets, in which the extension belongs, to integrate those extension targets&amp;#39; dependencies there. This seems counterintuive at first because Xcode has no problem installing frameworks into extensions the same way that it installs them into application targets. But, when you go to submit your app with its extensions to the App Store, you will probably get some combination of these responses:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Invalid Bundle. The bundle at &amp;#39;MyApp.app/PlugIns/MyExtension.appex&amp;#39; contains disallowed nested bundles.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and/or&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Invalid Bundle. The bundle at &amp;#39;MyApp.app/PlugIns/MyExtension.appex&amp;#39; contains disallowed file Frameworks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It turns out that Apple expects extensions to have their framework dependencies installed in their host apps: at launch time, extensions look into their host apps&amp;#39; bundles to find the frameworks they need. CocoaPods 1.1.0 understands this, and it integrates your extension target&amp;#39;s dependencies into the right place.&lt;/p&gt;

&lt;h3 id=&quot;frameworks&quot;&gt;Frameworks&lt;/h3&gt;

&lt;p&gt;Frameworks work about the same way. A framework&amp;#39;s dependencies must also be installed alongside that framework, into whichever targets that are going to consume that framework. There are a few new frameworks scenarios, of which CocoaPods 1.1.0 is now mindful. In each scenario below, the framework is listed in the Podfile and has some pods:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Framework(s) in your application-type project&lt;/li&gt;
&lt;li&gt;Framework(s) in your application-type project, where the framework may live in a sub-project (i.e. an Xcode project within your Xcode project)&lt;/li&gt;
&lt;li&gt;Framework(s)-only projects (for doing framework development)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In every case, &lt;code&gt;pod install&lt;/code&gt; looks through each of your project&amp;#39;s non-framework target&amp;#39;s &amp;quot;Target Dependencies&amp;quot; build phase to find where the framework is meant to be integrated (same for extensions as well). For framework-only projects, if CocoaPods can tell that your project only contains framework targets, then it assumes that the project must be a framework-only project (for doing framework development) and emits a warning about this assumption. In that case, CocoaPods doesn&amp;#39;t have much to do except ensure your project&amp;#39;s targets have the headers to build properly.&lt;/p&gt;

&lt;h3 id=&quot;xcode-8-and-ios-10&quot;&gt;Xcode 8 and iOS 10&lt;/h3&gt;

&lt;p&gt;Xcode 8 is here! It brings support for iOS 10, macOS Sierra, new versions of Swift, and new challenges for CocoaPods. The first is the ability to support Swift 2.3 and 3.0 projects. In CocoaPods 1.1.0, setting the version of Swift when linting and pushing your pod is supported in following ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/6041&quot;&gt;defaults to Swift 3.0&lt;/a&gt;, if your pod uses Swift.&lt;/li&gt;
&lt;li&gt;It uses the setting from your &lt;code&gt;.swift-version&lt;/code&gt; file if present (inspired by &lt;a href=&quot;https://github.com/kylef/swiftenv&quot;&gt;swiftenv&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;--swift-version&lt;/code&gt; flag can be used to specify a version of Swift to use. This overrides the version set in the &lt;code&gt;.swift-version&lt;/code&gt; file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, iOS 10 makes some new extension and application types available. In particular, CocoaPods has been updated to recognize the messages extensions and application product types.&lt;/p&gt;

&lt;h3 id=&quot;about-supporting-multiple-swift-versions-in-the-podspec&quot;&gt;About Supporting Multiple Swift Versions in the Podspec&lt;/h3&gt;

&lt;p&gt;Because Swift doesn&amp;#39;t use semantic versioning, supporting the Swift language version used by a pod as part of the podspec is tricky. There are a few different options we considered, but we ultimately decided not to add any new podspec dsl for this release. Here are some examples of options we considered:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;We could add a &lt;code&gt;swift_version&lt;/code&gt; option to indicate which version of Swift the pod supports. This would force authors to push new versions of their pods to update this setting when new versions of Swift come out, even if the new version of Swift is backwards compatible. This isn&amp;#39;t ideal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This could be helped by instead supporting a &lt;code&gt;min_swift_version&lt;/code&gt; option to indicate the minimum Swift version the pod supports. This wouldn&amp;#39;t force authors to update their pods when new versions come out, but it would break if a new version of Swift comes out that is not backwards compatible with the one used to build the pod.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We could add a &lt;code&gt;swift_version_range&lt;/code&gt; option to indicate the range of Swift versions the pod supports, but this suffers from the same issues as option 2. There is no way to verify that a pod pushed today that claims to support up through Swift version 4 actually supports that version.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In this release of CocoaPods, you lint your pod against the version of Swift you intend to support. When integrating pods, CocoaPods generates pod targets that use the Swift version set in your project. This allows pod authors the flexibility to support multiple incompatible swift versions if they wish by using &lt;code&gt;#if swift()&lt;/code&gt; checks, while keeping the pod maintenance burden light across Swift 3 versions.&lt;/p&gt;

&lt;p&gt;Additionally, the version of Swift that was used to pass validation is &lt;a href=&quot;https://github.com/CocoaPods/Specs/blob/master/Specs/SodiumCocoaSwift/1.0.0/SodiumCocoaSwift.podspec.json#L36&quot;&gt;baked into the podspec JSON&lt;/a&gt; file that is pushed to trunk. For tool authors, this makes it easy to use the database of pods on trunk to build reliable tooling that works with multiple versions of Swift.&lt;/p&gt;

&lt;h3 id=&quot;error-handling-improvements&quot;&gt;Error Handling Improvements&lt;/h3&gt;

&lt;p&gt;Now when CocoaPods receives unexpected errors, it will highlight existing issues that might be related in the console. This makes it easier to find the answer to common issues. We do this by using &lt;a href=&quot;https://github.com/orta/gh_inspector&quot;&gt;gh_inspector&lt;/a&gt;, which you may have seen &lt;a href=&quot;https://github.com/fastlane/fastlane/releases/tag/1.96.0&quot;&gt;inside Fastlane&lt;/a&gt; too.&lt;/p&gt;

&lt;p&gt;CocoaPods 1.1.0 was a huge release, so congrats to everyone! Checkout the &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/releases/tag/1.1.0&quot;&gt;Changelog&lt;/a&gt; to get the full list of changes.&lt;/p&gt;
</description>
    <pubDate>Wed, 19 Oct 2016 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-1.1.0</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-1.1.0</guid>
  </item>
  
  
  
  <item>
    <title>2016 CocoaPods State of the Union</title>
    <description>&lt;p&gt;Apple have their annual WWDC keynote and Developer State of the Union.
We have ours.
We&amp;#39;re planning a great opening event to WWDC week: The CocoaPods Alt State of the Union.
You should join us, and hear about what&amp;#39;s happened in CocoaPods in the past year, and what&amp;#39;s to come in the next. This year&amp;#39;s is going to be extra-special, as we&amp;#39;ll all get to celebrate the release of CocoaPods 1.0 together 🎉&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;It&amp;#39;s become an annual tradition for CocoaPods to host &lt;a href=&quot;http://www.eventbrite.com/e/cocoapods-2nd-annual-wwdc-meetup-tickets-6887230893&quot;&gt;an&lt;/a&gt; &lt;a href=&quot;https://blog.cocoapods.org/CocoaPods-WWDC-Party&quot;&gt;event&lt;/a&gt; &lt;a href=&quot;https://blog.cocoapods.org/2015-CocoaPods-State-of-the-Union&quot;&gt;at&lt;/a&gt; WWDC,
and we want to make this another great one.
Last year, we tried out a new &lt;a href=&quot;https://github.com/CocoaPods/sotu.cocoapods.org&quot;&gt;lottery system&lt;/a&gt;, and we&amp;#39;ll be using it again this year. To register, just go to &lt;a href=&quot;https://sotu.cocoapods.org&quot;&gt;https://sotu.cocoapods.org&lt;/a&gt; and authenticate with GitHub.&lt;/p&gt;

&lt;p&gt;Registration is open to everyone with a &lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt; account. &lt;a href=&quot;https://citymapper.com/go/6jm7vo&quot;&gt;Twilio&lt;/a&gt; have graciously offered to host us again this year, June Thirteenth (Monday) at 6:30 PM, and we can&amp;#39;t wait to see you all!&lt;/p&gt;

&lt;p&gt;All of the details, as well as the lottery registration link, are available at &lt;a href=&quot;https://sotu.cocoapods.org/&quot;&gt;https://sotu.cocoapods.org/&lt;/a&gt;. We&amp;#39;ll be closing the lottery and announcing the lucky entrants in one week (on June 5th), so hurry up and register!&lt;/p&gt;
</description>
    <pubDate>Sun, 29 May 2016 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/2016-CocoaPods-State-of-the-Union</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/2016-CocoaPods-State-of-the-Union</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods App 1.0</title>
    <description>&lt;p&gt;After about a &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods-app/graphs/contributors&quot;&gt;year of work&lt;/a&gt;, with the release of &lt;a href=&quot;http://blog.cocoapods.org/CocoaPods-1.0/&quot;&gt;CocoaPods 1.0&lt;/a&gt;, the corresponding Mac App is also ready for public usage. &lt;/p&gt;

&lt;p&gt;This is no big reveal, we&amp;#39;ve been advertising it&amp;#39;s existence on our websites for a while. I&amp;#39;ve already talked a little bit about the tech behind the &lt;a href=&quot;https://blog.cocoapods.org/CocoaPods-App&quot;&gt;Mac App&lt;/a&gt;, so this post is the one that makes you say your team &lt;em&gt;&amp;quot;we should use this instead of the gem&amp;quot;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;So let me put &lt;a href=&quot;/assets/blog_img/app-1.0/hat-on.jpg&quot;&gt;my best hat on&lt;/a&gt;, and try to pursuade you that using the CocoaPods Mac App is a &lt;em&gt;great idea.&lt;/em&gt;&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h2 id=&quot;what-problem-does-this-solve&quot;&gt;What problem does this solve?&lt;/h2&gt;

&lt;p&gt;CocoaPods exists within the ruby ecosystem. The majority of Cocoa developers don&amp;#39;t have much overlap with writing ruby programs. Installing and maintaining multiple versions of command-line tools like CocoaPods is something that people have to learn in order to use CocoaPods effectively. &lt;/p&gt;

&lt;p&gt;This creates a problem which &lt;a href=&quot;https://guides.cocoapods.org/using/a-gemfile.html&quot;&gt;Bundler solves&lt;/a&gt; really well, but now you&amp;#39;re starting to really dive into the ruby ecosystem and the pre-requisite knowledge to contribute raises again. While I&amp;#39;m on my soap-box, if you&amp;#39;re using the &lt;a href=&quot;https://rubygems.org/gems/cocoapods&quot;&gt;CocoaPods&lt;/a&gt; and &lt;a href=&quot;https://rubygems.org/gems/fastlane&quot;&gt;Fastlane&lt;/a&gt; gems in an app, you probably should be using &lt;a href=&quot;http://bundler.io&quot;&gt;Bundler&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So the CocoaPods app hosts everything. Literally, it has it&amp;#39;s own self-contained copies of &lt;code&gt;bzr&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;mercurial&lt;/code&gt;, &lt;code&gt;ncurses&lt;/code&gt;, &lt;code&gt;openssl&lt;/code&gt;, &lt;code&gt;pkg-config&lt;/code&gt;, &lt;code&gt;ruby&lt;/code&gt;, &lt;code&gt;scons&lt;/code&gt;, &lt;code&gt;serf&lt;/code&gt;, &lt;code&gt;subversion&lt;/code&gt;, &lt;code&gt;yaml&lt;/code&gt; and &lt;code&gt;zlib&lt;/code&gt;. This allows the CocoaPods team to ensure consistent behavior across all user setups.&lt;/p&gt;

&lt;p&gt;This concept is not new for Cocoa developers, as Xcode has been embedding its own dependencies inside it&amp;#39;s &lt;code&gt;.app&lt;/code&gt; since it moved to the Mac App Store. The advantage from a user&amp;#39;s perspective is that it works, and you can install your own crazy version of &lt;code&gt;git&lt;/code&gt;, or &lt;code&gt;curl&lt;/code&gt; or &lt;code&gt;ruby&lt;/code&gt;, and it just works.&lt;/p&gt;

&lt;h2 id=&quot;what-does-it-do-well&quot;&gt;What does it do well?&lt;/h2&gt;

&lt;p&gt;Glad you asked, &amp;#39;cause it does two things really well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Running &lt;code&gt;pod install&lt;/code&gt; or &lt;code&gt;pod update&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Editing a Podfile&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That was basically the spec for the app from day 1. Once &lt;a href=&quot;https://twitter.com/alloy/&quot;&gt;@alloy&lt;/a&gt; had proved that &lt;code&gt;pod install/update&lt;/code&gt; was working, &lt;a href=&quot;https://twitter.com/nate_west&quot;&gt;@nate_west&lt;/a&gt; and I took over and started working on the latter.&lt;/p&gt;

&lt;h3 id=&quot;podfile-editing&quot;&gt;Podfile Editing&lt;/h3&gt;

&lt;p&gt;Some of these features are mundane, &lt;em&gt;&amp;quot;hey, wow, syntax highlighting&amp;lt;/sarcasm&amp;gt;&amp;quot;&lt;/em&gt; but others are really fascinating deep levels of context-specific integration that you&amp;#39;d expect from an IDE.&lt;/p&gt;

&lt;p&gt;We&amp;#39;ve started out with syntax highlighting, and then added useful examples of auto-completion results that show how to use the Podfile DSL.&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/app-1.0/useful-autocomplete.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/app-1.0/useful-autocomplete.png&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;The app will auto-complete your pods, including private pods. This feels magical when you don&amp;#39;t expect it. We&amp;#39;ve been having discussions about ways to introduce more of the internal CocoaPods knowledge into the &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods-app/issues/311&quot;&gt;auto-complete like this&lt;/a&gt; - you&amp;#39;re welcome to help out.&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/app-1.0/autocomplete-pods.png  &#39;&gt;&lt;img  src=&#39;/assets/blog_img/app-1.0/autocomplete-pods.png&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;The app will generate an overview of what your integration will look like without needing to be installed, so you can understand what CocoaPods &lt;em&gt;will&lt;/em&gt; do before it has done it.&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/app-1.0/integration-overview.png  &#39;&gt;&lt;img  src=&#39;/assets/blog_img/app-1.0/integration-overview.png&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;The app provides a UI for updating your Specs repos, you can find out a little bit more about why this is needed in our &lt;a href=&quot;/Master-Spec-Repo-Rate-Limiting-Post-Mortem&quot;&gt;Master spec-repo rate limiting post‑mortem&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/app-1.0/update-specs.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/app-1.0/update-specs.png&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;It also has the ability to start a new CocoaPods project, or to even remove CocoaPods from a project entirely. I don&amp;#39;t want to give away all of the app&amp;#39;s secrets though, so you should give it a test run.&lt;/p&gt;

&lt;p&gt;&lt;center&gt;
  &lt;a href = &quot;https://cocoapods.org/app&quot; style=&quot;margin-top: 100px; background: #4A90E2; border-radius: 12px; color: white; padding: 20px;&quot;&gt;Check the site&lt;/a&gt;
&lt;a href = &quot;https://github.com/CocoaPods/CocoaPods-app/releases/download/1.0.0/CocoaPods.app-1.0.0.tar.bz2/&quot; style=&quot;margin-top: 100px; background: #4A90E2; border-radius: 12px; color: white; padding: 20px;&quot;&gt;Download App&lt;/a&gt;
&lt;/center&gt;&lt;/p&gt;

&lt;h3 id=&quot;thanks&quot;&gt;Thanks&lt;/h3&gt;

&lt;p&gt;It wouldn&amp;#39;t be an announcement without a thanks to &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods-app/graphs/contributors&quot;&gt;people involved&lt;/a&gt;, it&amp;#39;s a fascinating project to work on due to the interesting &lt;a href=&quot;/CocoaPods-App/&quot;&gt;layers of tech involved&lt;/a&gt;, but one of the coolest things about building this app, is that it provides a project for people who are Cocoa developers to contribute back without learning a new language. So we&amp;#39;ve been recieving a lot of PRs to the app, and it is always a joy to work with more.&lt;/p&gt;

&lt;p&gt;I want to specifically call out &lt;a href=&quot;https://github.com/nwest&quot;&gt;Nate West&lt;/a&gt;, who has been working with me on the app through-out 2016. His contributions to this project have been significant, and through this he&amp;#39;s contributed to more of our core projects. &lt;/p&gt;

&lt;p&gt;We have &lt;a href=&quot;https://github.com/cocoapods/cocoapods-app/issues&quot;&gt;a lot of ideas&lt;/a&gt; for where the app can go, and some &lt;a href=&quot;https://github.com/cocoapods/cocoapods-app/issues?q=is%3Aissue+is%3Aopen+label%3A%22easy+first+step%22&quot;&gt;low-hanging fruit&lt;/a&gt; for contributors. &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods-app#building-for-development&quot;&gt;Why not help us with take it somewhere new?&lt;/a&gt;&lt;/p&gt;
</description>
    <pubDate>Wed, 11 May 2016 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-App-1.0</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-App-1.0</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 1.0</title>
    <description>&lt;p&gt;I&amp;#39;m incredibly happy to say that, after an incredible four and a half years of development, we just released CocoaPods 1.0. It&amp;#39;s been a long road to get here, but the journey has told the story of the larger Cocoa open source community -- from new versions of Xcode to new languages and platforms, CocoaPods has grown over the years to support a staggering number of developers.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Across all of our various projects, we&amp;#39;ve accumulated ~20,000 commits by ~400 developers, &lt;a href=&quot;https://github.com/search?l=&amp;q=user%3Acocoapods&amp;ref=advsearch&amp;state=closed&amp;type=Issues&amp;utf8=%E2%9C%93&quot;&gt;closing ~22,000 issues&lt;/a&gt; -- it’s truly been a community effort to get here to &lt;a href=&quot;https://feeds.cocoapods.org&quot;&gt;~19,000 pods&lt;/a&gt; and ~86,000 versions. With this release, we&amp;#39;re committing to keep CocoaPods stable, and promising that it&amp;#39;s ready to be used in production (see &lt;a href=&quot;https://github.com/CocoaPods/guides.cocoapods.org/blob/ad3f451a69c9def22675aca77cc721853eebd82b/source/using/faq.html.md#cocoapods-is-not-ready-for-prime-time-yet&quot;&gt;this entry&lt;/a&gt; in our FAQ we&amp;#39;ve been dying to delete for &lt;em&gt;years&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Since &lt;a href=&quot;http://blog.cocoapods.org/Stats/&quot;&gt;adding stats&lt;/a&gt; a year ago, we got a real idea for the &lt;a href=&quot;http://metrics.cocoapods.org/api/v1/status&quot;&gt;scale of CocoaPods’ impact&lt;/a&gt;. CocoaPods has been used to integrate ~285,000,000 pods into ~850,000 unique Xcode targets.&lt;/p&gt;

&lt;h2 id=&quot;changes&quot;&gt;Changes&lt;/h2&gt;

&lt;p&gt;Let&amp;#39;s get the changes in 1.0 out of the way first. The overarching principle we followed was to prepare CocoaPods, the tool, for the next five years - rather than introducing any individual feature. CocoaPods is a tool that many rely upon to get their work done, and we don&amp;#39;t take that trust lightly -- we decided to make breaking changes in one fell swoop so we won&amp;#39;t need to do so again for a &lt;a href=&quot;http://semver.org&quot;&gt;long time&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The following are the highlights of the 1.0 release, but it’s been seven months since our last minor release, 0.39 (four and a half of those were the 1.0 beta period). As you might imagine, we’ve accrued quite a few changes, big and small, and you can find the summary of all 750 of those commits in the &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/releases/tag/1.0.0&quot;&gt;CHANGELOG&lt;/a&gt;. (The CHANGELOGs for the other projects under the CocoaPods organization likewise detail all of the other changes we’ve made during this time.)&lt;/p&gt;

&lt;h3 id=&quot;podfile-dsl&quot;&gt;Podfile DSL&lt;/h3&gt;

&lt;p&gt;By far the largest and most disruptive change, we&amp;#39;ve altered the way Podfiles work to make them better align with how we develop Cocoa applications. We recently put out a &lt;a href=&quot;https://blog.cocoapods.org/CocoaPods-1.0-Migration-Guide&quot;&gt;migration guide&lt;/a&gt; a few months ago detailing the majority of the changes -- we anticipate that most people will be able to migrate the most complicated of Podfiles in under ten minutes.&lt;/p&gt;

&lt;p&gt;Here’s the tl;dr:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;All targets have to be explicitly defined in the Podfile, and their names have to match up with the target name in Xcode.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Some command line options have been moved to &lt;a href=&quot;https://guides.cocoapods.org/syntax/podfile.html#install_bang&quot;&gt;Podfile installation options&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There’s a new &lt;a href=&quot;https://guides.cocoapods.org/syntax/podfile.html#inherit_bang&quot;&gt;target inheritance option&lt;/a&gt; that’s made to allow test targets to only inherit the search paths of an app target.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://guides.cocoapods.org/syntax/podfile.html#abstract_target&quot;&gt;Abstract targets&lt;/a&gt; are now a thing. This makes sharing dependencies across platforms a lot less repetitive.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;improved-linter&quot;&gt;Improved Linter&lt;/h3&gt;

&lt;p&gt;One of the nice features CocoaPods provides is the ability to &lt;code&gt;lint&lt;/code&gt; a pod, ensuring the Podspec is well-formed, and giving users confidence that the libraries they’re integrating can compile for the platforms declared in the Podspec. In 1.0, we go that final mile -- &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/pull/4105&quot;&gt;pods will be compiled and imported into an actual app&lt;/a&gt; to guarantee that no strange build or import errors come up.&lt;/p&gt;

&lt;h3 id=&quot;improved-sources-handling&quot;&gt;Improved Sources Handling&lt;/h3&gt;

&lt;p&gt;As we &lt;a href=&quot;http://blog.cocoapods.org/Master-Spec-Repo-Rate-Limiting-Post-Mortem&quot;&gt;posted about last week&lt;/a&gt;, we&amp;#39;ve made major improvements to how we handle updating sources to ensure that the Specs repo remains fast, usable and consistent. We’re happy this issue surfaced before 1.0 -- it gave us the push we needed to revisit some of the assumptions made before CocoaPods reached its current scale, and ought to provide a better user experience in the long run.&lt;/p&gt;

&lt;h3 id=&quot;automatic-deintegration&quot;&gt;Automatic Deintegration&lt;/h3&gt;

&lt;p&gt;Changing the targets in your Podfile will no longer cause things to break when you go to build in Xcode. We’ve also made &lt;code&gt;cocoapods-deintegrate&lt;/code&gt; a default plugin and &lt;code&gt;pod install&lt;/code&gt; will now ensure that any target &lt;em&gt;not&lt;/em&gt; being integrated with CocoaPods has all traces of CocoaPods removed.&lt;/p&gt;

&lt;h3 id=&quot;cocoapods-master-specs-repo-lockdown&quot;&gt;CocoaPods Master Specs Repo Lockdown&lt;/h3&gt;

&lt;p&gt;When we &lt;a href=&quot;http://blog.cocoapods.org/CocoaPods-Trunk&quot;&gt;announced trunk&lt;/a&gt; almost two years ago, we began the process of locking down the &lt;a href=&quot;https://github.com/CocoaPods/Specs&quot;&gt;CocoaPods master specs repository&lt;/a&gt;. With CocoaPods 1.0 comes a policy change that completes that work -- we will no longer be accepting pull requests to the specs repo. In order to ensure pod owners still have full control, we’ve introduce the &lt;code&gt;pod trunk deprecate&lt;/code&gt; and &lt;code&gt;pod trunk delete&lt;/code&gt; commands. While we strongly advise against deleting podspecs from the specs repo, we’re putting that decision in the hands of pod owners.&lt;/p&gt;

&lt;h2 id=&quot;the-past-five-years&quot;&gt;The Past Five Years&lt;/h2&gt;

&lt;p&gt;CocoaPods began its life &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/commit/fd2bc0a7cc4c49ddc37edb2a16398f8cfb06132e&quot;&gt;almost five years ago&lt;/a&gt; as a project started by &lt;a href=&quot;https://twitter.com/alloy&quot;&gt;Eloy Durán&lt;/a&gt;, taking inspiration from Bundler and RubyGems in lieu of any system provided by Apple.&lt;/p&gt;

&lt;p&gt;The Cocoa ecosystem has been an interesting place to run a dependency manager, given the lack of control CocoaPods has on the underlying toolchain. It’s created some interesting problems, and the occasional nightmare. In the last year, Apple has &lt;a href=&quot;http://www.economist.com/blogs/babbage/2012/07/operating-systems-0&quot;&gt;moved&lt;/a&gt; into the space with &lt;a href=&quot;https://swift.org/package-manager/&quot;&gt;Swift Package Manager&lt;/a&gt;, and we’re really optimistic about what it means for the community on the whole.&lt;/p&gt;

&lt;p&gt;CocoaPods isn’t going anywhere any time soon -- we’ve poured our hearts into this project, and are so grateful for all the time and love it’s gotten from people on the team as well as all our users. There’s something thrilling about working on a project that has such large ambitions, and that people choose to believe in for their day-to-day work. As long as you all are using CocoaPods, we will continue to work hard to improve it. 1.0 is just the first step on that path.&lt;/p&gt;

&lt;h2 id=&quot;thanks&quot;&gt;Thanks&lt;/h2&gt;

&lt;p&gt;As I mentioned earlier, CocoaPods owes an enormous amount to our community as a whole as CocoaPods has always been a reflection of the community. None of this would&amp;#39;ve been possible without &lt;a href=&quot;https://cocoapods.org/about#team&quot;&gt;&lt;em&gt;everyone&lt;/em&gt; pitching in&lt;/a&gt; to make it happen.&lt;/p&gt;

&lt;p&gt;However, there are a few people in particular I&amp;#39;d like to thank, because without their time CocoaPods would never have reached 1.0.&lt;/p&gt;

&lt;h3 id=&quot;eloy-dur-n&quot;&gt;&lt;a href=&quot;https://twitter.com/alloy&quot;&gt;Eloy Durán&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Eloy started CocoaPods, and is famously our &amp;#39;final boss&amp;#39;. In addition to his vision for founding the project, Eloy has been brave enough to &lt;a href=&quot;http://blog.cocoapods.org/The-captain-leaves-the-bridge&quot;&gt;let others take the mantle&lt;/a&gt; and step into leadership. He established the &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/wiki/Communication-&amp;-Design-Rules&quot;&gt;team culture&lt;/a&gt; and is still often actively engaged, from helping with issues to building the foundations for the &lt;a href=&quot;http://blog.cocoapods.org/CocoaPods-App&quot;&gt;Mac app&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;fabio-pelosin&quot;&gt;&lt;a href=&quot;https://twitter.com/fabiopelosin&quot;&gt;Fabio Pelosin&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Fabio was a whirlwind for CocoaPods -- he came with no Ruby experience and over the course of a few years built a lot of the infrastructure that’s still in place today. Fabio still has the largest number of commits to CocoaPods projects, a title that won’t be wrested from him for a long time to come. He provided so much positive energy when handling thousands of GitHub issues in the early days.&lt;/p&gt;

&lt;h3 id=&quot;orta-therox&quot;&gt;&lt;a href=&quot;https://twitter.com/orta&quot;&gt;Orta Therox&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Orta, our Design Dictator, first joined the CocoaPods team by maintaining the pull requests on the Specs Repo, before we introduced Trunk. His first major contribution to the community was via CocoaDocs, which powered generating documentation for all pods. His work since then has been around the public-facing web infrastructure, the Mac App, community management, and design.&lt;/p&gt;

&lt;h3 id=&quot;florian-hanke&quot;&gt;&lt;a href=&quot;https://twitter.com/hanke&quot;&gt;Florian Hanke&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Florian is the only developer in this list that has never made a Cocoa app. He joined the team five years ago after meeting Eloy in Japan and has been working on the search engine for CocoaPods ever since. He was fundamental in creating Trunk, and helped out a lot with all of the CocoaPods web infrastructure simply because he enjoyed being with the group.&lt;/p&gt;

&lt;h3 id=&quot;kyle-fuller&quot;&gt;&lt;a href=&quot;https://twitter.com/kylefuller&quot;&gt;Kyle Fuller&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Kyle helped set up important processes within CocoaPods, in addition to serving as release manager for almost a year. By helping us split the core of CocoaPods into plugins, and working on tooling necessary to manage micro-projects via CI, RuboCop and Rakefiles, Kyle laid the foundation for CocoaPods’ internal project management.&lt;/p&gt;

&lt;h3 id=&quot;marius-rackwitz&quot;&gt;&lt;a href=&quot;https://twitter.com/mrackwitz&quot;&gt;Marius Rackwitz&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Marius gave himself one of the hardest jobs as a starter project - building &lt;a href=&quot;http://blog.cocoapods.org/CocoaPods-0.36&quot;&gt;Frameworks support&lt;/a&gt; for CocoaPods. This has been a multi-year project in reality, with edge-cases still popping up as the platforms evolve.&lt;/p&gt;

&lt;h3 id=&quot;boris-b-gling&quot;&gt;&lt;a href=&quot;https://twitter.com/NeoNacho&quot;&gt;Boris Bügling&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Boris has devoted considerable energy into ensuring CocoaPods supports the dizzying array of platforms, target types and Xcode project settings used in modern Cocoa apps. Additionally, he has been our consistent Triagemaster General in the fight to keep our issues under control.&lt;/p&gt;

&lt;h3 id=&quot;samuel-giddins&quot;&gt;&lt;a href=&quot;https://twitter.com/segiddins&quot;&gt;Samuel Giddins&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;That’s me! I’ll do my best not to brag, but given I’m pushing the button (or typing a bunch of esoteric commands into a terminal) that actually does the release, I figured I’d add myself to the list. Since joining the CocoaPods Core team about two years ago, I’ve spent more hours than I can count implementing crazy new features and investigating the weirdest bugs. It’s been an absolute blast, and CocoaPods is as big a part of my life as anything else at this point. I look forward to the next 3000 commits on this little project of ours.&lt;/p&gt;

&lt;h3 id=&quot;sponsors&quot;&gt;Sponsors&lt;/h3&gt;

&lt;p&gt;In addition to all of the people who have contributed their time and expertise to the project, we&amp;#39;ve been graciously sponsored in various ways over the past couple of years. First and foremost I’d like to thank &lt;a href=&quot;http://www.capitalone.io/&quot;&gt;Capital One&lt;/a&gt;, who have been sponsoring me since October, and thus supporting the majority of the 1.0-specific work that has been done since then. Additionally,  I’d be remiss if we didn’t thank &lt;a href=&quot;https://artsy.net&quot;&gt;Artsy&lt;/a&gt;, &lt;a href=&quot;http://www.usebutton.com/&quot;&gt;Button&lt;/a&gt;, &lt;a href=&quot;http://discontinuity.eu/&quot;&gt;Discontinuity&lt;/a&gt;, &lt;a href=&quot;http://www.fngtps.com/&quot;&gt;Fingertips&lt;/a&gt;, &lt;a href=&quot;https://www.heroku.com/&quot;&gt;Heroku&lt;/a&gt;, &lt;a href=&quot;https://realm.io/&quot;&gt;Realm&lt;/a&gt;, &lt;a href=&quot;http://www.rubymotion.com/&quot;&gt;RubyMotion&lt;/a&gt;, &lt;a href=&quot;https://www.sauspiel.de/&quot;&gt;Sauspiel&lt;/a&gt;, &lt;a href=&quot;http://segment.com&quot;&gt;Segment&lt;/a&gt;, &lt;a href=&quot;https://www.slack.com/&quot;&gt;Slack&lt;/a&gt;, &lt;a href=&quot;https://www.soundcloud.com/&quot;&gt;SoundCloud&lt;/a&gt;, &lt;a href=&quot;https://www.stripe.com/&quot;&gt;Stripe&lt;/a&gt;, and &lt;a href=&quot;http://www.technologyastronauts.ch/&quot;&gt;Technology Astronauts&lt;/a&gt; for their loving sponsorship over the years. Without their support, the CocoaPods ecosystem simply could not exist in the form it does today.&lt;/p&gt;

&lt;h2 id=&quot;lets-celebrate&quot;&gt;Let&amp;#39;s Celebrate&lt;/h2&gt;

&lt;p&gt;CocoaPods has been a huge part of my life over the past two years. I know that it&amp;#39;s tempting to just say &lt;strong&gt;finally&lt;/strong&gt; right now, but I think this is an opportunity for something more -- it’s a chance for us to celebrate, as a community. CocoaPods is more than just a tool -- it’s a community of wonderful  iOS, Mac, watchOS, and tvOS developers. It&amp;#39;s a team of dedicated contributors who selflessly give back by answering issues and making pull requests. CocoaPods has been my home for the past two years, and on the occasion of our 1.0 release, I think it&amp;#39;s time we celebrate. The future is bright, and we&amp;#39;ve had a great journey getting here. Now let&amp;#39;s grab some cake and enjoy the moment.&lt;/p&gt;

&lt;p&gt;🎉 &lt;a href=&quot;https://twitter.com/segiddins&quot;&gt;segiddins&lt;/a&gt;, &lt;a href=&quot;https://github.com/segiddins&quot;&gt;Patch Master &amp;amp; Bundler of Joy&lt;/a&gt;&lt;/p&gt;
</description>
    <pubDate>Tue, 10 May 2016 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-1.0</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-1.0</guid>
  </item>
  
  
  
  <item>
    <title>Master spec-repo rate limiting post&#x2011;mortem</title>
    <description>&lt;p&gt;&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/4989&quot;&gt;Recently&lt;/a&gt; we were made aware of issues that our users had when
cloning the &lt;a href=&quot;https://github.com/CocoaPods/Specs&quot;&gt;CocoaPods Master spec-repo&lt;/a&gt;, which contains specifications for projects
shared &lt;em&gt;by&lt;/em&gt; and &lt;em&gt;with&lt;/em&gt; the community.
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/4989#issuecomment-193772935&quot;&gt;The GitHub infrastructure team&lt;/a&gt; were quick
to explain that this was because of us hitting CPU rate limits on their end, which turned out to be caused, besides the
high volume of clones, by the default options we chose to clone this repo.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;After
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/4989#issuecomment-193772935&quot;&gt;some&lt;/a&gt;
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/4989#issuecomment-193810378&quot;&gt;back&lt;/a&gt;
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/4989#issuecomment-193835710&quot;&gt;and&lt;/a&gt;
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/4989#issuecomment-193838934&quot;&gt;forth&lt;/a&gt;,
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/4989#issuecomment-193869281&quot;&gt;we&lt;/a&gt;
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/4989#issuecomment-193875012&quot;&gt;settled&lt;/a&gt;
on the following list of causes and solutions.&lt;/p&gt;

&lt;h3 id=&quot;shallow-clone&quot;&gt;Shallow clone&lt;/h3&gt;

&lt;p&gt;To ease initial setup for CocoaPods users, we performed shallow clones of spec-repos, meaning they only had to fetch the
latest state of the repo. However, this meant that the GitHub servers had to spend much more time figuring out which Git
objects the user already has, needs, and compute the deltas for those objects.&lt;/p&gt;

&lt;p&gt;Therefore, we are no longer going to shallow clone spec-repos on initial setup and we’ll automatically convert existing
shallow clones to full clones.&lt;/p&gt;

&lt;h3 id=&quot;too-many-fetches&quot;&gt;Too many fetches&lt;/h3&gt;

&lt;p&gt;To ensure the user always has access to all the available podspecs, we automatically performed a &lt;code&gt;git fetch&lt;/code&gt; on each
&lt;code&gt;pod install&lt;/code&gt; and &lt;code&gt;pod update&lt;/code&gt;. The amount of fetches this resulted in made the above shallow clone issue even worse.
That, combined with the fact that on most &lt;code&gt;pod install&lt;/code&gt; runs there was little need to actually update the repo, led to
us changing the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/pull/5017&quot;&gt;We will no longer&lt;/a&gt; automatically update spec-repos on
&lt;code&gt;pod install&lt;/code&gt;. If a lockfile exists and podspecs are missing, an error will be raised that suggests the user to update
their spec-repos with &lt;code&gt;pod repo update&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We will still automatically update the spec-repos on &lt;code&gt;pod update&lt;/code&gt;, because that’s implicitly what the user asks for at
that time, but it’s an action taken far less often than running &lt;code&gt;pod install&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Before &lt;em&gt;any&lt;/em&gt; Master spec-repo fetching, &lt;a href=&quot;https://github.com/CocoaPods/Core/pull/313&quot;&gt;we’ll be making use&lt;/a&gt; of a GitHub
API that returns if a repo has changes in a far more efficient manner.
&lt;a href=&quot;https://developer.github.com/changes/2016-02-24-commit-reference-sha-api&quot;&gt;This API&lt;/a&gt; is also used by Homebrew for this
very same reason.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;too-many-directory-entries&quot;&gt;Too many directory entries&lt;/h3&gt;

&lt;p&gt;In the Git object model, each change to a directory results in a new ‘tree’ object and many Git operations need to
traverse this tree, which internally has to be recreated through multiple steps of deltas, each of which has to be found
and decompressed. Currently, spec-repos have a flat structure where all pod directories are in the same &lt;code&gt;Specs&lt;/code&gt;
directory, which at the time of writing has ~16K entries and consists of ~100K commits. Suffice to say, these are a lot
of very large tree objects and thus require a lot of computation.&lt;/p&gt;

&lt;p&gt;To fix this, &lt;a href=&quot;https://github.com/CocoaPods/cocoapods-repo-shard&quot;&gt;we’ll shard&lt;/a&gt; the &lt;code&gt;Specs&lt;/code&gt; directory of a spec-repo by
hashing the pod names and create sub-directories based on the first few characters of that hash, so that there will be
far fewer entries in any given sub-directory.&lt;/p&gt;

&lt;p&gt;This will make file-system level browsing of a spec-repo less intuitive, but a solution like this was required to deal
with 1 character pod names &lt;em&gt;including&lt;/em&gt; single emoji characters. Note, though, that we have
&lt;a href=&quot;https://guides.cocoapods.org/terminal/commands.html#group_specifications&quot;&gt;tooling&lt;/a&gt; that eases this, such as the
&lt;code&gt;pod spec which&lt;/code&gt; command.&lt;/p&gt;

&lt;h2 id=&quot;roll-out&quot;&gt;Roll-out&lt;/h2&gt;

&lt;p&gt;Except for the solution to the third issue, these changes have been available since version 1.0.0.beta.6. While we
already have the code in place to shard the spec-repo, activating it now would require updating the existing spec-repo
and forcing &amp;lt; 1.0.0.beta.7 users to upgrade now, which might be a hard situation for people that need time to deal with
breaking version 1.0.0 changes. We’ll be activating it not long after version 1.0.0 has been released, though, so don’t
wait too long with upgrading.&lt;/p&gt;

&lt;h2 id=&quot;unable-to-upgrade-just-yet&quot;&gt;Unable to upgrade just yet?&lt;/h2&gt;

&lt;p&gt;If for whatever reason you cannot upgrade to version 1.0.0 just yet, you can perform the following steps to convert your
clone of the Master spec-repo from a shallow to a full clone:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;$ cd ~/.cocoapods/repos/master
$ git fetch --unshallow
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h2 id=&quot;thanks&quot;&gt;Thanks&lt;/h2&gt;

&lt;p&gt;We would like to thank &lt;a href=&quot;https://github.com/mhagger&quot;&gt;@mhagger&lt;/a&gt;, &lt;a href=&quot;https://github.com/vmg&quot;&gt;@vmg&lt;/a&gt;, and
&lt;a href=&quot;https://github.com/mikemcquaid&quot;&gt;@mikemcquaid&lt;/a&gt; for helping diagnose the issues and our understanding thereof;
&lt;a href=&quot;https://github.com/arthurnn&quot;&gt;@arthurnn&lt;/a&gt; for his help with optimizing the way sharding should work, as well as GitHub in
general for their continued generous sponsorship of hosting resources.&lt;/p&gt;

&lt;p&gt;In addition we would like to thank &lt;a href=&quot;https://github.com/segiddins&quot;&gt;@segiddins&lt;/a&gt;,
&lt;a href=&quot;https://github.com/DanielTomlinson&quot;&gt;@DanielTomlinson&lt;/a&gt;, and &lt;a href=&quot;https://github.com/mrackwitz&quot;&gt;@mrackwitz&lt;/a&gt;, for their hard
work on implementing these solutions as soon as they did.&lt;/p&gt;
</description>
    <pubDate>Wed, 04 May 2016 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Master-Spec-Repo-Rate-Limiting-Post-Mortem</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Master-Spec-Repo-Rate-Limiting-Post-Mortem</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods Socks available for the next four weeks.</title>
    <description>&lt;p&gt;​
&lt;em&gt;TL;DR: We’re doing crowd-funded socks for charity, using Knitout. With all profit going to charity: water.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;CocoaPods was started in 2011. We are a community run project, with no large-scale corporate backing. We&amp;#39;re often asked if we&amp;#39;d do something like t-shirts or hoodies.&lt;/p&gt;

&lt;p&gt;We don&amp;#39;t want to use CocoaPods&amp;#39; popularity to make money. So, we are putting all profits into a charity. Want to know more? Go see &lt;a href=&quot;https://cocoapods.org/socks&quot;&gt;cocoapods.org/socks&lt;/a&gt;.&lt;/p&gt;
</description>
    <pubDate>Mon, 22 Feb 2016 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Socks</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Socks</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 1.0 Migration Guide</title>
    <description>&lt;h4 id=&quot;major-1-0-changes-tl-dr&quot;&gt;Major 1.0 changes TL:DR&lt;/h4&gt;

&lt;p&gt;​&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You now have to define targets. Previously there was an available implicit target.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;target&lt;/code&gt; has to represent an Xcode target.&lt;/li&gt;
&lt;li&gt;When you want to represent a collection of pods that go to multiple targets, use an &lt;code&gt;abstract_target&lt;/code&gt; then add targets inside that. Pod dependencies are inherited by nested targets.&lt;/li&gt;
&lt;li&gt;Targets that want to know about the pods for a target but don&amp;#39;t need linking (for example, Test targets) can define that they inherit pods via their search paths (&lt;code&gt;inherit! :search_paths&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:exclusive =&amp;gt; true&lt;/code&gt; and &lt;code&gt;link_with&lt;/code&gt; have been removed in favour of the above.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;xcodeproj&lt;/code&gt; is renamed &lt;code&gt;project&lt;/code&gt; to make the DSL vocabulary consistent.&lt;/li&gt;
&lt;li&gt;We&amp;#39;ve removed the ability to declare &lt;code&gt;:head&lt;/code&gt; on a &lt;code&gt;pod&lt;/code&gt;—you can either use the &lt;code&gt;:podspec&lt;/code&gt; option or point directly to the upstream repo (via &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;:svn&lt;/code&gt;, etc.).&lt;/li&gt;
&lt;li&gt;You can now declare installation options inside the &lt;code&gt;Podfile&lt;/code&gt; via &lt;code&gt;install!&lt;/code&gt; (e.g. &lt;code&gt;install! &amp;#39;cocoapods&amp;#39;, :deterministic_uuids =&amp;gt; false, :integrate_targets =&amp;gt; false&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;We&amp;#39;ve removed all DSL attributes that were classed as deprecated.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pod trunk delete&lt;/code&gt; and &lt;code&gt;pod trunk deprecate&lt;/code&gt; have been introduced.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pod search&lt;/code&gt; improvements (this is great because it searches all your private spec repos too).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pod lib lint&lt;/code&gt; and &lt;code&gt;pod spec lint&lt;/code&gt; will verify that your pod can actually be imported.&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- more --&gt;

&lt;h3 id=&quot;re-targeting&quot;&gt;Re-targeting&lt;/h3&gt;

&lt;p&gt;A large fraction of the bug reports we receive is due to ambiguity in the &lt;code&gt;Podfile&lt;/code&gt;. It gave a lot of freedom to create all kinds of CocoaPods setups that would work by luck of implementation details, or work but are significantly more complex than they needed to be.&lt;/p&gt;

&lt;p&gt;In the 0.x branches the name of a target could be anything. If it was the name of a matching target then it would automatically link to the target, but if not it would create a &lt;code&gt;Pods-[Name]&lt;/code&gt; target and you could use &lt;code&gt;link_to&lt;/code&gt; to connect it to targets.&lt;/p&gt;

&lt;p&gt;In 1.0+ a target has to correspond to a real Xcode target. In order to support use cases where Pods can be shared among multiple targets we added &lt;code&gt;abstract_target&lt;/code&gt;. For example:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;c1&quot;&gt;# Note: There are no targets called &amp;quot;Shows&amp;quot; in any Xcode projects&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;abstract_target&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Shows&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ShowsKit&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Fabric&amp;#39;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Has its own copy of ShowsKit + ShowWebAuth&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ShowsiOS&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ShowWebAuth&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Has its own copy of ShowsKit + ShowTVAuth&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ShowsTV&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ShowTVAuth&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: In this example, it would be simpler to just not use the &lt;code&gt;abstract_target&lt;/code&gt; at all, but it&amp;#39;s an example, so let me off.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This change enforces a much stronger connection between the CocoaPods target, and makes it impossible to make a &lt;code&gt;Podfile&lt;/code&gt; like this:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ShowsKit&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;due to it having ambiguous behavior. However, the following is possible, as it declares what target to link to:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ShowsKit&amp;#39;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ShowsiOS&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;This works because the root level is classed as an unnamed &lt;code&gt;abstract_target&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id=&quot;more-examples&quot;&gt;More Examples&lt;/h4&gt;

&lt;p&gt;Let&amp;#39;s take a look at a &lt;a href=&quot;https://github.com/CocoaPods/pod-template/pull/144&quot;&gt;really common&lt;/a&gt; example that is shipped as the 0.x &lt;code&gt;pod lib create&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;https://github.com/CocoaPods/Specs.git&amp;#39;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;use_frameworks!&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ORStackView_Example&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:exclusive&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ORStackView&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;../&amp;#39;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ORStackView_Tests&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:exclusive&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ORStackView&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;../&amp;#39;&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Quick&amp;#39;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;This sets up two completely independent CocoaPods targets that are exclusive to each other. Both have a copy of the library ORStackView. There is a lot going on in this &lt;code&gt;Podfile&lt;/code&gt;; contrast that to the simpler 1.0 version.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;https://github.com/CocoaPods/Specs.git&amp;#39;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;use_frameworks!&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ORStackView_Example&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;ORStackView&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;../&amp;quot;&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ORStackView_Tests&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;inherit!&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:search_paths&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Quick&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;It has an obvious hierarchy, so you can see that Pods included in &lt;code&gt;ORStackView_Example&lt;/code&gt; will be included in the &lt;code&gt;ORStackView_Tests&lt;/code&gt; target. The only new thing is &lt;code&gt;inherit! :search_paths&lt;/code&gt; which means &amp;quot;don&amp;#39;t link Pods into here, but let this target know they exist.&amp;quot; This &lt;code&gt;Podfile&lt;/code&gt; is easier to read, simpler and has less redundant information.&lt;/p&gt;

&lt;h3 id=&quot;off-with-pods-head&quot;&gt;Off with &lt;code&gt;pod&lt;/code&gt;s &lt;code&gt;:head&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Adding &lt;code&gt;:head&lt;/code&gt; to a &lt;code&gt;pod&lt;/code&gt; nearly always worked, except when it didn&amp;#39;t. It is documented as this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Finally, instead of a version, you can specify the :head flag. This will use the pod’s latest version spec version, but force the download of the ‘bleeding edge’ version. Use this with caution, as the spec might not be compatible with the source material anymore.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It was a tool that was really useful back when CocoaPods was small and it was hard to persuade people it was worth supporting any dependency manager for their projects. That time has long passed and now the flexibility that this attribute originally offered has fallen onto the side of &amp;quot;not worth keeping around.&amp;quot; It would introduce extremely hard-to-debug issues for developers expecting it to mean &amp;quot;use the latest version of their code repo.&amp;quot; You can either use the &lt;code&gt;:podspec&lt;/code&gt; option or point directly to the upstream repo (via &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;:svn&lt;/code&gt;, etc.).&lt;/p&gt;

&lt;h3 id=&quot;options-to-install&quot;&gt;Options to &lt;code&gt;install!&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;In the past when we have had to support configuration options for CocoaPods we have used environment variables. These act like NSUserDefaults in that someone who knows the key can make a change, but otherwise they remain &lt;a href=&quot;https://github.com/ChatSecure/ChatSecure-iOS/commit/d766400c2d8e935ab49daf5ef5f9bf28c760e484&quot;&gt;quite hidden&lt;/a&gt;. Though, sometimes they could be command line APIs too like &lt;code&gt;--no-integrate&lt;/code&gt;. While these were conscious choices they eventually added up to being inconsistent over time, and we&amp;#39;ve opted to move in favour of centralizing the information in the Podfile. You can see all the available options &lt;a href=&quot;https://guides.cocoapods.org/syntax/podfile.html#install_bang&quot;&gt;in the guides&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This means that every developer on your team will have the same output on &lt;code&gt;pod install&lt;/code&gt; regardless of their environment, whether in &lt;a href=&quot;https://cocoapods.org/app&quot;&gt;CocoaPods.app&lt;/a&gt; or in the command line. We&amp;#39;ve left the DSL attribute &lt;code&gt;install!&lt;/code&gt; quite open so that &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/2729&quot;&gt;future features&lt;/a&gt; can be built with this attribute.&lt;/p&gt;

&lt;h3 id=&quot;building-for-stability&quot;&gt;Building for stability&lt;/h3&gt;

&lt;p&gt;A lot of the work for 1.0 has been around trying to simplify CocoaPods in order to provide long-lasting infrastructure. This is especially important given that the foundations that CocoaPods builds upon often shifts &lt;a href=&quot;https://en.wikipedia.org/wiki/Apple_Worldwide_Developers_Conference&quot;&gt;every June&lt;/a&gt; and the project is run by a handful of people in their spare time.&lt;/p&gt;

&lt;p&gt;We also understand that running CocoaPods is about dealing with humans. With our default CocoaPods Specs repo, for example, we&amp;#39;ve had a policy of it being &lt;a href=&quot;https://github.com/CocoaPods/Specs/pull/12199&quot;&gt;read-only&lt;/a&gt; since it was introduced &lt;a href=&quot;http://blog.cocoapods.org/CocoaPods-Trunk/&quot;&gt;CocoaPods Trunk&lt;/a&gt;. In reality though we&amp;#39;ve had to support editing and deleting Pods by hand on a relatively regular basis with the CocoaPods dev team being the ones having to make those decisions. With 1.0.0 we&amp;#39;ve built the infrastructure to support deleting and deprecating a CocoaPod and a CocoaPod version. We don&amp;#39;t recommend it, but it&amp;#39;s now there, and it&amp;#39;s up to library owners to make the decisions around whether it&amp;#39;s fine for their users to remove dependencies.&lt;/p&gt;

&lt;h3 id=&quot;1-0&quot;&gt;1.0&lt;/h3&gt;

&lt;p&gt;Finally, and probably the most important point. Once the betas are finished, I can get rid of this FAQ entry:&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4 id=&quot;cocoapods-is-not-ready-for-prime-time-yet&quot;&gt;&amp;quot;CocoaPods is not ready for prime-time yet.”&lt;/h4&gt;

&lt;p&gt;Correct. Version 1.0.0 will be the milestone where we feel confident that all the basic requirements of a Cocoa dependency manager are fulfilled.&lt;/p&gt;

&lt;p&gt;Once we reach the 1.0.0 milestone we will –for the first time ever– contact the community at large through mailing-lists such as cocoa-dev.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Which has been annoying me for as long as I&amp;#39;ve been working on CocoaPods&amp;#39; infrastructure / design.&lt;/p&gt;

&lt;p&gt;🎉&lt;/p&gt;
</description>
    <pubDate>Wed, 03 Feb 2016 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-1.0-Migration-Guide</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-1.0-Migration-Guide</guid>
  </item>
  
  
  
  <item>
    <title>RGSoC</title>
    <description>&lt;p&gt;During Summer 2015, we had the delightful opportunity to contribute to CocoaPods as part of Rails Girls Summer of Code (RGSoC). We were generously hosted and coached by GitHub. How did two newbie developers begin to work on open source, you might ask?&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h2 id=&quot;what-is-rails-girls-summer-of-code&quot;&gt;What is Rails Girls Summer of Code?&lt;/h2&gt;

&lt;p&gt;RGSoC is a global fellowship that funds two-woman teams to contribute to Open Source projects during a three month period. Among the available projects to work on we found CocoaPods the most interesting, even though it was on the challenging side for our skill level. For the application to be considered, we needed to find people that were willing to coach us with our coding adventure, and preferably, a place to work from. We reached out to GitHub, who offered us workspace. Five engineers signed up to coach us for an hour each week. With this configuration we were one of 16 teams accepted.&lt;/p&gt;

&lt;h2 id=&quot;how-we-met-the-team&quot;&gt;How we met the team&lt;/h2&gt;

&lt;p&gt;We met the CocoaPods team the weekend before Alt-Conf at Limon, a Peruvian restaurant. When &lt;a href=&quot;https://twitter.com/kylefuller&quot;&gt;Kyle Fuller&lt;/a&gt;, one of our CocoaPods coaches sent us an address and an invite for a dinner party, I thought we were meeting up for a pot luck. CocoaPods members must really enjoy cooking if they are going to host an entire dinner party was my first thought. The CocoaPods team took up nearly the entire second floor. Although, not one to clam up when meeting people, the thought of meeting an entire group, and one that chose our team to work on their Open Source project made me nervous. It was scary, at first, to meet 14 different people that might already know each other. To ease the anxiety I remembered that we had already met Kyle Fuller and &lt;a href=&quot;https://twitter.com/segiddins&quot;&gt;Samuel Giddins&lt;/a&gt;, at a cafe in SOMA, and they were friendly. At Limon, we introduced each other, and listened to conversations around us. We learned a bit more about dependency managers through conversational CocoaPods. Hearing terms drop when we had only a faint idea what they meant was no deterrent, it was fuel to the curiosity fire. After dinner, we walked around the Mission, and ended up at the ice cream shop Xanath. The week we met the CocoaPods core team kicked off many other great first time experiences at &lt;a href=&quot;http://altconf.com/&quot;&gt;AltConf&lt;/a&gt;, here in San Francisco.&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/RGSoC/CocoaGemsMentors.jpg &#39;&gt;&lt;img  src=&#39;/assets/blog_img/RGSoC/CocoaGemsMentors.jpg&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;h2 id=&quot;how-we-organized-the-work&quot;&gt;How we organized the work&lt;/h2&gt;

&lt;p&gt;The student teacher ratio was opposite from what a learning environment usually looks like. We had 11 dedicated mentors who were willing to spend time to help us throughout the project. Most collaboration with our mentors happened remotely and many of our team members were based in other countries and timezones. Communication often started in one of the three Slack channels from organizations involved working with our project. Longer sessions and pairing were planned in advance.&lt;/p&gt;

&lt;p&gt;To schedule sessions with mentors and coaches in different time zones, we used a combination of Google Calendar, Slack, and texts. For screen sharing, we found ScreenHero, Google Hangouts, Blue Jeans, and Skype for communication. Having screen sharing alternatives was necessary since audio, and screen sharing delays are unavoidable. In the same way that tools are unpredictable, so are life events. Flexibility is key. Not enough sleep, double scheduling, conferences, and the cold all happened. Communicating with as much time in advance when something changes, using the calendar religiously and setting alerts to avoid forgetting sessions and due dates is the way to go.&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/RGSoC/CocoaGemsCoaches.jpg &#39;&gt;&lt;img  src=&#39;/assets/blog_img/RGSoC/CocoaGemsCoaches.jpg&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;h2 id=&quot;what-we-worked-on-together&quot;&gt;What we worked on together&lt;/h2&gt;

&lt;p&gt;During the project we worked on a couple of different things. Here are some of the main things we worked on for CocoaPods.&lt;/p&gt;

&lt;p&gt;Together with &lt;a href=&quot;https://twitter.com/neonacho&quot;&gt;Boris Bügling&lt;/a&gt; we paired on creating &lt;a href=&quot;https://rubygems.org/gems/cocoapods-label&quot;&gt;cocoapods-label&lt;/a&gt;, a plug-in for CocoaPods that annotates the Podfile with its Pod description. This is great for everyone with short memory that wants to remember what the different pods do in an efficient way. We started working on this while Boris visited San Francisco, during AltConf, and then, we continued working on it remotely, while screen sharing. We found that the best time to work on it was during Boris&amp;#39;s evenings which were our mornings due to a 9 hour time difference. It was great to have Boris guide us and show us how to create a new plug-in, a knowledge we would have use for in the project.&lt;/p&gt;

&lt;p&gt;When we applied to work on CocoaPods we chose to work on making CocoaPods more modular by creating plug-ins. During a planning meeting we picked issues that were interesting for us to work on.&lt;/p&gt;

&lt;h3 id=&quot;these-are-the-things-emma-worked-on&quot;&gt;These are the things Emma worked on&lt;/h3&gt;

&lt;p&gt;I chose to work on a couple of different things. Starting with what seemed like an easy task, to make so that &lt;a href=&quot;https://github.com/CocoaPods/Xcodeproj/pull/294&quot;&gt;Pods are listed case-insensitive in Xcode&lt;/a&gt;. I learned a lot about sorting and also about just finding my way around the codebase. To get that PR merged filled me with pride and energy to take on the next task. Continuing with moving the source code for &lt;a href=&quot;https://github.com/CocoaPods/cocoapods-search&quot;&gt;cocoapods-search&lt;/a&gt; to its own gem and depend on it from CocoaPods it self. There is a scaffold for &lt;a href=&quot;https://github.com/CocoaPods/cocoapods-plugin-template&quot;&gt;creating plugins&lt;/a&gt; for CocoaPods that I used that sets up the main structure of files and folders. From there on it came down to figuring out what code was responsible for search and copy that code to the newly created gem. I ran my local changes with Rake to make sure everything worked as it should. The tests also needed to be moved to the new gem and that proved to be more complicated than moving the source code, mostly since they required a lot of files in the fixture folder to run. One of the goals of extracting search to its own gem was to make it easier and safer to modify without messing something else up in the larger project. After I finished the extraction other contributors have continued to improve the search code even more which shows that the extraction did have a positive effect in that its easier to find and understand.&lt;/p&gt;

&lt;p&gt;With search finished there were still a couple of weeks left of the project. I wanted to learn more about web development and collaborated with &lt;a href=&quot;https://twitter.com/orta&quot;&gt;Orta&lt;/a&gt; on a new project called &lt;a href=&quot;https://github.com/CocoaPods/stories.cocoapods.org&quot;&gt;CocoaPods Stories&lt;/a&gt;. The idea was to give Pod users the ability to write stories about what Pods they are using and how. We didn’t make it further than the planning and research stage and we are not sure whether it will still be useful. Please ping us if you want us to contribute to this idea.&lt;/p&gt;

&lt;h3 id=&quot;these-are-the-things-karla-worked-on&quot;&gt;These are the things Karla worked on&lt;/h3&gt;

&lt;p&gt;After working on CocoaPods-label with Boris and Emma, &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/3398&quot;&gt;CocoaPods issue #3398&lt;/a&gt; &amp;#39;Extract UI module into its own gem&amp;#39;, labeled d1:easy, seemed particularly appealing. Samuel Giddins set up the project scaffolding, and we outlined the first steps to work on #3398 by breaking it down into smaller steps. To extract the User Interface module, CLAide into its own gem, so that it works in isolation of CocoaPods, we had to get rid of all CocoaPods specific language, dependencies and documentation. CocoaPods syntax was challenging to spot out initially. So, pairing with Samuel and Kyle Fuller at GitHub was crucial. After cleaning up CLAide, and freeing it of CP dependencies, writing tests for all of the left over User Interface code was the next step.&lt;/p&gt;

&lt;p&gt;For testing we used Rubocop, CodeCov, Code Climate, and Travis CI. After writing tests, and or changing tests, we had to debug quite a bit. Debugging felt like a never ending story, but it was enjoyable. We are still working on Cork, and I am looking forward to wrapping it up before Summer 2016 rolls around.&lt;/p&gt;

&lt;p&gt;Also, if you&amp;#39;re curious about the name, we found it fitting to name the CocoaPods-free User Interface library &lt;a href=&quot;https://github.com/CocoaPods/Cork&quot;&gt;Cork&lt;/a&gt;, because Cork like CocoaPods, is also a commonly harvested part of the tree.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;We encourage other open source projects to be a part of &lt;a href=&quot;http://railsgirlssummerofcode.org/guide/projects/&quot;&gt;next years RGSoC&lt;/a&gt;. Teaching and learning are both great opportunities to become better at taking in information, learning how to process and apply new concepts. Not to mention, when you teach something that you know, or think you know it really encourages you to examine your own beliefs about the concept you are teaching. As a participant of the program, learning how to stay humble was a huge lesson, and asking for clarification was one of the greatest gains.&lt;/p&gt;

&lt;p&gt;Some of the other gains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We could work on tasks that caught our interest.&lt;/li&gt;
&lt;li&gt;We developed experience working on a project in production&lt;/li&gt;
&lt;li&gt;Learning from professionals&lt;/li&gt;
&lt;li&gt;Following the other RGSoC teams around the world working on other open source projects.&lt;/li&gt;
&lt;li&gt;More cost effective than attending a boot camp which we considered when we applied to RGSoC.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some of the hurdles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Volunteer based teaching means that our mentors prioritized their work and we could not always depend on getting help when we needed it.&lt;/li&gt;
&lt;li&gt;Working with several organizations on the same project sometimes made it challenging to plan and get on the same page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It does take time to mentor but if you look at it as an investment to bring more contributors to open source it is time well spent. We also encourage other developers to take the opportunity to learn and contribute to open source.&lt;/p&gt;
</description>
    <pubDate>Fri, 29 Jan 2016 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/RGSoC</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/RGSoC</guid>
  </item>
  
  
  
  <item>
    <title>App 1.0</title>
    <description>&lt;p&gt;TLDR: CocoaPods now has a Mac App that provides a hosted Ruby experience, go check out the web page for it: &lt;a href=&quot;https://cocoapods.org/app&quot;&gt;cocoapods.org/app&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The rest of this post is about how all the pieces come together to make a CocoaPods app.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h3 id=&quot;whats-happening-under-the-hood&quot;&gt;What&amp;#39;s happening under the hood?&lt;/h3&gt;

&lt;p&gt;Let&amp;#39;s take a look at the Xcode Project.&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/xcodeproj.png&#39;&gt;&lt;img class=&quot;image-zoom&quot;  src=&#39;/assets/blog_img/app/xcodeproj.png&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;The app is three separate tools that work in combination to provide a seamless experience. You can see the targets; &lt;code&gt;CocoaPods&lt;/code&gt;, &lt;code&gt;pod&lt;/code&gt; and &lt;code&gt;ReflectionService&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id=&quot;cocoapods&quot;&gt;CocoaPods&lt;/h4&gt;

&lt;p&gt;This is the CocoaPods app, it provides an OS X GUI to common tasks for people who use CocoaPods. It also is the host to an entire environment required to use the CocoaPods&amp;#39; features it exposes. It turns out there are quite a lot of dependencies for CocoaPods once you try to replicate the common user&amp;#39;s environment.&lt;/p&gt;

&lt;p&gt;In order to make it work seamlessly we bundle: &lt;code&gt;bzr&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;mercurial&lt;/code&gt;, &lt;code&gt;ncurses&lt;/code&gt;, &lt;code&gt;openssl&lt;/code&gt;, &lt;code&gt;pkg-config&lt;/code&gt;, &lt;code&gt;ruby&lt;/code&gt;, &lt;code&gt;scons&lt;/code&gt;, &lt;code&gt;serf&lt;/code&gt;, &lt;code&gt;subversion&lt;/code&gt;, &lt;code&gt;yaml&lt;/code&gt; and &lt;code&gt;zlib&lt;/code&gt;. These are compiled dependencies sitting inside the application bundle. In the Xcode Project above, they are contained in the &lt;code&gt;bundle&lt;/code&gt; reference group.&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/resources.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/app/resources.png&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;It&amp;#39;s quite the setup in there. It&amp;#39;s very similar to how Xcode hosts all of it&amp;#39;s SDKs, compilers and apps (Instruments.app, iOS Simulator.app for example.) These folders represent a hosted environment which is well-contained and well tested. We provide the latest stable builds of these dependencies inside the app.&lt;/p&gt;

&lt;p&gt;The GUI aspect of the app is built mainly in Swift and Objective-C when necessary. It uses all the fancy modern goodies available in the latest Cocoa APIs: NSViewControllers, Storyboards and &lt;a href=&quot;https://www.objc.io/issues/14-mac/xpc/&quot;&gt;XPC&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/storyboards.png&#39;&gt;&lt;img class=&quot;image-zoom&quot;  src=&#39;/assets/blog_img/app/storyboards.png&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;It&amp;#39;s cleanly built using simple composition, and has been the source for quite a few people&amp;#39;s first open source contribution. We keep a well stocked &lt;a href=&quot;http://github.com/cocoapods/cocoapods-app/issues&quot;&gt;issue cabinet&lt;/a&gt; with well marked out issues for people wanting to help out. I aim to always put up designs early for features, making it easy for people to contribute with a specification in mind.&lt;/p&gt;

&lt;h4 id=&quot;pod&quot;&gt;pod&lt;/h4&gt;

&lt;p&gt;We don&amp;#39;t plan on replicating every feature of the command-line gem in the CocoaPods app. That&amp;#39;s just not good usage of our time. Instead we offer a way to access the command-line interface with the version of CocoaPods that is inside CocoaPods.app. We do this in the same way Xcode does, by offering command line tools:&lt;/p&gt;

&lt;p&gt;&lt;a href= &quot;/assets/blog_img/app/command-line-tools.png&quot;&gt;&lt;img src =&quot;/assets/blog_img/app/command-line-tools.png&quot; class=&quot;image-zoom&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;pod&lt;/code&gt; command is a C &lt;a href=&quot;https://github.com/rbenv/rbenv/wiki/Understanding-binstubs&quot;&gt;binstub&lt;/a&gt; which uses the Core Services API in order to work independent of the CocoaPods.app which installed it. The binstub finds the embedded ruby &lt;code&gt;pod&lt;/code&gt; command generated by RubyGems and passes along the same arguments. This means once you&amp;#39;ve installed it, you can move your app freely, and we don&amp;#39;t need to update the C binstub. Ace.&lt;/p&gt;

&lt;p&gt;As it has the same name, you don&amp;#39;t need to change any scripts or your development flow in the terminal once installed. I&amp;#39;ve been using it as my main &lt;code&gt;pod&lt;/code&gt; command for the last few months.&lt;/p&gt;

&lt;h4 id=&quot;reflectionservice&quot;&gt;ReflectionService&lt;/h4&gt;

&lt;p&gt;The CocoaPods app needs to talk to the &lt;code&gt;pod&lt;/code&gt; command provided by ruby. The simplest option is via &lt;a href=&quot;http://www.raywenderlich.com/36537/nstask-tutorial&quot;&gt;NSTask&lt;/a&gt;, which will execute a command in a shell and output text to &lt;code&gt;STDIN&lt;/code&gt; and &lt;code&gt;STERR&lt;/code&gt;. This makes it easy to run commands, but it can be hard to deal with interactivity. It&amp;#39;s effectively a one way communication pattern.&lt;/p&gt;

&lt;p&gt;There have been a few tools which bridge Ruby and Cocoa, the most notable being &lt;a href=&quot;http://www.rubymotion.com&quot;&gt;RubyMotion&lt;/a&gt;. There is however a bridge that used to come shipped with Mac OS. That is &lt;a href=&quot;http://rubycocoa.github.io&quot;&gt;RubyCocoa&lt;/a&gt;. We built support for bi-directional communication between Objective-C and Ruby using RubyCocoa.&lt;/p&gt;

&lt;p&gt;At one point we had a fork of RubyCocoa that &lt;a href=&quot;https://github.com/alloy/RubyCocoa/tree/cocoapods-app-with-swift&quot;&gt;supported objects created in Swift&lt;/a&gt;, but that was probably going to turn into a long road for something with not too much gain on our end.&lt;/p&gt;

&lt;p&gt;We negated the need for this by moving to communicate with Ruby &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods-app/pull/120&quot;&gt;over XPC&lt;/a&gt;, we called this the &lt;code&gt;ReflectionService&lt;/code&gt;. It&amp;#39;s explained below.&lt;/p&gt;

&lt;p&gt;XPC means that we can have a persistently running Ruby environment from which we can send/recieve metadata about Podfiles. This protects the app from crashes, keeps memory usage low and doesn&amp;#39;t require booting up Ruby every time we want to communicate. Triple win. If you&amp;#39;ve not looked at XPC it gets a thumbs up from us.&lt;/p&gt;

&lt;h2 id=&quot;whats-in-now&quot;&gt;What&amp;#39;s in now?&lt;/h2&gt;

&lt;p&gt;The key features for 1.0 are being able to edit a Podfile, and to be able to run &lt;code&gt;pod install&lt;/code&gt; and &lt;code&gt;pod update&lt;/code&gt; on it.&lt;/p&gt;

&lt;p&gt;One of the things I&amp;#39;m really happy about is our inline errors for your Podfile. The app gives direct feedback as you&amp;#39;re editing the Podfile:&lt;/p&gt;

&lt;p&gt;&lt;a href= &quot;/assets/blog_img/app/podfile-errors.jpg&quot;&gt;&lt;img src =&quot;/assets/blog_img/app/podfile-errors.jpg&quot; class=&quot;image-zoom&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We have a lot of the normal developer key commands working as expected, if there&amp;#39;s something you&amp;#39;d want that we don&amp;#39;t support, write us an issue or PR.&lt;/p&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What&amp;#39;s next?&lt;/h2&gt;

&lt;p&gt;We&amp;#39;ve got some WIP &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods-app/pulls&quot;&gt;Pull Requests&lt;/a&gt; for some cool features like automatic CocoaPods plugin installation, and an integration summary. These are very likely to be in for the final 1.0 release. However we&amp;#39;ve not tried to look &lt;em&gt;too&lt;/em&gt; far into the future with this app.&lt;/p&gt;

&lt;p&gt;I think there&amp;#39;s a lot of space for improvements, and we&amp;#39;d love some community input on what you would like to see in a GUI for CocoaPods.&lt;/p&gt;

&lt;p&gt;For example, I know when most people try attack this problem they try to solve the pod discovery problem, but I&amp;#39;m not sure if we can do better than the website in the native app. Would love some ideas on ways we could improve.&lt;/p&gt;
</description>
    <pubDate>Tue, 12 Jan 2016 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-App</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-App</guid>
  </item>
  
  
  
  <item>
    <title>Release Versions Only</title>
    <description>&lt;p&gt;The main CocoaPods website, &lt;a href=&quot;https://cocoapods.org&quot;&gt;cocoapods.org&lt;/a&gt;, lets you search for all versions of a pod.
That includes prerelease versions.
As a result, when searching for a pod with a prerelease version, the latest prerelease version is shown in the result list.&lt;/p&gt;

&lt;p&gt;This sounds good in principle, but the behaviour is at odds with how the &lt;code&gt;pod&lt;/code&gt; command operates.
The default there is to use the latest &lt;em&gt;released&lt;/em&gt; pod version.
As a result of this – as we noticed via our stats system – usage of prerelease versions is minimal, and showing the latest prerelease version on &lt;a href=&quot;https://cocoapods.org&quot;&gt;cocoapods.org&lt;/a&gt; violates expectations as to what &lt;code&gt;pod install&lt;/code&gt; will actually install.&lt;/p&gt;

&lt;p&gt;Therefore, we will be switching to the &lt;code&gt;pod&lt;/code&gt; command default also on &lt;a href=&quot;https://cocoapods.org&quot;&gt;cocoapods.org&lt;/a&gt;, meaning in the results, we will show only released versions.
We&amp;#39;ve prepared all systems for the switch and will flip it on December 31st 2015 to start into the new year with the brand new search engine behavior.&lt;/p&gt;

&lt;p&gt;Happy New Year, pod friends!&lt;/p&gt;
</description>
    <pubDate>Tue, 29 Dec 2015 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Release-Versions-Only</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Release-Versions-Only</guid>
  </item>
  
  
  
  <item>
    <title>2015</title>
    <description>&lt;blockquote&gt;
&lt;p&gt;CocoaPods is a dependency manager only in the sense that Apple is a cell phone manufacturer – it’s just one of their many projects.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;--  Ash Furrow - &lt;a href=&quot;http://ashfurrow.com/blog/building-online-communities/&quot;&gt;Building Online Communities&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Last year, around this time, I started an &lt;a href=&quot;/Stats-2014/&quot;&gt;annual write-up&lt;/a&gt; for CocoaPods. A lot happens in a project with 10 relatively active developers, and a lot of very welcome drive-by contributors.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h2 id=&quot;stats&quot;&gt;Stats&lt;/h2&gt;

&lt;p&gt;Alright, so, let&amp;#39;s start off with a bang! Here&amp;#39;s the TLDR interesting numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;24 searches per minute.&lt;/li&gt;
&lt;li&gt;45 pod installs per minute.&lt;/li&gt;
&lt;li&gt;100,000 unique app targets.&lt;/li&gt;
&lt;li&gt;100,000 uniques to the site.&lt;/li&gt;
&lt;li&gt;500,000 monthly page views.&lt;/li&gt;
&lt;li&gt;2.5 million gem downloads of CocoaPods.&lt;/li&gt;
&lt;li&gt;6.6 million targets integrated by &lt;code&gt;pod install&lt;/code&gt; / &lt;code&gt;pod update&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;30 million pods have been integrated by CocoaPods.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;contributions&quot;&gt;Contributions&lt;/h2&gt;

&lt;p&gt;We started the year with a change in ownership. &lt;a href=&quot;https://twitter.com/alloy&quot;&gt;Eloy Durán&lt;/a&gt; who had been heading up the project for five years, &lt;a href=&quot;/The-captain-leaves-the-bridge&quot;&gt;announced&lt;/a&gt; he was stepping back due to becoming a father.&lt;/p&gt;

&lt;p&gt;Right now we have four people making a lot of the major decisions around CocoaPods: &lt;a href=&quot;http://buegling.com&quot;&gt;Boris Bügling&lt;/a&gt;, &lt;a href=&quot;http://mariusrackwitz.de&quot;&gt;Marius Rackwitz&lt;/a&gt;, &lt;a href=&quot;http://orta.io&quot;&gt;myself&lt;/a&gt; and &lt;a href=&quot;http://segiddins.me&quot;&gt;Samuel Giddins&lt;/a&gt;. With the help from &lt;a href=&quot;https://cocoapods.org/about&quot;&gt;other developers&lt;/a&gt; on a day to day basis.&lt;/p&gt;

&lt;p&gt;This year we&amp;#39;ve seen Samuel Giddins &lt;a href=&quot;/Capital-One&quot;&gt;sponsored by Capital One&lt;/a&gt; in order to help him focus on building CocoaPods while he studies at college. I want to dig in a little about Samuel&amp;#39;s work in the last year. In the &lt;a href=&quot;/Stats-2014/&quot;&gt;last write-up&lt;/a&gt;, I mentioned a project he was working on:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The second, Samuel Giddins, has been mostly working on a iterative dependency resolver for both CocoaPods and Bundler ( CocoaPods for Ruby. )&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This project turned into a gem of a library called &lt;a href=&quot;https://github.com/CocoaPods/Molinillo/&quot;&gt;Molinillo&lt;/a&gt;, see the &lt;a href=&quot;/CocoaPods-0.35/&quot;&gt;announcement&lt;/a&gt;, which is the project at CocoaPods with the most impact. Molinillo is now used in both &lt;a href=&quot;https://github.com/bundler/bundler/pull/3257&quot;&gt;Bundler&lt;/a&gt; and &lt;a href=&quot;https://github.com/rubygems/rubygems/pull/1189&quot;&gt;RubyGems&lt;/a&gt;! This is awesome because it powers a &lt;em&gt;huge&lt;/em&gt; amount of ruby infrastructure, but that soon enough CocoaPods&amp;#39; code will be shipping in every copy of OS X. So cool.&lt;/p&gt;

&lt;h2 id=&quot;community&quot;&gt;Community&lt;/h2&gt;

&lt;p&gt;This year a lot of major companies migrated to using CocoaPods as their transport method for their SDKs. We got featured in a few annual keynotes:&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;https://youtu.be/7V-fIGMDsmE?t=1h32m34s &#39;&gt;&lt;img  src=&#39;/assets/blog_img/2015/twitter.jpg&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39; https://youtu.be/6iVJSj-yqkQ?t=58m36s &#39;&gt;&lt;img  src=&#39;/assets/blog_img/2015/google.jpg&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;Apple even &lt;a href=&quot;https://github.com/ResearchKit/ResearchKit/pull/5&quot;&gt;merged&lt;/a&gt; a Podspec into their first foray in open source libraries with &lt;a href=&quot;https://cocoapods.org/pods/ResearchKit&quot;&gt;ResearchKit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Our biggest online/offline event this year, was the the &lt;a href=&quot;/Jamming-2015/&quot;&gt;CocoaPods Test Jam&lt;/a&gt;. It ran in 7 cities and helped get a lot of people bootstrapped with both testing and contributing back to the open source community. It was awesome to organise, and fun to contribute to.&lt;/p&gt;

&lt;p&gt;We found that keeping on track of all pods is starting to become an issue, for example yesterday 18 new pods were added to trunk. We wanted to find an alternative way to keep on top of new pods, so &lt;a href=&quot;/Creme-de-la-Pods&quot;&gt;we created&lt;/a&gt; &lt;a href=&quot;https://twitter.com/CremeDeLaPods&quot;&gt;@CremeDeLaPods&lt;/a&gt; as a way of keeping track of the highest quality &lt;em&gt;new&lt;/em&gt; pods.&lt;/p&gt;

&lt;p&gt;Wanting to experiment, and to encourage new voices in the CocoaPods team we worked with Rails Girls Summer of Code. We teamed up with Karla Sandoval and Emma Koszinowski, who make up team &lt;a href=&quot;http://cocoagems.github.io/about.html&quot;&gt;CocoaGems&lt;/a&gt;.  Together with the GitHub web team advising they:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Created a plugin to &lt;a href=&quot;https://github.com/Karla-Isabel-Sandoval/cocoapods-label&quot;&gt;annotate a Podfile&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Converted the user interface section of CocoaPods into its own gem called &lt;a href=&quot;https://github.com/CocoaPods/Cork&quot;&gt;Cork&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Split out CocoaPods&amp;#39; command line search tools into a new gem, &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods-Search&quot;&gt;CocoaPods-Search&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;web-properties&quot;&gt;Web Properties&lt;/h2&gt;

&lt;p&gt;A problem close to my heart is discoverability. We want to lower the barriers to entry for everyone to participate in OSS, and making people&amp;#39;s projects easily discovered is an important part of this.&lt;/p&gt;

&lt;p&gt;The CocoaPods web presence has had a lot of work devoted to it in the last year, the most obvious is that we now have individual pages for a pod. These pod pages pull in nearly every interesting piece of metadata around the pod, making it significantly easier to browse and compare pods.&lt;/p&gt;

&lt;p&gt;We introduced a project we&amp;#39;ve had been working on for over a year, &lt;a href=&quot;https://guides.cocoapods.org/making/quality-indexes.html&quot;&gt;CocoaPods Quality Indexes&lt;/a&gt; (QIs) an evolving attempt at defining quality in software. These QIs are used throughout the web properties to provide feedback and to sort pods.&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;https://cocoadocs-api-cocoapods-org.herokuapp.com/pods/RxSwift/stats  &#39;&gt;&lt;img  src=&#39;/assets/blog_img/2015/qi.png&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;The QIs provide a positive feedback loop, showing you ways in which you can game the system by improving your library. By focusing on showing you ways to improve, rather than penalising discouraged behaviour, I hope we can continue to foster a welcoming and supportive community.&lt;/p&gt;

&lt;p&gt;To expand on that further and allow people to have a better sense of their the state of their libraries, we created Pod Author Pages. Here&amp;#39;s a great example from &lt;a href=&quot;https://cocoapods.org/owners/734&quot;&gt;Andrea Mazzini&lt;/a&gt; making it really easy to understand his impact on the community.&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;https://cocoapods.org/owners/734  &#39;&gt;&lt;img  src=&#39;/assets/blog_img/2015/owners.png&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;Another multi-year project that we shipped this year was &lt;a href=&quot;/Stats/&quot;&gt;CocoaPods Stats&lt;/a&gt;. Stats offers a way of knowing how many downloads a pod has, and far more interestingly the number of targets it has been integrated with. This is something I haven&amp;#39;t found in other dependency managers, as it&amp;#39;s a really hard problem to solve. We couldn&amp;#39;t have shipped this alone, so a big thanks to &lt;a href=&quot;https://segment.com&quot;&gt;Segment&lt;/a&gt; for sponsoring a lot of the infrastructure here.&lt;/p&gt;

&lt;p&gt;While the number of pods available via CocoaPods has increased in the last year, the amount of servers we need for search has not. &lt;a href=&quot;https://github.com/floere&quot;&gt;Florian Hanke&lt;/a&gt; who has been working with us since the start continues to refuse to throw more money at our search server. His work has made it possible for us to deal with doubling our search traffic, support more metadata, add different sort types and allow scoping to all the new platforms Apple keep shipping.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://cocoadocs.org&quot;&gt;CocoaDocs&lt;/a&gt;, the CocoaPods documentation service started supporting Swift code this year via &lt;a href=&quot;https://github.com/realm/jazzy&quot;&gt;Jazzy&lt;/a&gt;, and the future is looking bright on that front as Jazzy now supports Objective-C projects and one of these days will support mixed language projects. We&amp;#39;ll probably be migrating CocoaDocs to only use Jazzy next year. CocoaDocs had problems scaling with the number of new pod versions being shipped this year. We remedied this by working with &lt;a href=&quot;https://www.usebutton.com&quot;&gt;Button&lt;/a&gt; to get a high-end Mac Mini doing the work instead of a &lt;a href=&quot;/CocoaDocs-Colo/&quot;&gt;shared VPS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Finally, we made it easier to get bootstrapped to work on the web infrastructure via a meta-repo called &lt;a href=&quot;https://github.com/CocoaPods/Strata&quot;&gt;Strata&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So, to wrap this up, I was looking at the Google Analytics for the CocoaPods web properties. My favourite quirky statistic is this: We get more user sessions from Windows devices than we do iOS. Perhaps this mobile thing is just a fad?&lt;/p&gt;

&lt;h2 id=&quot;cocoapods&quot;&gt;CocoaPods&lt;/h2&gt;

&lt;p&gt;So this year was a crazy year from the perspective of Apple releases.&lt;/p&gt;

&lt;p&gt;In the last 3 months,  Swift is the dominant language for half of the new Pods. At this point last year we were just starting to ship betas supporting frameworks, enabling Swift for those brave enough to be early adopters. Now there&amp;#39;s a Swift library is in the top ten downloaded Pods and there are tens of thousands of apps using CocoaPods with Swift frameworks. We&amp;#39;re starting to see real mainstream adoption of the language.&lt;/p&gt;

&lt;p&gt;Apple also kept us all on our toes by introducing 2 new platforms. watchOS first came as an iOS extension, but then migrated to a real platform of its own with watchOS2. tvOS came towards the end of the year. This means CocoaPods now supports 4 independent platforms.&lt;/p&gt;

&lt;p&gt;We added determinate UUID generation, which is only important if you check in your &lt;code&gt;Pods&lt;/code&gt; directory. This means running &lt;code&gt;pod install&lt;/code&gt; would generate the same UUIDs for the files it generates, and you won&amp;#39;t see diffs for &lt;code&gt;Pods.xcodeproj&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The CocoaPods plugin API got more powerful via &lt;code&gt;pre-install&lt;/code&gt; and &lt;code&gt;post-install&lt;/code&gt; hooks. Third party adoption of plugins has been great, and we&amp;#39;ve moved a bunch of non-core CocoaPods code into plugins. For example; trunk, stats, search and try are all plugins.&lt;/p&gt;

&lt;p&gt;We made it harder to accidentally edit your Pods files by having the files read-only by default.&lt;/p&gt;

&lt;p&gt;Finally, the introduction of Molinillo made CocoaPods&amp;#39; dependency resolving first class. This means that a &lt;code&gt;pod install&lt;/code&gt; is now always going to be the exact same Pods as the one that generated the &lt;code&gt;Podfile.lock&lt;/code&gt;. Also, seriously, it&amp;#39;s in RubyGems + Bundler, that&amp;#39;s so cool.&lt;/p&gt;

&lt;h2 id=&quot;cocoapods-app&quot;&gt;CocoaPods.app&lt;/h2&gt;

&lt;p&gt;The final major project that we&amp;#39;ve been working on, and have shipped a few releases sneakily is CocoaPods.app. In our constant work to lower the barrier to entry for building apps, we&amp;#39;ve started tackling the last mile. How do we improve, and simplify the installation and updating of CocoaPods?&lt;/p&gt;

&lt;p&gt;The best way to do that is to make CocoaPods act like other tools a Cocoa developer would work with every day. So we have been working on a CocoaPods.app that you can drag into &lt;code&gt;/Applications&lt;/code&gt; and it will deal with handling CocoaPods for you.&lt;/p&gt;

&lt;p&gt;I&amp;#39;d like to say sorry if using the terminal just for this made you feel like a leet hacker,  but I&amp;#39;d be wrong. CocoaPods.app includes a fully hosted copy of the &lt;code&gt;pod&lt;/code&gt; command ( as well as all the tools it relies on: svn, hg, bar, git etc ) that you can use from your terminal.&lt;/p&gt;

&lt;p&gt;The next CocoaPods release is going to be the first release that we will be offering this as the default way to install CocoaPods. I think it&amp;#39;s the best experience we can offer for someone who is consuming Pods. For now, we&amp;#39;re keeping it a little bit hidden away on &lt;a href=&quot;http://cocoapods.org/app&quot;&gt;cocoapods.org/app&lt;/a&gt;. We&amp;#39;re aiming for something on the lines of this:&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;http://cocoapods.org/app  &#39;&gt;&lt;img  src=&#39;/assets/blog_img/2015/mac-app.png&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;h2 id=&quot;1-0&quot;&gt;1.0&lt;/h2&gt;

&lt;p&gt;I finished the last post talking about what 1.0 looks like, so it seems fitting to end this year about 1.0 too. Our 1.0 milestone is getting there, and there&amp;#39;s progress on the last major breaking change to the Podfile syntax. With luck, this may finally be the year of CocoaPods 1.0.&lt;/p&gt;

&lt;h2 id=&quot;tweets-of-praise&quot;&gt;Tweets of Praise&lt;/h2&gt;

&lt;div class=&quot;col-md-6&quot;&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;i love you &lt;a href=&quot;https://twitter.com/CocoaPods&quot;&gt;@CocoaPods&lt;/a&gt; :) &lt;a href=&quot;http://t.co/cWynBnROGC&quot;&gt;pic.twitter.com/cWynBnROGC&lt;/a&gt;&lt;/p&gt;&amp;mdash; Bruno da Luz (@brunov0id) &lt;a href=&quot;https://twitter.com/brunov0id/status/626465261525331968&quot;&gt;July 29, 2015&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Working w/&lt;a href=&quot;https://twitter.com/hashtag/CocoaPods?src=hash&quot;&gt;#CocoaPods&lt;/a&gt; for the first time is an achievement that ranks just below my wedding day and birth of my first child. &lt;a href=&quot;https://twitter.com/hashtag/iOS?src=hash&quot;&gt;#iOS&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/MobileApps?src=hash&quot;&gt;#MobileApps&lt;/a&gt;&lt;/p&gt;&amp;mdash; Brian Stein (@bleestein) &lt;a href=&quot;https://twitter.com/bleestein/status/622090256410488834&quot;&gt;July 17, 2015&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;When I take on an &lt;a href=&quot;https://twitter.com/hashtag/iOS?src=hash&quot;&gt;#iOS&lt;/a&gt; project that doesn&amp;#39;t use &lt;a href=&quot;https://twitter.com/CocoaPods&quot;&gt;@CocoaPods&lt;/a&gt;... the &lt;a href=&quot;https://twitter.com/hashtag/horror?src=hash&quot;&gt;#horror&lt;/a&gt;. &lt;a href=&quot;https://twitter.com/hashtag/DeveloperProblems?src=hash&quot;&gt;#DeveloperProblems&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/RefactoringTime?src=hash&quot;&gt;#RefactoringTime&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/LateNight?src=hash&quot;&gt;#LateNight&lt;/a&gt;&lt;/p&gt;&amp;mdash; Derek Argueta (@derek_arg) &lt;a href=&quot;https://twitter.com/derek_arg/status/564337951333576704&quot;&gt;February 8, 2015&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Finally started using &lt;a href=&quot;https://twitter.com/CocoaPods&quot;&gt;@CocoaPods&lt;/a&gt; and oh my gosh it is life changing&lt;/p&gt;&amp;mdash; Josh Puckett (@joshpuckett) &lt;a href=&quot;https://twitter.com/joshpuckett/status/555271791388950528&quot;&gt;January 14, 2015&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;playing with &lt;a href=&quot;https://twitter.com/CocoaPods&quot;&gt;@CocoaPods&lt;/a&gt; .. its awesome.. &lt;a href=&quot;https://twitter.com/hashtag/iosdev?src=hash&quot;&gt;#iosdev&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/development?src=hash&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://twitter.com/appleios&quot;&gt;@appleios&lt;/a&gt; &lt;a href=&quot;https://twitter.com/IOS&quot;&gt;@ios&lt;/a&gt;&lt;/p&gt;&amp;mdash; sagar modak (@sagarmodakit) &lt;a href=&quot;https://twitter.com/sagarmodakit/status/567638625563602944&quot;&gt;February 17, 2015&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/div&gt;

&lt;div class=&quot;col-md-6&quot;&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Finally FINALLY I can try out cocoapods. And it is wonderful.&lt;/p&gt;&amp;mdash; Michael Robinson (@codeofinterest) &lt;a href=&quot;https://twitter.com/codeofinterest/status/569047495973548032&quot;&gt;February 21, 2015&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Down about dependency management in iOS? In our latest blog post, Mason G. explains how we use &lt;a href=&quot;https://twitter.com/CocoaPods&quot;&gt;@CocoaPods&lt;/a&gt; to help: &lt;a href=&quot;http://t.co/NDG8lbuSJv&quot;&gt;http://t.co/NDG8lbuSJv&lt;/a&gt;&lt;/p&gt;&amp;mdash; Yelp Engineering (@YelpEngineering) &lt;a href=&quot;https://twitter.com/YelpEngineering/status/583318996784582658&quot;&gt;April 1, 2015&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;CocoaPods, taking open source libs quality to new ⬆︎ Level 👍&amp;#10;Great Job.&amp;#10;&amp;#10;&lt;a href=&quot;https://t.co/PDlBE2hnZ4&quot;&gt;https://t.co/PDlBE2hnZ4&lt;/a&gt;&lt;/p&gt;&amp;mdash; Kostiantyn Koval (@KostiaKoval) &lt;a href=&quot;https://twitter.com/KostiaKoval/status/619757311263940609&quot;&gt;July 11, 2015&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;This is your daily reminder that &amp;#39;pod try&amp;#39; is insanely convenient!&amp;#10;Great job &lt;a href=&quot;https://twitter.com/CocoaPods&quot;&gt;@CocoaPods&lt;/a&gt; !&lt;/p&gt;&amp;mdash; Gabriele Petronella (@gabro27) &lt;a href=&quot;https://twitter.com/gabro27/status/623477170065801216&quot;&gt;July 21, 2015&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;COCOAPODS! &amp;lt;3&lt;/p&gt;&amp;mdash; Marc Backes (@backesmarc) &lt;a href=&quot;https://twitter.com/backesmarc/status/626465858508881921&quot;&gt;July 29, 2015&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/div&gt;
</description>
    <pubDate>Wed, 18 Nov 2015 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Stats-2015</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Stats-2015</guid>
  </item>
  
  
  
  <item>
    <title>Introducing: Creme de la Pods</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;You could always find out what was new with &lt;a href=&quot;https://twitter.com/cocoapodsfeed&quot;&gt;@CocoaPodsFeed&lt;/a&gt; and &lt;a href=&quot;https://feeds.cocoapods.org&quot;&gt;feeds.cocoapods.org&lt;/a&gt;. Now you can see new CocoaPods that have a &lt;a href=&quot;https://guides.cocoapods.org/making/quality-indexes.html&quot;&gt;QI&lt;/a&gt; score of over 70 on &lt;a href=&quot;https://twitter.com/cremedelapods&quot;&gt;@CremeDeLaPods&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Keeping on top of the community&amp;#39;s work is a challenge, with ~13,500 CocoaPods available and roughly 20 new pods every day. We work on CocoaPods to encourage  &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods#project-goals&quot;&gt;contributions to OSS&lt;/a&gt;. A by-product of this is that if you follow the whole stream of new CocoaPods, it can get hard to distinguish between &amp;quot;my first library&amp;quot; and &amp;quot;an awesome paradigm &lt;em&gt;swift&lt;/em&gt;.&amp;quot;&lt;/p&gt;

&lt;p&gt;I have taken a stab at solving this problem, by trying to select the best pods by their &lt;a href=&quot;https://guides.cocoapods.org/making/quality-indexes.html&quot;&gt;Quality Index&lt;/a&gt;. The first time we run documentation parsing for a Pod, if that Pod&amp;#39;s QI is over 70 then &lt;a href=&quot;https://github.com/CocoaPods/cocoadocs-api/commit/3dd3ee32f253d485576fb49fa272945cd5d5462b&quot;&gt;CocoaDocs&lt;/a&gt; will send out a tweet on the &lt;a href=&quot;https://twitter.com/cremedelapods&quot;&gt;@CremeDeLaPods&lt;/a&gt; twitter feed, with the exact same formatting as &lt;a href=&quot;https://twitter.com/CocoaPodsFeed&quot;&gt;@CocoaPodsFeed&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a class=&quot;twitter-follow-button&quot; href=&quot;https://twitter.com/CremeDeLaPods&quot;&gt;Follow @CremeDeLaPods&lt;/a&gt;&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;If you&amp;#39;ve already seen tweets from &lt;a href=&quot;https://twitter.com/CocoaPodsFeed&quot;&gt;@CocoaPodsFeed&lt;/a&gt; before, there should be no surprises on the look of those tweets on CremeDeLaPods:&lt;/p&gt;

&lt;p&gt;&lt;center&gt;
  &lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot; data-cards=&quot;hidden&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;[Venice] CSP for Swift 2 (Linux ready) &lt;a href=&quot;https://t.co/DdPyqojBjI&quot;&gt;&lt;a href=&quot;https://t.co/DdPyqojBjI&quot;&gt;https://t.co/DdPyqojBjI&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;&amp;mdash; Creme De La Pods (@CremeDeLaPods) &lt;a href=&quot;https://twitter.com/CremeDeLaPods/status/663133105809698821&quot;&gt;November 7, 2015&lt;/a&gt;&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot; data-cards=&quot;hidden&quot;&gt;&lt;p lang=&quot;fr&quot; dir=&quot;ltr&quot;&gt;[ControllerContainer by &lt;a href=&quot;https://twitter.com/3lvis&quot;&gt;@3lvis&lt;/a&gt;] View Controller Containment for humans &lt;a href=&quot;https://t.co/3WgHkIrUUa&quot;&gt;&lt;a href=&quot;https://t.co/3WgHkIrUUa&quot;&gt;https://t.co/3WgHkIrUUa&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;&amp;mdash; Creme De La Pods (@CremeDeLaPods) &lt;a href=&quot;https://twitter.com/CremeDeLaPods/status/662624562778144770&quot;&gt;November 6, 2015&lt;/a&gt;&lt;/blockquote&gt;
  &lt;/center&gt;&lt;/p&gt;

&lt;p&gt;Every Pod also comes with an overview image too, making it easy to see some of the salient properties.&lt;/p&gt;

&lt;p&gt;&lt;center&gt;
  &lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;[Money by &lt;a href=&quot;https://twitter.com/danthorpe&quot;&gt;@danthorpe&lt;/a&gt;] Swift types for working with Money. &lt;a href=&quot;https://t.co/jCdJlrZV9Z&quot;&gt;&lt;a href=&quot;https://t.co/jCdJlrZV9Z&quot;&gt;https://t.co/jCdJlrZV9Z&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;&amp;mdash; Creme De La Pods (@CremeDeLaPods) &lt;a href=&quot;https://twitter.com/CremeDeLaPods/status/662573883728490496&quot;&gt;November 6, 2015&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;&lt;a class=&quot;twitter-follow-button&quot; href=&quot;https://twitter.com/CremeDeLaPods&quot; data-size=&quot;large&quot;&gt;Follow @CremeDeLaPods&lt;/a&gt;
&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;It&amp;#39;s easy to forget that a lot of people are just getting started, and learning how to ship a Podspec is an important step towards community participation. We want people to feel welcome at all stages of their careers, so we&amp;#39;ll always be showing and hosting the unfiltered feed.&lt;/p&gt;

&lt;p&gt;We&amp;#39;ve talked about, in the future, supporting tweeting when any pod&amp;#39;s version moves to  getting to a score of 70+. This should be a bit more accommodating for improvements after seeing an initial score, rather than  set up at the start.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://camo.githubusercontent.com/cf5c440e71f6731b22d5d014d183709906bab61a/687474703a2f2f7777772e746865706c757370617065722e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031352f30342f332e676966&quot;&gt;&lt;/p&gt;
</description>
    <pubDate>Sat, 07 Nov 2015 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Creme-de-la-Pods</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Creme-de-la-Pods</guid>
  </item>
  
  
  
  <item>
    <title>Capital One</title>
    <description>&lt;p&gt;I&amp;#39;m incredibly excited to announce that as of today my work on CocoaPods will be
sponsored by Capital One.&lt;/p&gt;

&lt;p&gt;What does this mean? It means that Capital One is stepping up to support
continued development on CocoaPods and I will be able to focus on CocoaPods work
while finishing university.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;This sponsorship demonstrates Capital One&amp;#39;s commitment not only to CocoaPods,
but to the wider open source ecosystem -- they&amp;#39;re supporting the creation,
maintenance, and improvement of tools used by hundreds of thousands of
developers on a daily basis.&lt;/p&gt;

&lt;p&gt;I&amp;#39;d be remiss if I didn&amp;#39;t mention that Capital One is a great place to work (I&amp;#39;m
friends with several of their engineers, and they&amp;#39;re some of the smartest and
most experienced iOS developers I know), and they&amp;#39;re hiring engineers in
Northern Virginia and SF. If you believe in supporting open source and building
apps that change how people interact with their money, you should drop them a
line by sending &lt;a href=&quot;https://twitter.com/louielouie&quot;&gt;@louielouie a Direct Message on
Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I&amp;#39;m extraordinarily happy to be able to redouble my efforts on CocoaPods and
that I can do so in lieu of taking up other work is entirely thanks to Capital
One.&lt;/p&gt;

&lt;p&gt;Now, back to our regularly scheduled CocoaPods 1.0 development -- and thanks
again to the generous folks at Capital One for making it possible for me to do
so!&lt;/p&gt;
</description>
    <pubDate>Tue, 27 Oct 2015 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Capital-One</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Capital-One</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 0.39 - tvOS and Dynamic Vendored Frameworks</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;CocoaPods 0.39&lt;/em&gt; has been released, with support for tvOS pods and dynamic vendored frameworks.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h3 id=&quot;dynamic-vendored-frameworks&quot;&gt;Dynamic Vendored Frameworks&lt;/h3&gt;

&lt;p&gt;CocoaPods 0.39 has been released, with the biggest change being support for dynamic vendored frameworks.
This will allow closed-source pods to be provided as dynamic frameworks, meaning no more errors when they are transitive dependencies of multiple other pods.
This will also allow closed-source pods to not only be used simultaneously with Swift pods, but it means closed-source pods can even be written in Swift.&lt;/p&gt;

&lt;h3 id=&quot;tvos&quot;&gt;tvOS&lt;/h3&gt;

&lt;p&gt;The update allows you to use pods with tvOS.
As a pod author, you may need to specify the &lt;a href=&quot;https://guides.cocoapods.org/syntax/podspec.html#tvos&quot;&gt;deployment target
for tvOS&lt;/a&gt; in your podspec, as seen below:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Pod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# …&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tvos&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;deployment_target&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;9.0&amp;#39;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;This means that, in practice, not all existing pods will be compatible with tvOS immediately.
Any pod that can support tvOS needs to explicitly add support by adding &lt;code&gt;s.tvos.deployment_target&lt;/code&gt;, since it is an entirely new platform.&lt;/p&gt;

&lt;h3 id=&quot;swift-standard-library-copying&quot;&gt;Swift Standard Library Copying&lt;/h3&gt;

&lt;p&gt;When building Swift pods with Xcode 7 or later, the Swift standard library runtime will no longer manually be copied.
For projects with a large number of Swift pods, this can lead to a drastic speed-up in build times.&lt;/p&gt;

&lt;h3 id=&quot;private-linting&quot;&gt;Private Linting&lt;/h3&gt;

&lt;p&gt;All commands that perform linting (&lt;code&gt;pod spec lint&lt;/code&gt;, &lt;code&gt;pod lib lint&lt;/code&gt;, and
&lt;code&gt;pod repo push&lt;/code&gt;) now can take a &lt;code&gt;--private&lt;/code&gt; flag.
Using this flag will disable warnings that are only relevant to public pods,
such as URL reachability.&lt;/p&gt;

&lt;p&gt;Along with these enhancements, 0.39 features dozens of bug fixes.&lt;/p&gt;

&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;/h2&gt;

&lt;p&gt;To install the last release of CocoaPods you can run:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;sudo&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; gem install cocoapods
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Until version 1.0 we strongly encourage you to keep CocoaPods up-to-date.&lt;/p&gt;

&lt;p&gt;For all the details, don’t miss the
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/releases/tag/0.39.0&quot;&gt;Changelog&lt;/a&gt;!&lt;/p&gt;
</description>
    <pubDate>Fri, 09 Oct 2015 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-0.39</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-0.39</guid>
  </item>
  
  
  
  <item>
    <title>Running SSH Commands via Rakefiles</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;CocoaDocs&amp;#39; commands which used to be executed via logging in are now done via rake commands.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/CocoaPods/cocoadocs.org/&quot;&gt;CocoaDocs&lt;/a&gt; runs a lot of CocoaPods&amp;#39; infrastructure. It is the workhorse that allows us to provide rendered &lt;a href=&quot;https://cocoapods.org/pods/ARAnalytics&quot;&gt;READMEs/CHANGELOGs&lt;/a&gt;, &lt;a href=&quot;http://blog.cocoapods.org/CocoaPods.org-Two-point-Five/&quot;&gt;QIs&lt;/a&gt; and &lt;a href=&quot;https://status.cocoapods.org&quot;&gt;status updates&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I have been manually &lt;code&gt;ssh&lt;/code&gt;ing in to the server to execute commands for a &lt;a href=&quot;https://github.com/CocoaPods/cocoadocs.org/commit/93e9896b04f79eb09be28a9056671b1d23f3143d&quot;&gt;few years&lt;/a&gt;, and it&amp;#39;s a bit of a chore. Over time though, I became used to this. As more people were starting to help out in maintaining CocoaDocs, it became obvious that it needed to change from being dark arcane knowledge to easy -discoverable- commands.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Show me the code: &lt;a href=&quot;https://github.com/CocoaPods/cocoadocs.org/compare/c7be695...a00338d&quot;&gt;c7be695...a00338d&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I initially explored the idea of using &lt;a href=&quot;http://nadarei.co/mina/&quot;&gt;Mina&lt;/a&gt; to let us treat CocoaDocs like we do with heroku. I spent a few hours setting it up, but never managed to get a single &lt;a href=&quot;http://rampantgames.com/blog/?p=7745&quot;&gt;working prototype&lt;/a&gt;. Eventually I started looking for alternatives.&lt;/p&gt;

&lt;p&gt;I found &lt;a href=&quot;https://github.com/net-ssh/net-ssh&quot;&gt;net-ssh&lt;/a&gt;, which is a pleasant reminder of how old the ruby community is, given that docs are from &lt;a href=&quot;http://net-ssh.github.io/ssh/v1/&quot;&gt;2004&lt;/a&gt;.  I used it to connect to the server in a tiny amount of code:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;net/ssh&amp;#39;&lt;/span&gt;

&lt;span class=&quot;no&quot;&gt;Net&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;SSH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;api.cocoadocs.org&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;cocoadocs&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:password&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;hahayeahright&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;output&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exec!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;hostname&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;output&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Which was enough to start. Once I started though, I hit a problem. Each command is executed stateless-ly. What this means, in principal, is that your session won&amp;#39;t stay in the same folder, and you won&amp;#39;t have your normal shell setup. I started out trying to do all the things a shell would do &lt;code&gt;source ~/.zshrc&lt;/code&gt; etc. etc. Not practical.&lt;/p&gt;

&lt;p&gt;After giving up on the &lt;code&gt;exec&lt;/code&gt;  function, I did some duckduckgo-ing for alternatives and found &lt;a href=&quot;http://net-ssh.github.io/ssh/v1/chapter-5.html#s3&quot;&gt;a chapter on shell&lt;/a&gt;  in the docs. However, the docs were out of date, and the code didn&amp;#39;t exist. Luckily it had just been separated out into a  new gem: &lt;a href=&quot;https://github.com/net-ssh/net-ssh-shell&quot;&gt;net-ssh-shell&lt;/a&gt;. This meant we could do:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;net/ssh&amp;#39;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;net/ssh/shell&amp;#39;&lt;/span&gt;

&lt;span class=&quot;no&quot;&gt;Net&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;SSH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;api.cocoadocs.org&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;cocoadocs&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:password&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;hahayeahright&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shell&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;execute&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;hostname&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Which executes the command, as expected, as though you had logged in. Perfect. With that, I did some minor refactoring to turn it all into a function that takes some commands as an array.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt; &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;run_ssh_commands&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;commands&lt;/span&gt;
   &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Connecting to api.cocoadocs.org:&amp;quot;&lt;/span&gt;
   &lt;span class=&quot;no&quot;&gt;Net&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;SSH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;api.cocoadocs.org&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;cocoadocs&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
     &lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shell&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
       &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;execute&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;cd cocoadocs.org&amp;#39;&lt;/span&gt;
       &lt;span class=&quot;n&quot;&gt;commands&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
         &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;yellow&lt;/span&gt;
         &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;execute&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;command&lt;/span&gt;
       &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
       &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;execute&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;exit&amp;#39;&lt;/span&gt;
     &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
   &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;I included an &lt;code&gt;exit&lt;/code&gt; command to close the session at the end of the submitted commands, and that&amp;#39;s it. Commands are now easily run from a maintainer&amp;#39;s computer without the need for domain knowledge. They just need to know that &lt;code&gt;bundle exec rake -T&lt;/code&gt; will give useful tasks. Given that we use Rakefile in all projects, this knowledge is implicit. Woo!&lt;/p&gt;

&lt;p&gt;So, next time you hear people complaining about a chore you&amp;#39;ve become used to, take heed and try to automate the problem away.&lt;/p&gt;
</description>
    <pubDate>Wed, 26 Aug 2015 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Running-SSH-Commands-via-Rakefiles</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Running-SSH-Commands-via-Rakefiles</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods Stats Resetting</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;CocoaPods Stats is ready to move from it&amp;#39;s current staging environment&lt;/em&gt;, and we will be resetting all stats next weekend.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;When I set up CocoaPods Stats - the website API and Analytics database with help from &lt;a href=&quot;http://segment.com&quot;&gt;Segment&lt;/a&gt;, I created it within a staging environment in our analytics database. Since getting it up and running, I gave it two months to gather enough data in order for us to be sure that the, at-the-time, evolving table data structure works.&lt;/p&gt;

&lt;p&gt;Looks like it is working. In that time, people using only the latest releases of CocoaPods, have used CocoaPods to download &lt;a href=&quot;https://cocoapods.org/pods/AFNetworking&quot;&gt;AFNetworking&lt;/a&gt; almost 100,000+ times, on 6500+ individual projects.&lt;/p&gt;

&lt;p&gt;So, next week I will migrate the stats server to production and everything will be back to zero downloads / installs again.&lt;/p&gt;
</description>
    <pubDate>Sun, 09 Aug 2015 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Stats-Reset</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Stats-Reset</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 0.38 - watchOS and target de-duplication</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;CocoaPods 0.38&lt;/em&gt; has been released, with watchOS 2 support, target de-duplication, and Stats for everyone.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;CocoaPods 0.38 has been released.
This is our first update since WWDC and it brings support for Apple&amp;#39;s latest releases, including Xcode 7 and watchOS.
It also includes lots of improvements that make building Pods easier.
Furthermore, it rolls out &lt;a href=&quot;http://blog.cocoapods.org/Stats/&quot;&gt;Stats&lt;/a&gt; for everyone.&lt;/p&gt;

&lt;h3 id=&quot;watchos&quot;&gt;watchOS&lt;/h3&gt;

&lt;p&gt;The update allows you to use Pods with watchOS.
As a Pod Author, you have to specify the &lt;a href=&quot;https://guides.cocoapods.org/syntax/podspec.html#watchos&quot;&gt;deployment target
for watchOS&lt;/a&gt; in the Podspec, as seen below:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Pod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# …&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;watchos&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;deployment_target&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;2.0&amp;#39;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;What this means in practice, is that not all Pods are automatically available by default.
Any Pod that can support watchOS needs to explicitly add support by adding &lt;code&gt;s.watchos.deployment_target&lt;/code&gt;.
It is an entirely new platform.&lt;/p&gt;

&lt;h3 id=&quot;target-deduplication&quot;&gt;Target Deduplication&lt;/h3&gt;

&lt;p&gt;CocoaPods now de-duplicates Pod targets, which means that it recognises when a dependency is used multiple times across different user targets but only needs to be built once.
But sometimes this is not possible and they still need to be generated in different variants and thus build multiple times.
The targets in &lt;code&gt;Pods.xcodeproj&lt;/code&gt; need to be duplicated when one of the following conditions applies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They are used on different platforms.&lt;/li&gt;
&lt;li&gt;They are used with differents sets of subspecs.&lt;/li&gt;
&lt;li&gt;They have any dependency which needs to be duplicated.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This fixes several issues with Archiving apps with extensions, but also reduces build times significantly.&lt;/p&gt;

&lt;h3 id=&quot;removal-of-the-enviroment-header&quot;&gt;Removal of the Enviroment Header&lt;/h3&gt;

&lt;p&gt;After updating and running &lt;code&gt;pod install&lt;/code&gt; on your integration, you will see that some header files in the Pods directory won&amp;#39;t be generated anymore matching the pattern &lt;code&gt;Pods-*-environment.h&lt;/code&gt;.
This was the environment header, which contained precompiler macro definitions with the version components of each dependency used in the integrated target.
It was visible not only for the user target, but also for all its dependencies.
It could be used to make additional features available if a given pod is present.
But this was also the cause of some issues.
One of them was that it wouldn&amp;#39;t be possible to de-duplicate frameworks.
If you relied on that, you can still use the Clang file checking macro &lt;a href=&quot;http://clang.llvm.org/docs/LanguageExtensions.html#include-file-checking-macros&quot;&gt;&lt;code&gt;__has_include&lt;/code&gt;&lt;/a&gt; to determine (by the presence of a header) whether a specific dependency is available or not:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;objective-c language-objective-c&quot; data-lang=&quot;objective-c&quot;&gt;&lt;span class=&quot;cp&quot;&gt;#if __has_include(&amp;lt;QueryKit/QueryKit.h&amp;gt;)&lt;/span&gt;
  &lt;span class=&quot;cp&quot;&gt;#import &amp;lt;QueryKit/QueryKit.h&amp;gt;&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#endif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;To make optional behavior in your Pod available, you should use &lt;a href=&quot;https://guides.cocoapods.org/syntax/podspec.html#group_subspecs&quot;&gt;subspecs&lt;/a&gt;, exclude the subspec from the &lt;code&gt;default_subspecs&lt;/code&gt; and declare there an explicit dependency, which is versioned and will affect the dependency resolution only when the user explicitly includes the subspec.&lt;/p&gt;

&lt;h3 id=&quot;breaking-change-to-the-hooks-api&quot;&gt;Breaking Change to the Hooks-API&lt;/h3&gt;

&lt;p&gt;The Podfile allows you to define &lt;code&gt;pre_install&lt;/code&gt; and &lt;code&gt;post_install&lt;/code&gt; hooks.
Before this update, we maintained a proxy layer, so that we could alter the installation / integration process and the model and just change how the Hooks API representations access those artifacts.
This worked for a while, but finally we became aware that we reached a point where both came completely out-of-sync.
Because of that, we relinquished that approach and made the underlying installer directly available, which was exposed before anyway and allowed more advanced possibilities for this more advanced feature.&lt;/p&gt;

&lt;p&gt;If you relied on that feature, this table may help you with the mapping and give you some help how to migrate:&lt;/p&gt;

&lt;table&gt;&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left&quot;&gt;InstallerRepresentation&lt;/th&gt;
&lt;th style=&quot;text-align: left&quot;&gt;Installer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;sandbox_root&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;sandbox.root&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;project&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;pods_project&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;pods&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left&quot;&gt;~&amp;gt; &lt;code&gt;pod_targets&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;libraries&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left&quot;&gt;~&amp;gt; &lt;code&gt;aggregate_targets&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;specs_by_lib&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left&quot;&gt;use &lt;code&gt;#find&lt;/code&gt; or &lt;code&gt;#select&lt;/code&gt; on &lt;code&gt;pod_targets&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;pods_by_lib&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left&quot;&gt;use &lt;code&gt;#find&lt;/code&gt; or &lt;code&gt;#select&lt;/code&gt; on &lt;code&gt;aggregate_targets&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;sandbox&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;sandbox&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;config&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;config&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;installer&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left&quot;&gt;not needed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;See also the &lt;a href=&quot;http://www.rubydoc.info/github/cocoapods/cocoapods/Pod/Installer&quot;&gt;gem API documentation of the &lt;code&gt;Installer&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you need to keep compatibility to the older versions of CocoaPods, then you can simply check the gem version in the Podfile as it is just Ruby code after all.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;post_install&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;installer_or_rep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# @note: Remove after CocoaPods 0.38+ is completely rolled out&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# and rename block argument to `installer`.&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;installer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;installer_or_rep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;respond_to?&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:installer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;installer_or_rep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;installer&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;installer_or_rep&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# You can use the installer from now on.&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h3 id=&quot;split-of-xcconfig&quot;&gt;Split of &lt;code&gt;xcconfig&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;One of the more advanced attribute in Podspecs is - &lt;em&gt;or better was&lt;/em&gt; - the attribute &lt;code&gt;xcconfig&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This allow you to specify build settings for your Pod.
Previously those were made available to libraries and the integrated target.&lt;/p&gt;

&lt;p&gt;We broke this with the support for frameworks.
This wasn&amp;#39;t an issue for most Pods because the build setting is mostly used to configure build settings which are relevant only to the generated Pod target itself.
When we mentioned that there were still some Pods which weren&amp;#39;t working anymore as expected due to that change, we decided to split the attribute from now on.
This way Pods also can&amp;#39;t accidentally overwrite or conflict with build settings of the user target.&lt;/p&gt;

&lt;p&gt;The former attribute &lt;code&gt;xcconfig&lt;/code&gt; is deprecated and will cause a linter error when pushing new versions to trunk.
The new attributes are available as &lt;code&gt;pod_target_xcconfig&lt;/code&gt; and &lt;code&gt;user_target_xcconfig&lt;/code&gt;, which makes their effects more clear.
The latter attribute (&lt;code&gt;user_target_xcconfig&lt;/code&gt;) should be used with great care, because well designed Pods should be self-contained and make as few assumptions about their environment as possible.
Furthermore, this attribute can cause conflicts when different values are specified by two Pods for a build setting which doesn&amp;#39;t allow multiple values and so cannot be merged.&lt;/p&gt;

&lt;h3 id=&quot;deterministic-uuids-by-xcodeproj&quot;&gt;Deterministic UUIDs by Xcodeproj&lt;/h3&gt;

&lt;p&gt;This update also includes the latest version of Xcodeproj, which encapsulates the API to Xcode projects.
Beside support for new build settings, it now supports the generation of deterministic UUIDs for every object in the project file.
That means in practice mostly, that you have smaller diffs for the &lt;code&gt;Pods.xcodeproj&lt;/code&gt; after running &lt;code&gt;pod install&lt;/code&gt; or &lt;code&gt;pod update&lt;/code&gt;, which reduce unnecessary merge conflicts.
This behavior can be disabled via the new &lt;code&gt;COCOAPODS_DISABLE_DETERMINISTIC_UUIDS&lt;/code&gt; environment variable.&lt;/p&gt;

&lt;h3 id=&quot;resolver-takes-the-deployment-target-into-account&quot;&gt;Resolver takes the Deployment Target into account&lt;/h3&gt;

&lt;p&gt;The deployment target of a podspec is now taken into account in the dependency resolution process.
This will ensure that CocoaPods will always be able to resolve your Podfile, even if newer versions of pods are released that have higher minimum deployment targets.
It makes the behavior of CocoaPods overall less surprising.&lt;/p&gt;

&lt;h3 id=&quot;thanks-to-contributors-of-bug-fixes&quot;&gt;Thanks to Contributors of Bug Fixes&lt;/h3&gt;

&lt;p&gt;Along with these enhancements, 0.38 features dozens of bug fixes.
Special thanks to all the new contributors we had for this release, especially for their help in squashing bugs.&lt;/p&gt;

&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;/h2&gt;

&lt;p&gt;To install the last release of CocoaPods you can run:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;sudo&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; gem install cocoapods
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Until version 1.0 we strongly encourage you to keep CocoaPods up-to-date.&lt;/p&gt;

&lt;p&gt;For all the details, don’t miss the
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/releases/tag/0.38.0&quot;&gt;Changelog&lt;/a&gt;!&lt;/p&gt;
</description>
    <pubDate>Tue, 21 Jul 2015 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-0.38</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-0.38</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods Stats</title>
    <description>&lt;p&gt;People have been asking for years about feedback on how many downloads their libraries have. We&amp;#39;ve been thinking about the problem for a about as long too, and finally ended up asking &lt;a href=&quot;http://segment.com&quot;&gt;Segment&lt;/a&gt; if they would provide a backend for the project.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h3 id=&quot;but-wait-theres-more&quot;&gt;But wait, there&amp;#39;s more...&lt;/h3&gt;

&lt;p&gt;It wasn&amp;#39;t just enough to offer just download counts. We spend a lot of time working around Xcode&amp;#39;s project file intricacies, however in this context, it provides us with foundations for a really nice feature. CocoaPods Stats will be able to keep track of the unique number of installs within Apps / Watch Apps / Extensions / Unit Tests.&lt;/p&gt;

&lt;p&gt;This means is that developers using continuous integration only register as 1 install, even if the server runs &lt;code&gt;pod install&lt;/code&gt; each time, separating total installations vs actual downloads.&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot; style=&quot;padding-bottom:0px;&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;https://cocoapods.org/pods/ORStackView&#39;&gt;&lt;img  width=&quot;1024&quot; src=&#39;/assets/blog_img/stats/stack.png&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;h3 id=&quot;alright-hold-up&quot;&gt;Alright, hold up&lt;/h3&gt;

&lt;p&gt;Let&amp;#39;s go over how we check which pods get sent up for analytics, and how we do the unique installs. &lt;a href=&quot;https://github.com/cocoapods/cocoapods-stats&quot;&gt;CocoaPods-Stats&lt;/a&gt; is a plugin that is now bundled with CocoaPods from version 0.38 onwards. It &lt;a href=&quot;https://github.com/CocoaPods/cocoapods-stats/blob/0361f29ae37e82ccf385319bba9cf31464049144/lib/cocoapods_plugin.rb#L6&quot;&gt;registers&lt;/a&gt; as a post-install plugin and is ran on every &lt;code&gt;pod install&lt;/code&gt; or &lt;code&gt;pod update&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id=&quot;detecting-public-pods&quot;&gt;Detecting Public Pods&lt;/h4&gt;

&lt;p&gt;We&amp;#39;re very pessimistic about sending a Pod up to our &lt;a href=&quot;https://github.com/cocoapods/stats.cocoapods.org&quot;&gt;stats server&lt;/a&gt;. We ensure that you have a CocoaPods/Specs repo set up as your master repo, then ensure that each pod to be sent  is inside that repo before accepting it as a public domain pod.&lt;/p&gt;

&lt;h4 id=&quot;data-being-sent&quot;&gt;Data being sent&lt;/h4&gt;

&lt;p&gt;First up, we don&amp;#39;t want to know anything about your app. So in order to know unique targets we use your project&amp;#39;s target &lt;a href=&quot;https://github.com/artsy/eigen/blob/aea7af93daffb716ccee9aa50ce599dc7949c42b/Artsy.xcodeproj/project.pbxproj#L3888&quot;&gt;UUID&lt;/a&gt; as an identifier. These are a &lt;a href=&quot;http://danwright.info/blog/2010/10/xcode-pbxproject-files-3/&quot;&gt;hash&lt;/a&gt; of your MAC address, Xcode&amp;#39;s process id and the time of target creation (but we only know the UUID/hash, so your MAC address is unknown to us). These UUIDs never change in a project&amp;#39;s lifetime (contrary to, for example, the bundle identifier). We double hash it just to be super safe.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;  &lt;span class=&quot;c1&quot;&gt;# Grab the project and the type of target&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;uuid&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;user_target_uuids&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;first&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;project_target&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;project&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;objects_by_uuid&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;uuid&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Send in a digested&amp;#39;d UUID anyway, a second layer&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# of misdirection can&amp;#39;t hurt&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;ss&quot;&gt;:uuid&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Digest&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;SHA256&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hexdigest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;uuid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;ss&quot;&gt;:type&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;project_target&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;product_type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;ss&quot;&gt;:pods&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pods&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;We then also send along the CocoaPods version that was used to generate this installation. Ideally before release we&amp;#39;ll also be able to give statistics on how many people are using &lt;code&gt;pod try [pod]&lt;/code&gt; for your library too.&lt;/p&gt;

&lt;h4 id=&quot;how-does-it-work&quot;&gt;How does it work?&lt;/h4&gt;

&lt;p&gt;My first attempt at a stats architecture was based on how &lt;a href=&quot;https://github.com/npm/download-counts#data-source&quot;&gt;npm does stats&lt;/a&gt;, roughly speaking they send all logs to S3 where they are map-reduced on a daily basis into individual package metrics. This is an elegant solution for a &lt;a href=&quot;https://www.crunchbase.com/organization/npm&quot;&gt;company&lt;/a&gt; with people working full time on up-time and stability. As someone who wants to be building iOS apps, and not maintaining &lt;a href=&quot;http://cocoadocs.org/readme/&quot;&gt;more&lt;/a&gt; infrastructure in my spare time, I wanted to avoid this.&lt;/p&gt;

&lt;p&gt;We use Segment in Artsy, and our analytics team had really good things to say about their &lt;a href=&quot;https://segment.com/redshift&quot;&gt;Redshift&lt;/a&gt; infrastructure. So I reached out about having them hosting the stats infrastructure for CocoaPods. They offered a lot of great advice around the data-modelling, we were up and running really quickly. So you already know about the CocoaPods plugin, but from there it sends your anonymous Pod stats up to &lt;a href=&quot;https://github.com/cocoapods/stats.cocoapods.org&quot;&gt;stats.cocoapods.org&lt;/a&gt;. This acts as a &lt;a href=&quot;https://github.com/CocoaPods/stats.cocoapods.org/blob/b1889c9b35faef524685d99898be9ac8447ed7f8/spec/functional/api/v1/install_spec.rb&quot;&gt;conduit&lt;/a&gt; sending analytics events to Segment. A &lt;a href=&quot;https://github.com/CocoaPods/stats.cocoapods.org/blob/b1889c9b35faef524685d99898be9ac8447ed7f8/Rakefile#L49&quot;&gt;daily task&lt;/a&gt; is triggered on the web site, this makes &lt;a href=&quot;https://github.com/CocoaPods/stats.cocoapods.org/blob/b1889c9b35faef524685d99898be9ac8447ed7f8/runner/stats_coordinator.rb&quot;&gt;SQL requests&lt;/a&gt; against the Redshift instance which is then imported into &lt;a href=&quot;http://metrics.cocoapods.org/api/v1/pods/Expecta&quot;&gt;metrics.cocoapods.org&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;

&lt;h4 id=&quot;can-i-opt-out-as-a-cocoapods-user&quot;&gt;Can I opt out as a CocoaPods user?&lt;/h4&gt;

&lt;p&gt;Sure. You can set an &lt;a href=&quot;http://apple.stackexchange.com/questions/106778/how-do-i-set-environment-variables-on-os-x&quot;&gt;environment variable&lt;/a&gt; &lt;code&gt;COCOAPODS_DISABLE_STATS&lt;/code&gt; to true in your shell, and stats will not be sent from your machine.&lt;/p&gt;

&lt;h4 id=&quot;does-this-affect-every-pod&quot;&gt;Does this affect every pod?&lt;/h4&gt;

&lt;p&gt;Yeah, every pod will get download stats.&lt;/p&gt;

&lt;h4 id=&quot;will-it-be-live-stats&quot;&gt;Will it be live stats?&lt;/h4&gt;

&lt;p&gt;No, they get generated once per day.&lt;/p&gt;

&lt;h4 id=&quot;what-is-the-rollout-strategy&quot;&gt;What is the rollout strategy?&lt;/h4&gt;

&lt;p&gt;We plan on making this initially a separate CocoaPods plugin that you can optionally install via &lt;code&gt;[sudo] gem install cocoapods-stats&lt;/code&gt; which will send the data. In a release or two we will bundle this into CocoaPods, and it will be installed by default for everyone moving forwards.&lt;/p&gt;

&lt;h4 id=&quot;can-i-use-it-right-now&quot;&gt;Can I use it right now?&lt;/h4&gt;

&lt;p&gt;Sure, update to the latest CocoaPods &lt;code&gt;[sudo] gem install cocoapods&lt;/code&gt; or download the latest &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods-app&quot;&gt;CocoaPods.app&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;how-does-this-affect-the-quality-indexes-sorting&quot;&gt;How does this affect the quality indexes / sorting?&lt;/h4&gt;

&lt;p&gt;Ideally we can reduce the amount of impact GitHub stars affects a quality index, and replace some of the values with new metrics based on downloads/installations. &lt;/p&gt;

&lt;h4 id=&quot;what-commands-does-this-run-on&quot;&gt;What commands does this run on?&lt;/h4&gt;

&lt;p&gt;It runs at the end of a &lt;code&gt;pod install&lt;/code&gt; or a &lt;code&gt;pod update&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id=&quot;i-check-in-my-pods-directory-how-does-this-affect-stats-for-the-pods-i-use&quot;&gt;I check in my Pods directory, how does this affect stats for the pods I use?&lt;/h4&gt;

&lt;p&gt;Checking in your Pods directory will mean that the download count for the pods used will rarely be affected, but the installations will be the exact same. They only register once per project, so multiple developers on the same project running &lt;code&gt;pod install&lt;/code&gt; will not raise this number.&lt;/p&gt;
</description>
    <pubDate>Wed, 24 Jun 2015 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Stats</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Stats</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods.org v2.5</title>
    <description>&lt;p&gt;After our awesome State of the Union, I pushed the new version of the CocoaPods website to Heroku. It comes with a bunch of new features, some new pages and a few interface tweaks, let&amp;#39;s go through what&amp;#39;s new.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot; style=&quot;padding-bottom:0px;&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;https://cocoapods.org/pods/Cartography&#39;&gt;&lt;img  width=&quot;1024&quot; src=&#39;/assets/blog_img/cocoapods-org-2-5/cocoapods25.jpg&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;h2 id=&quot;quality-index&quot;&gt;Quality Index&lt;/h2&gt;

&lt;p&gt;We built a series of quality approximations that sit on top of the deep metrics that exist within CocoaPods. These are a series of rules that we apply against a pod every time a new pod version is pushed. They range from GitHub popularity, to download size and a rough version of how well tested it is.&lt;/p&gt;

&lt;p&gt;There are currently 17 metrics (&lt;a href=&quot;https://github.com/CocoaPods/cocoadocs-api/blob/master/quality_modifiers.rb&quot;&gt;see the code&lt;/a&gt;) that we use to estimate the quality of every library. The algorithm starts with a number then adds and subtracts to it based on the metric. They are both positive and negative metrics, for example releasing a Pod under the GPL license will detract some points while having a lot of GitHub stars will add to the number. In order to make this process transparent &lt;a href=&quot;https://twitter.com/K0nserv&quot;&gt;Hugo Tunis&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/esttorhe&quot;&gt;Esteban Torres&lt;/a&gt; created a new web page showing all of the rules that apply to your pod.&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/cocoapods-org-2-5/pods.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/cocoapods-org-2-5/pods.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;h2 id=&quot;pod-ordering&quot;&gt;Pod Ordering&lt;/h2&gt;

&lt;p&gt;We&amp;#39;ve transitioned the default pod search ordering from GitHub stars to the overall Quality Index. In part this is because the CocoaPods ecosystem is bigger than just GitHub, and  while popularity is pretty well correlated with GitHub stars it often can just be an indicator that people liked the idea. Using the Quality Index we can take that into account, but also that it is well documented, has tests and many other aspects.&lt;/p&gt;

&lt;h2 id=&quot;pod-page-improvements&quot;&gt;Pod Page improvements&lt;/h2&gt;

&lt;p&gt;We streamlined the main section of the Pod page. We did this by moving a lot of the interesting metrics that we have to the sidebar, and to re-think the hierarchy of the data on the side. We&amp;#39;re actively cleaning up READMEs when displaying in Pod pages for things like CI/Coverage badges and CocoaPods installation notes to keep it focused on just the pods documentation. Installation details are available in the sidebar.&lt;/p&gt;

&lt;h2 id=&quot;owner-pages&quot;&gt;Owner pages&lt;/h2&gt;

&lt;p&gt;Terminology is important here, an owner is someone who has access to push a Pod to trunk. The library author is someone who created the library. Nearly all of the time they are the same, but there are examples ( &lt;a href=&quot;https://cocoapods.org/pods/ARAnalytics&quot;&gt;ARAnalytics&lt;/a&gt; ) where they differ. We have created owner pages for the people with access to push a pod, right now we don&amp;#39;t have pretty URLs for your owners but you can jump to any Pods you own and you&amp;#39;ll see a link to your page. We show all the Pods an owner has access to, and a little bit of information around the pod.&lt;/p&gt;

&lt;p&gt;I&amp;#39;m super happy with the changes to the website, I think it makes it easier than ever to discover higher quality libraries that might not have hit the big-time yet. Everyone can let out a sigh of relief now, we can figure out the best &lt;a href=&quot;https://cocoapods.org/?q=lang%3Aswift%20json&quot;&gt;Swift JSON ORM&lt;/a&gt;.&lt;/p&gt;
</description>
    <pubDate>Tue, 09 Jun 2015 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods.org-Two-point-Five</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods.org-Two-point-Five</guid>
  </item>
  
  
  
  <item>
    <title>2015 CocoaPods State of the Union</title>
    <description>&lt;p&gt;Apple have their annual WWDC keynote and Developer State of the Union.
We have ours.
We&amp;#39;re planning a great opening event to WWDC week: The CocoaPods Alt State of the Union.
You should join us, and hear about what&amp;#39;s happened in CocoaPods in the past year, and what&amp;#39;s to come in the next.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;It&amp;#39;s become an annual tradition for CocoaPods to host &lt;a href=&quot;http://www.eventbrite.com/e/cocoapods-2nd-annual-wwdc-meetup-tickets-6887230893&quot;&gt;an&lt;/a&gt; &lt;a href=&quot;http://blog.cocoapods.org/CocoaPods-WWDC-Party&quot;&gt;event&lt;/a&gt; at WWDC,
and we want to make this another great one.
Last year we ended up with a waiting list almost double the amount we could get in, so we&amp;#39;re pulling a leaf out of Apple&amp;#39;s book by holding a &lt;a href=&quot;https://sotu.cocoapods.org&quot;&gt;lottery&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We&amp;#39;ve got it set up to favour those who have contributed to the core CocoaPods repos, but registration is open to everyone with a &lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt; account. &lt;a href=&quot;https://citymapper.com/go/6jm7vo&quot;&gt;Twilio&lt;/a&gt; have graciously offered to host us again this year, June Eighth (Monday) at 6:30 PM, and we can&amp;#39;t wait to see you all!&lt;/p&gt;

&lt;p&gt;All of the details, as well as the lottery registration link, are available at &lt;a href=&quot;https://sotu.cocoapods.org/&quot;&gt;https://sotu.cocoapods.org/&lt;/a&gt;. We&amp;#39;ll be closing the lottery and announcing the lucky entrants on Thursday, so hurry up and register!&lt;/p&gt;
</description>
    <pubDate>Mon, 01 Jun 2015 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/2015-CocoaPods-State-of-the-Union</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/2015-CocoaPods-State-of-the-Union</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 0.37 - Pod Caching and Custom Module Maps</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;CocoaPods 0.37&lt;/em&gt; has been released, with a new pod download cache and support for custom module maps.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;CocoaPods 0.37 has been released, it includes download caching for Pods.
This brings a huge speed improvement to commands such as &lt;code&gt;pod spec lint&lt;/code&gt;
and improves the performance of running &lt;code&gt;pod install&lt;/code&gt; when a Pod is in
the download cache
(which is stored at &lt;code&gt;~/Library/Caches/CocoaPods/Pods&lt;/code&gt; by default).&lt;/p&gt;

&lt;p&gt;The update also allows you to define a custom
&lt;a href=&quot;https://guides.cocoapods.org/syntax/podspec.html#module_map&quot;&gt;module map&lt;/a&gt;
file in a Podspec.&lt;/p&gt;

&lt;p&gt;Along with these enhancements, 0.37 features dozens of bug fixes.&lt;/p&gt;

&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;/h2&gt;

&lt;p&gt;To install the last release of CocoaPods you can run:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;sudo&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; gem install cocoapods
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Until version 1.0 we strongly encourage you to keep CocoaPods up-to-date.&lt;/p&gt;

&lt;p&gt;For all the details, don’t miss the
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/blob/0.37.0/CHANGELOG.md&quot;&gt;Changelog&lt;/a&gt;!&lt;/p&gt;
</description>
    <pubDate>Sun, 03 May 2015 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-0.37</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-0.37</guid>
  </item>
  
  
  
  <item>
    <title>Test Jam 2015</title>
    <description>&lt;p&gt;Over the weekend over 150 people met up in meetups, and many joined online, to try and improve the foundational libraries that the Cocoa community rely on.  We made more than 30 pull requests and a lot of people got more exposure to testing in Xcode. Read on for stats.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/testjam-2015/sf1.jpg &#39;&gt;&lt;img  src=&#39;/assets/blog_img/testjam-2015/sf1.jpg &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;The jam ran over a 14 hour timespan from 12pm GMT to 6pm PST. We had an active IRC with random banter and people asking useful questions. Twitter too.&lt;/p&gt;

&lt;div class=&quot;col-md-6&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p&gt;The &lt;a href=&quot;https://twitter.com/CocoaPods&quot;&gt;@CocoaPods&lt;/a&gt; testjam is alive and well at &lt;a href=&quot;https://twitter.com/Substantial&quot;&gt;@Substantial&lt;/a&gt; in Seattle! Come join us and give back to the iOS OSS community!&lt;/p&gt;&amp;mdash; Kai Curtis (@thepelkus) &lt;a href=&quot;https://twitter.com/thepelkus/status/589479820028825601&quot;&gt;April 18, 2015&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p&gt;Added unit tests and CI to FrameAccessor during the &lt;a href=&quot;https://twitter.com/CocoaPods&quot;&gt;@CocoaPods&lt;/a&gt; test jam! Feeling pretty zen, despite the Obj-C. &lt;a href=&quot;https://t.co/iLzyccp8pP&quot;&gt;https://t.co/iLzyccp8pP&lt;/a&gt;&lt;/p&gt;&amp;mdash; Ayaka Nonaka (@ayanonagon) &lt;a href=&quot;https://twitter.com/ayanonagon/status/589580552488886272&quot;&gt;April 19, 2015&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p&gt;Writing tests with cats for the &lt;a href=&quot;https://twitter.com/CocoaPods&quot;&gt;@CocoaPods&lt;/a&gt; Test Jam 😻 &lt;a href=&quot;http://t.co/DVxJyEIXZT&quot;&gt;pic.twitter.com/DVxJyEIXZT&lt;/a&gt;&lt;/p&gt;&amp;mdash; Michele Titolo (@micheletitolo) &lt;a href=&quot;https://twitter.com/micheletitolo/status/589553068502450176&quot;&gt;April 18, 2015&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p&gt;One of the greatest things about &lt;a href=&quot;https://twitter.com/CocoaPods&quot;&gt;@CocoaPods&lt;/a&gt; test jam is seeing different peoples approaches to testing legacy code.&lt;/p&gt;&amp;mdash; squarefrog (@squarefrog) &lt;a href=&quot;https://twitter.com/squarefrog/status/589561399782825986&quot;&gt;April 18, 2015&lt;/a&gt;&lt;/blockquote&gt; 

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p&gt;For the &lt;a href=&quot;https://twitter.com/CocoaPods&quot;&gt;@CocoaPods&lt;/a&gt; Test Jam I added code coverage to Form! &amp;#10;&amp;#10;&lt;a href=&quot;https://t.co/HJbqDp5uQD&quot;&gt;https://t.co/HJbqDp5uQD&lt;/a&gt;&lt;/p&gt;&amp;mdash; Elvis Nuñez (@3lvis) &lt;a href=&quot;https://twitter.com/3lvis/status/589540740956614656&quot;&gt;April 18, 2015&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p&gt;Learned quite a bit about testing and werewolves &lt;a href=&quot;https://twitter.com/CocoaPods&quot;&gt;@CocoaPods&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/testjam?src=hash&quot;&gt;#testjam&lt;/a&gt;&lt;/p&gt;&amp;mdash; Eytan Biala (@eytanbiala) &lt;a href=&quot;https://twitter.com/eytanbiala/status/589637914872717312&quot;&gt;April 19, 2015&lt;/a&gt;&lt;/blockquote&gt;

&lt;/div&gt;

&lt;div class=&quot;col-md-6&quot;&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p&gt;“Why test? It’s not about increasing test coverage. It’s about empowering the ability to change the code.” —&lt;a href=&quot;https://twitter.com/qcoding&quot;&gt;@qcoding&lt;/a&gt; &lt;a href=&quot;https://twitter.com/CocoaPods&quot;&gt;@CocoaPods&lt;/a&gt; test jam&lt;/p&gt;&amp;mdash; Ayaka Nonaka (@ayanonagon) &lt;a href=&quot;https://twitter.com/ayanonagon/status/589508623874658305&quot;&gt;April 18, 2015&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p&gt;For the &lt;a href=&quot;https://twitter.com/CocoaPods&quot;&gt;@CocoaPods&lt;/a&gt; Test Jam &lt;a href=&quot;https://twitter.com/ams340&quot;&gt;@ams340&lt;/a&gt; and I added test coverage to facebook/KVOController--now adding missing tests! &lt;a href=&quot;https://t.co/ft5aDbTZ79&quot;&gt;https://t.co/ft5aDbTZ79&lt;/a&gt;&lt;/p&gt;&amp;mdash; Brian Gesiak（もどかしい） (@modocache) &lt;a href=&quot;https://twitter.com/modocache/status/589466423963078657&quot;&gt;April 18, 2015&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p&gt;We’ve wrapped up our first test jam pod: &lt;a href=&quot;https://t.co/tBNlwUgP6z&quot;&gt;https://t.co/tBNlwUgP6z&lt;/a&gt;&lt;/p&gt;&amp;mdash; Ørta (@orta) &lt;a href=&quot;https://twitter.com/orta/status/589449038669418496&quot;&gt;April 18, 2015&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p&gt;Having fun &lt;a href=&quot;https://twitter.com/CocoaPods&quot;&gt;@CocoaPods&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/testjam?src=hash&quot;&gt;#testjam&lt;/a&gt;! Adding tests to MGBoxKit &lt;a href=&quot;https://t.co/rOBgjxBl1h&quot;&gt;https://t.co/rOBgjxBl1h&lt;/a&gt;&lt;/p&gt;&amp;mdash; Benjamin Encz (@benjaminencz) &lt;a href=&quot;https://twitter.com/benjaminencz/status/589573207532810240&quot;&gt;April 18, 2015&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p&gt;Testing cocoa is exhausting. &lt;a href=&quot;https://twitter.com/hashtag/testjam?src=hash&quot;&gt;#testjam&lt;/a&gt; @ Artsy &lt;a href=&quot;https://t.co/rPu9hrzi8J&quot;&gt;https://t.co/rPu9hrzi8J&lt;/a&gt;&lt;/p&gt;&amp;mdash; Rob Ruffler (@RobRuffler) &lt;a href=&quot;https://twitter.com/RobRuffler/status/589481166786400257&quot;&gt;April 18, 2015&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://twitter.com/robbiehanson_15&quot;&gt;@robbiehanson_15&lt;/a&gt; Gotcha, yeah, you maintain some seriously popular stuff! I set up some unit test for Cocoapods test jam, nothing critical.&lt;/p&gt;&amp;mdash; Stepan Hruda (@StepanHruda) &lt;a href=&quot;https://twitter.com/StepanHruda/status/589544797431603200&quot;&gt;April 18, 2015&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p&gt;Thanks to &lt;a href=&quot;https://twitter.com/Daniel1of1&quot;&gt;@Daniel1of1&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/iwasleeg&quot;&gt;@iwasleeg&lt;/a&gt; for helping organize the cocoapods test jamming meetup yesterday.Fingers crossed &lt;a href=&quot;https://t.co/XYDqpysNVh&quot;&gt;https://t.co/XYDqpysNVh&lt;/a&gt;&lt;/p&gt;&amp;mdash; seanoshea (@seanoshea) &lt;a href=&quot;https://twitter.com/seanoshea/status/589830688024702976&quot;&gt;April 19, 2015&lt;/a&gt;
&lt;/blockquote&gt;

&lt;/div&gt;

&lt;h3 id=&quot;talks&quot;&gt;Talks&lt;/h3&gt;

&lt;p&gt;Every meetup had the freedom to run it however they like, ranging from &lt;a href=&quot;https://twitter.com/thepelkus/status/589886508695355392&quot;&gt;two people in a room&lt;/a&gt; to speakers known for their testing prowess. Interestingly enough, both talked about adding tests to untested code. &lt;em&gt;Hint:&lt;/em&gt; you might be interested in their source material: &lt;a href=&quot;http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052&quot;&gt;Working Effectively with Legacy Code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/testjam-2015/sf3.jpg &#39;&gt;&lt;img  src=&#39;/assets/blog_img/testjam-2015/sf3.jpg &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/testjam-2015/london.jpg &#39;&gt;&lt;img  src=&#39;/assets/blog_img/testjam-2015/london.jpg &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;We changed the plan on the day to avoid needing a bot. In this case jammers would assign themselves a pod from a &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1JKfCpPMInru5i_vjHcfhPRQEtGT6p7YQx1kYJwKwx6s/edit&quot;&gt;big Spreadsheet&lt;/a&gt; and this gave people a chance to find libraries that interested them. Here&amp;#39;s a collection of the work done, with more probably happening over a longer time frame. Very cool.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/facebook/KVOController/pull/58&quot;&gt;facebook/KVOController#58&lt;/a&gt;,
&lt;a href=&quot;https://github.com/facebook/KVOController/pull/59&quot;&gt;facebook/KVOController#59&lt;/a&gt;,
&lt;a href=&quot;https://github.com/facebook/KVOController/pull/60&quot;&gt;facebook/KVOController#60&lt;/a&gt;,
&lt;a href=&quot;https://github.com/facebook/KVOController/pull/61&quot;&gt;facebook/KVOController#61&lt;/a&gt;,
&lt;a href=&quot;https://github.com/andreamazz/AMTagListView/pull/31&quot;&gt;andreamazz/AMTagListView#31&lt;/a&gt;,
&lt;a href=&quot;https://github.com/chrismiles/CMPopTipView/pull/97&quot;&gt;chrismiles/CMPopTipView#97&lt;/a&gt;,
&lt;a href=&quot;https://github.com/stepanhruda/CocoaAsyncSocket/pull/1&quot;&gt;stepanhruda/CocoaAsyncSocket#1&lt;/a&gt;,
&lt;a href=&quot;https://github.com/robbiehanson/CocoaHTTPServer/pull/136&quot;&gt;robbiehanson/CocoaHTTPServer#136&lt;/a&gt;,
&lt;a href=&quot;https://github.com/AlexDenisov/FrameAccessor/pull/16&quot;&gt;AlexDenisov/FrameAccessor#16&lt;/a&gt;,
&lt;a href=&quot;https://github.com/kevin-hirsch/KVNProgress/pull/37&quot;&gt;kevon-hirsch/KVNProgress#37&lt;/a&gt;,
&lt;a href=&quot;https://github.com/mutualmobile/MMDrawerController/pull/369&quot;&gt;mutualmobile/MMDrawerController#369&lt;/a&gt;,
&lt;a href=&quot;https://github.com/tombenner/nui/pull/293&quot;&gt;tombenner/nui#293&lt;/a&gt;,
&lt;a href=&quot;https://github.com/pkluz/PKRevealController/pull/224&quot;&gt;pkluz/PKRevealController#224&lt;/a&gt;,
&lt;a href=&quot;https://github.com/ruslanskorb/RSKImageCropper/pull/50&quot;&gt;ruslanskorb/RSKImageCropper#50&lt;/a&gt;,
&lt;a href=&quot;https://github.com/hons82/THSegmentedPager/pull/8&quot;&gt;hons82/THSegmentedPager#8&lt;/a&gt;,
&lt;a href=&quot;https://github.com/slackhq/SlackTextViewController/pull/168&quot;&gt;slackhq/SlackTextViewController#168&lt;/a&gt;,
&lt;a href=&quot;https://github.com/slackhq/SlackTextViewController/pull/167&quot;&gt;slackhq/SlackTextViewController#167&lt;/a&gt;,
&lt;a href=&quot;https://github.com/hons82/THSegmentedPager/pull/8&quot;&gt;hons82/THSegmentedPager#8&lt;/a&gt;,
&lt;a href=&quot;https://github.com/andreamazz/UIView-draggable/pull/8&quot;&gt;andreamaz/UIView-draggable#8&lt;/a&gt;,
&lt;a href=&quot;https://github.com/marcuswestin/WebViewJavascriptBridge/pull/128&quot;&gt;marcuswestin/WebViewJavascriptBridge#128&lt;/a&gt;,
&lt;a href=&quot;https://github.com/robbiehanson/XMPPFramework/pull/523&quot;&gt;robbiehanson/XMPPFramework#523&lt;/a&gt;,
&lt;a href=&quot;https://github.com/intuit/LocationManager/pull/37&quot;&gt;intuit/LocationManager#37&lt;/a&gt;,
&lt;a href=&quot;https://github.com/facebook/componentkit/pull/133&quot;&gt;facebook/componentkit#133&lt;/a&gt;,
&lt;a href=&quot;https://github.com/Flipboard/FLAnimatedImage/pull/74&quot;&gt;Flipboard/FLAnimatedImage#74&lt;/a&gt;,
&lt;a href=&quot;https://github.com/CocoaLumberjack/CocoaLumberjack/pull/498&quot;&gt;CocoaLumberjack/CocoaLumberjack#498&lt;/a&gt;,
&lt;a href=&quot;https://github.com/CocoaLumberjack/CocoaLumberjack/pull/499&quot;&gt;CocoaLumberjack/CocoaLumberjack#499&lt;/a&gt;,
&lt;a href=&quot;https://github.com/CocoaLumberjack/CocoaLumberjack/pull/500&quot;&gt;CocoaLumberjack/CocoaLumberjack#500&lt;/a&gt;,
&lt;a href=&quot;https://github.com/TransitApp/SVProgressHUD/pull/422&quot;&gt;TransitApp/SVProgressHUD#422&lt;/a&gt;,
&lt;a href=&quot;https://github.com/Eldorado234/PAYFormBuilder/pull/23&quot;&gt;Eldorado234/PAYFormBuilder#23&lt;/a&gt;,
&lt;a href=&quot;https://github.com/danielebogo/DBPrivacyHelper/pull/18&quot;&gt;danielebogo/DBPrivacyHelper#18&lt;/a&gt;,
&lt;a href=&quot;https://github.com/cezarywojcik/CWPopup/pull/27&quot;&gt;cezarywojcik/CWPopup#27&lt;/a&gt;,
&lt;a href=&quot;https://github.com/gpambrozio/BlockAlertsAnd-ActionSheets/pull/76&quot;&gt;gpambrozi/BlockAlertsAnd-ActionSheets#76&lt;/a&gt;,
&lt;a href=&quot;https://github.com/AFNetworking/AFAmazonS3Manager/pull/88&quot;&gt;AFNetworking/AFAmazonS3Manager#88&lt;/a&gt;,
&lt;a href=&quot;https://github.com/cwRichardKim/RKNotificationHub/pull/10&quot;&gt;cwRichardKim/RKNotificationHub#10&lt;/a&gt;,
&lt;a href=&quot;https://github.com/taiheng/BEMSimpleLineGraph/commits/testjam&quot;&gt;taiheng/BEMSimpleLineGraph#testjam&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/testjam-2015/nyc.jpg &#39;&gt;&lt;img  src=&#39;/assets/blog_img/testjam-2015/nyc.jpg &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;As the organiser, I can&amp;#39;t be happy enough with how it went. The NYC event helped a lot of people actually start testing. It helped me start to use code coverage as a metric for libraries. It&amp;#39;s &lt;a href=&quot;https://github.com/orta/LocationManager/commit/6c240f4e62ca541c987f41cb956db5c5ed848cdf&quot;&gt;super easy&lt;/a&gt; to add. Hopefully events like this move the baseline of expectations forward a little bit. 👍&lt;/p&gt;

&lt;p&gt;If you&amp;#39;re interested in doing community work with CocoaPods we&amp;#39;re always interested in working with more people on ideas like this. You can get in touch with us via &lt;a href=&quot;mailto:info@cocoapods.org?subject=I%20have%20community%20ideas&amp;body=Hello%20there!%20I%20have%20some%20cool%20ideas%20around%20community%20events&quot;&gt;info@cocoapods.org&lt;/a&gt; ( this goes to Kyle, Samuel, Eloy and myself.)&lt;/p&gt;
</description>
    <pubDate>Sun, 19 Apr 2015 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Jamming-2015</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Jamming-2015</guid>
  </item>
  
  
  
  <item>
    <title>Preparations for the Test Jam</title>
    <description>&lt;p&gt;The Testjam is this weekend (April 18-19). Let&amp;#39;s give as much details as possible:&lt;/p&gt;

&lt;h3 id=&quot;meetups&quot;&gt;Meetups&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt; Location &lt;/th&gt;
&lt;th&gt; Meetup Page &lt;/th&gt;
&lt;th&gt; Hosts &lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt; New York City &lt;/td&gt;
&lt;td&gt; &lt;a href=&quot;http://www.meetup.com/CocoaPods-NYC/events/220783694/&quot;&gt;CocoaPods NYC&lt;/a&gt; &lt;/td&gt;
&lt;td&gt; Orta Therox, Ash Furrow at &lt;a href=&quot;http://artsy.net&quot;&gt;Artsy HQ&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; San Francisco &lt;/td&gt;
&lt;td&gt; &lt;a href=&quot;http://www.meetup.com/CocoaPods-SF/events/220783749/&quot;&gt;CocoaPods SF&lt;/a&gt; &lt;/td&gt;
&lt;td&gt; Samuel Giddins, Kyle Fuller at &lt;a href=&quot;http://realm.io&quot;&gt;Realm HQ&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; Minsk, Belarus &lt;/td&gt;
&lt;td&gt; &lt;a href=&quot;https://www.facebook.com/groups/iosby/&quot;&gt;CocoaHeadsBy&lt;/a&gt;&lt;/td&gt;
&lt;td&gt; Aliaksandr Andrashuk, Yana Poteeva at &lt;a href=&quot;http://9elements.com&quot;&gt;9elements&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; London &lt;/td&gt;
&lt;td&gt; &lt;a href=&quot;http://www.meetup.com/NSLondon/events/221458856/&quot;&gt;NSLondon&lt;/a&gt;&lt;/td&gt;
&lt;td&gt; Daniel Haight, Raimon Lapuente at &lt;a href=&quot;http://facebook.com&quot;&gt;Facebook&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; Durham, NC &lt;/td&gt;
&lt;td&gt; &lt;a href=&quot;http://www.meetup.com/nscoderrtp/events/221366135/&quot;&gt;NSCoder &lt;/a&gt;&lt;/td&gt;
&lt;td&gt; Josh Johnson at &lt;a href=&quot;http://americanunderground.com&quot;&gt;American Underground&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; Seattle, WA &lt;/td&gt;
&lt;td&gt; Working together&lt;/td&gt;
&lt;td&gt; Kai Curtis at &lt;a href=&quot;http://www.substantial.com/&quot;&gt;Substantial&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Don&amp;#39;t worry if you don&amp;#39;t live in a big city, we&amp;#39;ll all be online, follow through to find out the details.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h3 id=&quot;to-recap&quot;&gt;&lt;a href=&quot;/Test-Jammin&quot;&gt;To recap&lt;/a&gt;:&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;TLDR/Elevator Pitch&lt;/em&gt;: If the community is going to move towards Swift, then let’s make sure that our Objective-C is in order by adding tests to established libraries.&lt;/p&gt;

&lt;p&gt;We have picked out 200 pods without tests, or with very low test coverage, ordered by popularity. These are assigned randomly to interested contributors. They then will aim to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add tests to the library.&lt;/li&gt;
&lt;li&gt;Add Continuous Integration.&lt;/li&gt;
&lt;li&gt;Add Code Coverage support.&lt;/li&gt;
&lt;li&gt;Submit a Pull Request to the original repo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We have already contacted all of the library authors letting them know that this is happening and that it would be cool for them participate. Some authors have written issues stating how they would like to have tests set up.&lt;/p&gt;

&lt;h3 id=&quot;how-it-works&quot;&gt;How it works&lt;/h3&gt;

&lt;p&gt;We will be focused on trying to improve existing tooling, but this does not mean that we will not be supportive for anyone taking the time to add tests to their own libraries. This is a great time to devote a day or two to improving your own libraries surrounded by people who are in a similar mindset. It will be the perfect time to ask questions in a community. We will be running the chat room based on the &lt;a href=&quot;https://www.recurse.com/manual#sub-sec-social-rules&quot;&gt;Social Rules&lt;/a&gt; of the Recurse Center. We&amp;#39;re aiming to have a fun space for people to get started with testing.&lt;/p&gt;

&lt;p&gt;We will be using IRC to chat, and to interact with our bot. We will be keeping stats inside a web page on &lt;a href=&quot;https://cocoapods.org/testjam&quot;&gt;CocoaPods.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you are new to IRC, you can connect either via &lt;a href=&quot;https://itunes.apple.com/gb/app/limechat/id414030210?mt=12&quot;&gt;Limechat&lt;/a&gt; (Mac App Store), a &lt;a href=&quot;https://webchat.freenode.net&quot;&gt;web-IRC adaptor&lt;/a&gt; or any client of your choice. We will be using the channel &lt;a href=&quot;irc://chat.freenode.net/cocoapods&quot;&gt;#cocoapods&lt;/a&gt; freenode.net and the &lt;a href=&quot;https://cocoapods.org/testjam&quot;&gt;CocoaPods Test Jam&lt;/a&gt; page will have information on how to get started.&lt;/p&gt;

&lt;h3 id=&quot;useful-links&quot;&gt;Useful links&lt;/h3&gt;

&lt;p&gt;Here&amp;#39;s a collection of useful links around the Jam and Testing in general:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cocoapods.org/testjam&quot;&gt;CocoaPods Test Jam Stats&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;irc://chat.freenode.net/cocoapods&quot;&gt;chat.freenode.net/cocoapods&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cocoapods.org/?q=uses%3Axctest*&quot;&gt;CocoaPods that use XCTest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.objc.io/issue-6/travis-ci.html&quot;&gt;Travis CI for iOS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.objc.io/issue-15/&quot;&gt;objc.io #15 - Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://list.her.sh/ios-test-coverage-with-coveralls/&quot;&gt;iOS Test Coverage with Coveralls&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://qualitycoding.org/archives/&quot;&gt;Quality Coding Archives&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bignerdranch.com/blog/dependency-injection-ios/&quot;&gt;Dependency Injection, iOS and You&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    <pubDate>Mon, 13 Apr 2015 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Prepare-to-Jam</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Prepare-to-Jam</guid>
  </item>
  
  
  
  <item>
    <title>Automating Everything</title>
    <description>&lt;p&gt;A few nights ago, I put out a release of CocoaPods that was unable to actually download new pods. Hoping to learn from that mistake, I turned to automation to ensure the team would never make the same mistake again.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;In CocoaPods, we automate a lot of things. Every gem repository has a &lt;code&gt;Gemfile&lt;/code&gt; and &lt;code&gt;Gemfile.lock&lt;/code&gt; (the &lt;a href=&quot;http://bundler.io&quot;&gt;Bundler&lt;/a&gt; equivalent of a &lt;code&gt;Podfile&lt;/code&gt; and &lt;code&gt;Podfile.lock&lt;/code&gt;) to ensure that all developers are using the exact same versions of RubyGems dependencies. Every repo has &lt;a href=&quot;https://github.com/bbatsov/rubocop&quot;&gt;RuboCop&lt;/a&gt; enabled, to ensure we keep coding style consistent. Every repo is set up to run on &lt;a href=&quot;https://travis-ci.org&quot;&gt;Travis CI&lt;/a&gt; and report test results back to &lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt;, as well as sending code coverage and quality information over to &lt;a href=&quot;https://codeclimate.com&quot;&gt;Code Climate&lt;/a&gt;. Every repo has a &lt;code&gt;Rakefile&lt;/code&gt; (a super-powered &lt;code&gt;Makefile&lt;/code&gt; for Ruby) to define common development tasks, such as running tests, generating data, and running RuboCop. That&amp;#39;s a lot of automation, right? Yes, but there&amp;#39;s more.&lt;/p&gt;

&lt;p&gt;To develop CocoaPods, not only do we have many repositories for different sites and different gems, but we also have a pair of meta-repositories, &lt;a href=&quot;https://github.com/CocoaPods/Rainforest&quot;&gt;Rainforest&lt;/a&gt; and &lt;a href=&quot;https://github.com/CocoaPods/Strata&quot;&gt;Strata&lt;/a&gt;. They manage the gem and web repos, respectively, and provide a litany of commonly used functionality, such as updating RuboCop configurations, seeding databases, and bootstrapping all of the repos they manage.&lt;/p&gt;

&lt;p&gt;Now, back to the story of the botched release (&lt;a href=&quot;https://rubygems.org/gems/cocoapods/versions/0.36.2&quot;&gt;CocoaPods 0.36.2&lt;/a&gt; if you were curious). Rainforest has a lovely &lt;code&gt;release&lt;/code&gt; task that goes far beyond the Bundler default release task by validating the version change, that &lt;code&gt;bundle install&lt;/code&gt; has been run, and that the &lt;code&gt;CHANGELOG&lt;/code&gt; has the correct headers. It also ensures that there are no missing remote commits, and that all the specs pass. It&amp;#39;s that last bit that went awry for me -- the CocoaPods &lt;code&gt;Gemfile&lt;/code&gt; points to various commits of the &lt;code&gt;master&lt;/code&gt; branches of its internal dependencies, even for that final specs run before a release. This is usally no problem, since we release depended-upon gems first, ending with the &lt;code&gt;cocoapods&lt;/code&gt; gem. This time, however, I had forgotten to do a release of &lt;code&gt;cocoapods-downloader&lt;/code&gt;, which is responsible for actually downloading Pods.&lt;/p&gt;

&lt;p&gt;In between CocoaPods 0.36.1 and 0.36.2, I had refactored an internal API to take an array instead of a string, and it just so happening this was an API that interacted with the downloader. Because the CocoaPods &lt;code&gt;Gemfile&lt;/code&gt; pointed to a more recent commit of &lt;code&gt;cocoapods-downloader&lt;/code&gt;, a normal run-through of the specs didn&amp;#39;t reveal the incompatibility. So I released 0.36.2, and it &amp;#39;broke&amp;#39; CocoaPods for a few hundred users before 0.36.3 was pushed. All in all, it wasn&amp;#39;t too big of a crisis, but it left me with a burning desire to make sure that nothing similar happens again. I was determined to bolster the release task to guard against a repition of this sort of mistake.&lt;/p&gt;

&lt;p&gt;So I &lt;a href=&quot;https://github.com/CocoaPods/Rainforest/pull/37&quot;&gt;hacked something together&lt;/a&gt; the next day to ensure that the final run of the specs before release runs only against already-released gems. On the CocoaPods team, I definitely fall on the hackier side of the scale, but we all share a belief that any sort of &lt;em&gt;process&lt;/em&gt; needs to be automated (and thus enforced by machine) to be accepted. Without automation, our distributed team that works random nights and weekends would begin to look more like a rag-tag group of wild coders than a team capable of building dependable software. There are a bunch of sayings that try and touch upon the cost-benefit analysis of automatic even simple tasks, but I don&amp;#39;t believe that any of them apply when you&amp;#39;re talking about a product that is used by multitudes of people: sure, I might spend five hours on a task, but if it can save each user thirty seconds, it&amp;#39;s a net gain.&lt;/p&gt;

&lt;p&gt;Additionally, automation has the benefit of being operator-agnostic. As an open source project, there&amp;#39;s a steady churn of contributors. We want to look towards the future and make sure that we&amp;#39;re not leaving compartmentalized knowledge in any one member of the team, so that any future member can seamlessly step into any role. Basically, when I say &amp;#39;automate everything&amp;#39;, I really mean it -- when I&amp;#39;ve automated something, I can put it out of my mind, confident that it will work. (Sounds familiar to those of you who write unit tests?)&lt;/p&gt;
</description>
    <pubDate>Mon, 06 Apr 2015 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Automating-Everything</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Automating-Everything</guid>
  </item>
  
  
  
  <item>
    <title>CocoaDocs Co-located</title>
    <description>&lt;p&gt;TL;DR: &lt;a href=&quot;http://cocoadocs.org&quot;&gt;CocoaDocs.org&lt;/a&gt; just got &lt;a href=&quot;https://github.com/realm/jazzy&quot;&gt;Jazzy&lt;/a&gt; support, became more stable, and is now sending stats to our status page.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h2 id=&quot;history&quot;&gt;History.&lt;/h2&gt;

&lt;p&gt;CocoaDocs is a server that generates CocoaPods documentation. It started out by generating Apple-compliant DocSets via &lt;a href=&quot;https://github.com/tomaz/appledoc&quot;&gt;appledoc&lt;/a&gt; on a hosted Mac and then sends the results to Amazon&amp;#39;s S3 where they are served statically.&lt;/p&gt;

&lt;h2 id=&quot;maturation-process&quot;&gt;Maturation Process&lt;/h2&gt;

&lt;p&gt;Appledoc is great, but it&amp;#39;s not going to be supporting Swift anytime soon. CocoaPods has been supporting Swift Pods since New Year 2014, and we wanted to be able to provide hosted documentation for these pods too. Sam Giddins took the initiative here and added &lt;a href=&quot;https://github.com/CocoaPods/cocoadocs.org/pull/279&quot;&gt;early support&lt;/a&gt; for Swift Pods via &lt;a href=&quot;http://realm.io&quot;&gt;Realm&lt;/a&gt;&amp;#39;s &lt;a href=&quot;https://github.com/realm/jazzy&quot;&gt;Jazzy&lt;/a&gt;. You can see a few Pods here: &lt;a href=&quot;http://cocoadocs.org/docsets/Observable-Swift/0.4.2/&quot;&gt;Observable&lt;/a&gt;, &lt;a href=&quot;http://cocoadocs.org/docsets/Moya/0.6.1/&quot;&gt;Moya&lt;/a&gt;, &lt;a href=&quot;http://cocoadocs.org/docsets/JSONJoy-Swift/0.9.1/&quot;&gt;JSONJoy&lt;/a&gt; and &lt;a href=&quot;http://cocoadocs.org/docsets/QRCodeReader.swift/3.1.7/&quot;&gt;QRReader.swift&lt;/a&gt;. There&amp;#39;s no fancy design work yet, we will get to that in time.&lt;/p&gt;

&lt;p&gt;Given Swift&amp;#39;s immaturity, this is going to be an interesting problem, as the CocoaDocs server has no way of determining which version of Swift your library supports. For now this is solved by only supporting stable Xcode releases. In the future, it may make sense to add a range of supported Swift releases to your podspec per-release.&lt;/p&gt;

&lt;p&gt;Towards the end of the 2014, the CocoaDocs server was starting to have some real issues, the generator would be down for days, and trying to &lt;code&gt;ssh&lt;/code&gt; in would fail. It was turning out that the shared VPS we were using was falling over after a certain amount of time, likely due to running out of RAM. In order to get the server back up and running I had to submit a support ticket and get someone else to reboot it.&lt;/p&gt;

&lt;p&gt;Around this time, &lt;a href=&quot;http://www.usebutton.com&quot;&gt;Button&lt;/a&gt; reached out to me to ask if this was a problem they could help solve. Given that until this time I had been paying for CocoaDocs myself, I had done everything I could to optimise it for my wallet. ( CocoaDocs was costing me about $450 a year. ) So we jumped at the chance to do it right. CocoaDocs is now running on &lt;a href=&quot;http://www.macminicolo.net&quot;&gt;macminicolo.net&lt;/a&gt;, and it&amp;#39;s a dream to ssh or Screen Share.app in. Thanks a lot &lt;a href=&quot;http://www.usebutton.com&quot;&gt;Button&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;In the &lt;a href=&quot;https://github.com/CocoaPods/cocoadocs.org/issues/320&quot;&gt;process&lt;/a&gt; of moving I added one more feature. We now send data to the &lt;a href=&quot;http://status.cocoapods.org&quot;&gt;CocoaPods status&lt;/a&gt; page saying how many pods have been documented in the last 24hrs. Hopefully this should result in some useful insight into &amp;quot;is it working?&amp;quot; and give a sense of how much work it is doing.&lt;/p&gt;
</description>
    <pubDate>Mon, 23 Mar 2015 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaDocs-Colo</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaDocs-Colo</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods.org Take Two</title>
    <description>&lt;p&gt;TL;DR: &lt;a href=&quot;http://cocoapods.org&quot;&gt;CocoaPods.org&lt;/a&gt; version 2.1 has been released, with support for inline deep search results, and pod pages.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;style&gt;
  /* for the CP preview */
.container &gt; .row &gt; .content &gt; center &gt; a &gt; img {
  border: 1px solid black;
}
&lt;/style&gt;

&lt;h2 id=&quot;backstory&quot;&gt;Backstory.&lt;/h2&gt;

&lt;p&gt;The CocoaPods web site is an interesting beast. In October 2013, we started &lt;a href=&quot;http://blog.cocoapods.org/redesign/&quot;&gt;rewriting&lt;/a&gt; the CocoaPods web pages. We centralized the documentation, created a blog and redesigned everything. &lt;/p&gt;

&lt;p&gt;We settled on using a mix of middleman pages and jekyll. Given that, at the time, there was no central database for CocoaPods, it made sense to try to keep it as a static site for speed and maintainability. Once &lt;a href=&quot;http://blog.cocoapods.org/CocoaDocs2-Launch/&quot;&gt;CocoaDocs v2&lt;/a&gt; launched in May 2014, I set my sights on trying to move cocoapods.org a little bit closer to my larger vision of what the website would provide.&lt;/p&gt;

&lt;p&gt;In an ideal world, you should be able to find a library that fits your constraints using just the front page of CocoaPods.org. Often there is more than one library, and that’s where things gets a bit more complex. In previous versions of the site, in order to choose between multiple libraries, you needed to open them up on GitHub in separate tabs and compare. Now, you don’t need to. 🎉&lt;/p&gt;

&lt;h2 id=&quot;here-s-how-it-works&quot;&gt;Here’s how it works&lt;/h2&gt;

&lt;p&gt;Let’s take a random pod. &lt;a href=&quot;http://cocoapods.org/pods/MiniFuture&quot;&gt;MiniFuture&lt;/a&gt;. This is what happens after a Pod is released:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A new Podspec version is added to &lt;a href=&quot;http://blog.cocoapods.org/CocoaPods-Trunk/&quot;&gt;Trunk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A webhook from trunk triggers a reindex of the pod in the search engine which uses the generated metadata to sort and display pod results.&lt;/li&gt;
&lt;li&gt;Another webhook gets sent to CocoaDocs triggering a documentation build&lt;/li&gt;
&lt;li&gt;The documentation build uses &lt;a href=&quot;https://github.com/realm/jazzy&quot;&gt;Jazzy&lt;/a&gt; ( or &lt;a href=&quot;https://github.com/tomaz/appledoc&quot;&gt;appledoc&lt;/a&gt; for Objective-C projects ) to generate documentation. &lt;/li&gt;
&lt;li&gt;Then CocoaDocs starts generating metadata. This provides us with a rich dataset to start providing some useful statistics. This is centralized in &lt;a href=&quot;http://blog.cocoapods.org/metrics-api/&quot;&gt;metrics.cocoapods.org&lt;/a&gt;, where we currently hold up-to-date GitHub metrics also.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;json language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span class=&quot;err&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;http://metrics.cocoapods.org/api/v&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;/pods/MiniFuture&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;quot;cocoadocs&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;created_at&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;2015-03-08 16:48:25 UTC&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;doc_percent&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;22&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;dominant_language&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Swift&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;download_size&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;416&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;initial_commit_date&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;2015-03-01 12:03:09 UTC&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;license_canonical_url&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;http://opensource.org/licenses/MIT&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;license_short_name&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;MIT&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;notability&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;quality_estimate&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;readme_complexity&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;72&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;rendered_readme_url&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;http://cocoadocs.org/docsets/MiniFuture/0.1.0/README.html&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;total_comments&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;total_files&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;total_lines_of_code&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;327&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;total_test_expectations&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;204&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;updated_at&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;2015-03-08 16:48:25 UTC&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;quot;github&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;contributors&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;created_at&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;2015-03-01 10:09:08 UTC&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;forks&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;language&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Swift&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;open_issues&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;open_pull_requests&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;stargazers&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;subscribers&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;updated_at&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;2015-03-05 01:01:44 UTC&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A preview image is generated for the library for Social Media, chat, or really anything that supports open graph previews. &lt;a href=&quot;https://github.com/CocoaPods/cocoadocs.org/blob/master/classes/social_image_generator.rb#L20-L39&quot;&gt;Here is&lt;/a&gt; how we figure the wording.
&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;http://cocoadocs.org/docsets/MiniFuture/0.1.0/preview.png &#39;&gt;&lt;img  src=&#39;http://cocoadocs.org/docsets/MiniFuture/0.1.0/preview.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We then generate an estimated quality number for the library. This is based on a collection of &lt;a href=&quot;https://github.com/CocoaPods/cocoadocs-api/blob/master/quality_modifiers.rb&quot;&gt;individual metrics&lt;/a&gt; that are applied to the generated metrics data. They take a library and add or remove points based whether the rule applies for that library. These range from the popularity of the library, total test expectations / lines of code to the files, and average lines of code per file in the library.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;json language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span class=&quot;err&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;https://cocoadocs-api-cocoapods-org.herokuapp.com/pods/MiniFuture/stats&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;applies_for_pod&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Testing a library shows that the developers care about long term quality on a project as internalized logic is made explicit via testing.&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;modifier&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;-20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;title&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Test Expectations / Line of Code&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;applies_for_pod&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Too big of a library can impact startup time, and add redundant assets.&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;modifier&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;-10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;title&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Download size&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;applies_for_pod&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Smaller, more composeable classes tend to be easier to understand.&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;modifier&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;-8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;title&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Lines of Code / File&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;applies_for_pod&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;A popular library means there can be a community to help improve and maintain a project.&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;modifier&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;quot;title&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Is popular&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;This gives enough metadata to start creating a page that represents the library with the kind of context that is specific to our community. In a lot of ways it can be better than the front page of the GitHub repo.&lt;/p&gt;

&lt;h2 id=&quot;how-it-comes-together&quot;&gt;How it comes together&lt;/h2&gt;

&lt;p&gt;We use the quality metrics in search to order the results. There are quite a few different &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/238b497872857e7b44ac715170888ef7f5ba046b/lib/search.rb#L345&quot;&gt;sorting options&lt;/a&gt; now, so we may look into offering choices there.&lt;/p&gt;

&lt;p&gt;We&amp;#39;ve started exposing a good chunk of the information in a pod&amp;#39;s profile pages, and via inline results but not all of it. There&amp;#39;s &lt;a href=&quot;https://github.com/CocoaPods/cocoapods.org/issues/107&quot;&gt;interesting&lt;/a&gt; &lt;a href=&quot;https://github.com/CocoaPods/cocoapods.org/issues/106&quot;&gt;issues&lt;/a&gt; around how we can expose more.&lt;/p&gt;

&lt;h2 id=&quot;going-forward&quot;&gt;Going forward&lt;/h2&gt;

&lt;p&gt;The APIs we use are all available for anyone to build things on top of. This data is pretty solid, the API routes won&amp;#39;t be changing and work is on-going to make it more accurate. We&amp;#39;ll only be expanding from here.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s not perfect, but a website isn&amp;#39;t an iOS app and we can deploy daily. We re-wrote the homepage to run directly from the new databases and it&amp;#39;s simplified the development process a lot. So it&amp;#39;s easy for anyone to contribute and help out. We&amp;#39;ll be iterating on it for a while before stablizing, so we&amp;#39;d love feedback in &lt;a href=&quot;https://github.com/CocoaPods/cocoapods.org/issues/new&quot;&gt;an issue&lt;/a&gt; or on twitter.&lt;/p&gt;

&lt;h2 id=&quot;it-took-a-bunch-of-people-too&quot;&gt;It took a bunch of people too&lt;/h2&gt;

&lt;p&gt;Whilst I have been championing this feature for the last 8 months, I&amp;#39;ve had a lot of help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://florianhanke.com&quot;&gt;Florian Hanke&lt;/a&gt;, &lt;a href=&quot;http://segiddins.me&quot;&gt;Samuel Giddins&lt;/a&gt;, &lt;a href=&quot;http://www.hugotunius.se&quot;&gt;Hugo Tunis&lt;/a&gt; on metrics, search and a CocoaDocs API.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://kylefuller.co.uk&quot;&gt;Kyle Fuller&lt;/a&gt; on countless CocoaDocs improvements and maintainace&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dbgrandi.github.io&quot;&gt;David Grandinetti&lt;/a&gt;, &lt;a href=&quot;http://lazerwalker.com&quot;&gt;Mike Lazer-Walker&lt;/a&gt;, &lt;a href=&quot;http://tang.io&quot;&gt;Phil Tang&lt;/a&gt;, &lt;a href=&quot;http://modocache.svbtle.com&quot;&gt;Brian Gesiak&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/dannyhertz&quot;&gt;Danny Hertz&lt;/a&gt; on Quality/Popularity Metrics&lt;/li&gt;
&lt;/ul&gt;
</description>
    <pubDate>Mon, 16 Mar 2015 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods.org-Take-Two</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods.org-Take-Two</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 0.36 - Framework and Swift Support</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;CocoaPods 0.36&lt;/em&gt; has been released, with the long-awaited support for Frameworks and Swift.&lt;/p&gt;

&lt;p&gt;CocoaPods 0.36 adds support for dynamic frameworks, and with that it also brings enhanced support for dependencies using Apple&amp;#39;s new programming language, Swift. This has been one of the largest singular changes in CocoaPods, affecting almost all of CocoaPods&amp;#39; subsystems such as &lt;a href=&quot;https://github.com/CocoaPods/Xcodeproj#xcodeproj&quot;&gt;Xcodeproj&lt;/a&gt;.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h2 id=&quot;and-there-were-swift-dynamic-frameworks-on-ios&quot;&gt;And there were Swift &amp;amp; Dynamic Frameworks on iOS&lt;/h2&gt;

&lt;p&gt;Dynamic frameworks have always been available on OS X. That&amp;#39;s different for iOS.
Apple&amp;#39;s mobile platform introduced third-party dynamic framework support in iOS 8.
So the least common denominator was found before with using static libraries, which have always been supported on both platforms.&lt;/p&gt;

&lt;p&gt;At the same time Dynamic Frameworks were introduced on iOS, Apple also introduced Swift.
If you have third-party dependencies in Swift, you have only two choices:
Either throw them in your project and compile one fat binary, which is no practical solution as this increases build times by limited availability of incremental compilation and makes it hard to generically manage very different dependencies, which could require different build settings etc. Or you can facilitate frameworks.
Static libraries are not an option anymore.&lt;/p&gt;

&lt;p&gt;Why is that the case? Because Apple doesn&amp;#39;t let you build static libraries that contain Swift. Unlike Objective-C, Apple doesn&amp;#39;t ship the Swift standard runtime libraries with iOS.
This decouples the language version from the platform version.
When you build an app with Swift, you&amp;#39;re responsible yourself to ship them.
By default, Xcode uses &lt;code&gt;swift-stdlib-tool&lt;/code&gt; to handle copying the Swift runtime dylibs, &lt;a href=&quot;http://samdmarshall.com/blog/swift_and_objc.html&quot;&gt;but the tooling falls short when attempting to ship frameworks that use Swift with an app that is Objective-C only&lt;/a&gt;.
Your app executable and the frameworks you ship will all use the same set of dylibs, which are embedded into the &lt;code&gt;Frameworks&lt;/code&gt; subdirectory of the application bundle. First, that&amp;#39;s because you can&amp;#39;t link against different versions of the standard libraries.
Furthermore it is desirable to embed them only once and not multiple times, because of constraints to memory size and network speed, which are relevant for distribution.&lt;/p&gt;

&lt;p&gt;With this release, we initially allow you to use both in combination with CocoaPods.
You can make CocoaPods integrate to your project via frameworks instead of static libraries by specifying &lt;code&gt;use_frameworks!&lt;/code&gt;.
If that&amp;#39;s not present, you won&amp;#39;t be able to integrate dependencies, if you depend on a pod which includes Swift source code.
This is an all or nothing approach per integrated targets, because we can&amp;#39;t ensure to properly build frameworks, whose transitive dependencies are static libraries.
This release goes along with probably one of the most drastic changes of the whole project, which includes CocoaPods itself, but also required similar changes to Xcodeproj as well.&lt;/p&gt;

&lt;h2 id=&quot;dynamic-frameworks-vs-static-libraries&quot;&gt;Dynamic Frameworks vs. Static Libraries&lt;/h2&gt;

&lt;h5 id=&quot;so-whats-the-difference-between-those-both-product-types&quot;&gt;So what&amp;#39;s the difference between those both product types?&lt;/h5&gt;

&lt;p&gt;One difference is obvious in their names: Dynamic and Static are opposites.
This explains how they are linked to your code when integrated.
Static libraries are just archives of your compiled source code, which can be partly integrated.
They are &lt;strong&gt;not&lt;/strong&gt; linked themselves before they are linked somewhere else.
Dynamic libraries are final linked executables.
When they are built, they are linked and the linker encodes what their dependencies are and where those are expected to be.
Once they are built, the binary itself isn&amp;#39;t altered anymore.&lt;/p&gt;

&lt;p&gt;Another difference is their file system representation: Frameworks are bundles, which basically means that they are directories, which have the file suffix &lt;code&gt;.framework&lt;/code&gt; and Finder treats them mostly like regular files. While libraries are just single FAT-binaries, which can&amp;#39;t carry any resources as distinct files. If you tap into a framework, you will see a common directory structure:&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/CocoaPods-0.36/bananakit_structure.png&#39;&gt;&lt;img width=&quot;503&quot; class=&quot;image-zooma&quot;  src=&#39;/assets/blog_img/CocoaPods-0.36/bananakit_structure.png&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;They bundle some further data besides a binary, which is in that case dynamically linkable and holds different slices for each architecture.
But that&amp;#39;s only part, which static libraries covered so far. Belong the further data, there are the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Public Headers&lt;/strong&gt; - These are stripped for application targets, as they are only important to distribute the framework as code for compilation. The public headers also include the generated headers for public Swift symbols, e.g. &lt;code&gt;BananaKit-Swift.h&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A Code Signature For The Whole Contents&lt;/strong&gt; - This has to be (re-)calculated on embedding a framework into an application target, as the headers are stripped before.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Its Resources&lt;/strong&gt; - The resources used e.g. Images for UI components.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hosted Dynamic Frameworks and Libraries&lt;/strong&gt; - This can be the case for so called Umbrella Frameworks provided by Apple. There is no use-case, where this happens with CocoaPods.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Clang Module Map&lt;/strong&gt; - This is mostly an internal toolchain artifact, which carries declarations about header visibility and module link-ability.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An Info.plist&lt;/strong&gt; - This specifies author, version and copyright information.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;caveats&quot;&gt;Caveats&lt;/h3&gt;

&lt;p&gt;One caveat about bundling resources is, that until now we had to embed all resources into the application bundle.
The resources were referenced programmatically by &lt;code&gt;[NSBundle mainBundle]&lt;/code&gt;.
Pod authors were able to use &lt;code&gt;mainBundle&lt;/code&gt; referencing to include resources the Pod brought into the app bundle.
But with frameworks, you have to make sure that you reference them more specifically by getting a reference to your framework&amp;#39;s bundle e.g.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;objective-c language-objective-c&quot; data-lang=&quot;objective-c&quot;&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;NSBundle&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;bundleForClass&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ClassFromPodspec&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;swift language-swift&quot; data-lang=&quot;swift&quot;&gt;&lt;span class=&quot;bp&quot;&gt;NSBundle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;forClass&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ClassFromPodspec&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;This will then work for both frameworks and static libraries.
There are only very rare cases, where you want to reference the main bundle directly or indirectly, e.g. by using &lt;code&gt;[UIImage imageNamed:]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The advantage to the improved resource handling is that resources won&amp;#39;t conflict when they have the same names.
They are namespaced by the framework bundle.
Furthermore we don&amp;#39;t have to apply the build rules ourself to the resources as e.g. asset catalogs and storyboards need to be compiled.
This should decrease build times for projects using Pods that include many resources.&lt;/p&gt;

&lt;h3 id=&quot;ibdesignable-another-reason-for-frameworks&quot;&gt;&lt;code&gt;@IBDesignable&lt;/code&gt; - Another Reason for Frameworks&lt;/h3&gt;

&lt;p&gt;Xcode 6 allows you to preview your own custom view components in Interface Builder.
To make use of that, the view component must live in its own framework.&lt;/p&gt;

&lt;h3 id=&quot;more-about-frameworks&quot;&gt;More about Frameworks&lt;/h3&gt;

&lt;p&gt;If you want to learn more about Frameworks, take a look into the &lt;a href=&quot;https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPFrameworks/Frameworks.html#//apple_ref/doc/uid/10000183-SW1&quot;&gt;Framework Programming Guide&lt;/a&gt;.
Even though this was not written specifically for the new Cocoa Touch Frameworks, how Apple calls them in their Xcode target template, those are mostly the same to the classic OS X frameworks, so this document is still a helpful introduction.&lt;/p&gt;

&lt;h2 id=&quot;private-pods-and-source&quot;&gt;Private Pods and &lt;code&gt;source&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;On a last note, another change in this version is regarding private spec repositories.&lt;/p&gt;

&lt;p&gt;In CocoaPods 0.36 and onwards, when using pods from private spec repositories, you will need to &lt;a href=&quot;http://guides.cocoapods.org/making/private-cocoapods.html#thats-it&quot;&gt;explicity list all the spec repositories&lt;/a&gt; that are used, using the &lt;code&gt;source&lt;/code&gt; directive in your &lt;code&gt;Podfile&lt;/code&gt;.&lt;br&gt;
This is important for ensuring everybody in your team uses the same reference of specs whatever their local configuration is.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note that if you don&amp;#39;t use private pods (and only use pods from the official spec repo), you don&amp;#39;t need to list any &lt;code&gt;source&lt;/code&gt; as this will defaults to only using &lt;code&gt;CocoaPods/Specs&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;/h2&gt;

&lt;p&gt;To install the last release of CocoaPods you can run:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;sudo&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; gem install cocoapods
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Until version 1.0 we strongly encourage you to keep CocoaPods up-to-date.&lt;/p&gt;

&lt;p&gt;For all the details, don’t miss the
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/blob/0.36.0/CHANGELOG.md&quot;&gt;Changelog&lt;/a&gt;!&lt;/p&gt;
</description>
    <pubDate>Wed, 11 Mar 2015 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-0.36</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-0.36</guid>
  </item>
  
  
  
  <item>
    <title>Test Jam</title>
    <description>&lt;p&gt;Last year, around this time, we ran a &lt;a href=&quot;http://blog.cocoapods.org/CocoaPods-Bug-Bash/&quot;&gt;Bug Bash&lt;/a&gt; over a weekend. It went beautifully. We triaged a whole lot of issues, got a lot of minor issues fixed and found some new members for the core team.&lt;/p&gt;

&lt;p&gt;Not ones to repeat ourselves, we’ve begun preparations on the next big community event. It’s a test jam, and everyone is invited.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;TLDR/Elevator Pitch&lt;/em&gt;: If the community is going to move towards Swift, then let’s make sure that our Objective-C is in order by adding tests to established libraries.&lt;/p&gt;

&lt;p&gt;Find out more below.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Date: April 18th + 19th 2015
Locations: NYC / SF / + More&lt;/p&gt;

&lt;p&gt;We have picked out 200 pods without tests, or with very low test coverage, ordered by &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/master/lib/models/pod.rb#L43-L56&quot;&gt;popularity&lt;/a&gt;. These are assigned randomly to interested contributors. They then will aim to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add tests to the library.&lt;/li&gt;
&lt;li&gt;Add &lt;a href=&quot;http://docs.travis-ci.com/user/languages/objective-c/&quot;&gt;Travis CI&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Add &lt;a href=&quot;https://coveralls.io&quot;&gt;Coveralls Support&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Submit a Pull Request to the original repo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will be operating a chat room with a lot of high high profile names in Cocoa testing over the weekend offering advice. So if testing is new to you, it may be a perfect time to start.&lt;/p&gt;

&lt;p&gt;Which tool each contributor chooses to write tests is up to the owner of a library. This isn’t about wrestling control from them, but supporting the project. They could prefer &lt;a href=&quot;http://www.objc.io/issue-15/xctest.html&quot;&gt;XCTest&lt;/a&gt;, &lt;a href=&quot;https://github.com/specta/specta&quot;&gt;Specta&lt;/a&gt; / &lt;a href=&quot;https://github.com/specta/expecta&quot;&gt;Expecta&lt;/a&gt; , &lt;a href=&quot;https://github.com/kiwi-bdd/Kiwi&quot;&gt;Kiwi&lt;/a&gt; or &lt;a href=&quot;https://github.com/pivotal/cedar&quot;&gt;Cedar&lt;/a&gt;. Each project will, ideally, have an issue stating this upfront. If not, it’s up to the contributor to decide.&lt;/p&gt;

&lt;p&gt;We’re planning on emailing all authors soon offering the chance to opt-out or to advise on how to communicate a project’s testing intentions. &lt;/p&gt;

&lt;p&gt;Finally we’ll likely be having office space in &lt;a href=&quot;https://foursquare.com/v/artsy/4f53d65de4b0b589399898a1&quot;&gt;NYC (Artsy HQ)&lt;/a&gt;, &lt;a href=&quot;http://www.meetup.com/CocoaPods-SF/events/220783749/&quot;&gt;SF (Realm HQ)&lt;/a&gt; and more (feel free to &lt;a href=&quot;mailto:info@cocoapods.org&quot;&gt;email us&lt;/a&gt; if you want to do one in your city.) So you can sit with fellow testers, discuss difficulties and share triumphs. &lt;/p&gt;

&lt;p&gt;🎉&lt;/p&gt;
</description>
    <pubDate>Sat, 21 Feb 2015 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Test-Jammin</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Test-Jammin</guid>
  </item>
  
  
  
  <item>
    <title>The captain leaves the bridge</title>
    <description>&lt;p&gt;TL:DR I&amp;#39;ve had a fantastic 5 years making CocoaPods what it is today, but now it is time to care for my other babies: my new job, my house boat, and my actual baby!!! I will still work on CocoaPods, but not as much. Thank you all for a great 5 years!&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;https://www.flickr.com/photos/98809276@N08/16244476607/&#39;&gt;&lt;img alt=&quot;Got my coin and finally became an official core contributor!&quot;  src=&#39;https://farm8.staticflickr.com/7426/16244476607_e40a27dd1c_c.jpg&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;I don’t know about you, but for me 2015 is going to be a year full of changes. I’ll be very busy and as such will have to make some concessions, but I’ll get back to that at the end. First, I’d like to share some of the amazing events that I will encounter this year.&lt;/p&gt;

&lt;h2 id=&quot;new-job&quot;&gt;New job&lt;/h2&gt;

&lt;p&gt;Starting &lt;strong&gt;today&lt;/strong&gt;, I’ll commence at my new job as a mobile software engineer at &lt;a href=&quot;https://artsy.net&quot;&gt;Artsy&lt;/a&gt;. This is an exciting opportunity for me, both for the technical challenges and the admirable mission to &lt;em&gt;bring all visual art online&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;For now this means that I’ll be spending the better part of February getting up to speed with work at Artsy.&lt;/p&gt;

&lt;h2 id=&quot;new-houseboat&quot;&gt;New houseboat&lt;/h2&gt;

&lt;p&gt;For the past decade, my wife and I have been living on a houseboat in Amsterdam and for the last four years we’ve been trying to get a new one built. This time was, unfortunately, mainly spent dealing with bureaucracy, but last year we finally got all permits approved and building commenced.&lt;/p&gt;

&lt;p&gt;While the expected shipping date has been slowly delayed, the new boat is expected to ship in February (pun intended). Around this time, I’ll have to spend significant amounts of time on finishing work on the boat.&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;&lt;/article&gt;&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
  &lt;section class=&quot;container&quot;&gt;
    &lt;div class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;
        &lt;center&gt;
          &lt;a href=&quot;https://www.flickr.com/gp/98809276@N08/05pKkf/&quot;&gt;&lt;img src=&quot;https://farm8.staticflickr.com/7450/16415833131_9f7dcba445_m.jpg&quot; width=&quot;200&quot; height=&quot;150&quot;&gt;&lt;/a&gt;
          &lt;a href=&quot;https://www.flickr.com/gp/98809276@N08/05pKkf/&quot;&gt;&lt;img src=&quot;https://farm8.staticflickr.com/7385/16416660772_b07c4f9a5c_m.jpg&quot; width=&quot;200&quot; height=&quot;150&quot;&gt;&lt;/a&gt;
          &lt;a href=&quot;https://www.flickr.com/gp/98809276@N08/05pKkf/&quot;&gt;&lt;img src=&quot;https://farm9.staticflickr.com/8655/16417589545_a4322c32e0_m.jpg&quot; width=&quot;200&quot; height=&quot;150&quot;&gt;&lt;/a&gt;
        &lt;/center&gt;
      &lt;/article&gt;
    &lt;/div&gt;
  &lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;&lt;article class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;h2 id=&quot;actual-baby&quot;&gt;Actual baby&lt;/h2&gt;

&lt;p&gt;While CocoaPods and the building of our new houseboat could be considered “babies”, there is no substitution for the real deal.&lt;/p&gt;

&lt;p&gt;I&amp;#39;m absolutely thrilled to say that my wife and I have been blessed with the gift of an actual human baby. We’re now at the 20 week mark, we now know it will be a boy, and that he’s in great health.&lt;/p&gt;

&lt;p&gt;With the expected delivery set for the end of May, you can imagine the amount of time I will be spending on preparing our new houseboat for the baby.&lt;/p&gt;

&lt;h2 id=&quot;cocoapods&quot;&gt;CocoaPods&lt;/h2&gt;

&lt;p&gt;When I started on CocoaPods 5 years ago, I got to implement all the code myself and I had great fun doing that, but I have always wanted CocoaPods to be a community project and not have it stick to my name necessarily.&lt;/p&gt;

&lt;p&gt;As such, over the past two years I have been doing less and less actual code implementation and more and more lead and maintainer coordination work. Most days I spent at least a couple of hours a day on CocoaPods. The amount of work I put in could easily be considered a part-time job.&lt;/p&gt;

&lt;p&gt;During this time we have done an amazing amount of work, I have probably learned more about Xcode than any human should, helped more than a few people get started with open-source contributions, and helped at least a few to make their name and advance their careers. I am immensely proud of all of this and thankful for having been a part of this.&lt;/p&gt;

&lt;p&gt;However, with all the changes for 2015 listed above, I am sure you can imagine the time constraints I will be under in this coming year. That combined with the amount of time I used to spend daily on CocoaPods work would leave little time for fun stuff to work on, lead to guilt over not getting tasks finished on time, or be feasible at all.&lt;/p&gt;

&lt;p&gt;Therefore, I am now announcing, with slight pain in my heart, that the time has come for me to step down.&lt;/p&gt;

&lt;h2 id=&quot;what-does-this-all-mean-for-the-future&quot;&gt;What does this all mean for the future?&lt;/h2&gt;

&lt;p&gt;I am not going away, I am simply moving more to the background. The most important parts being that I will relinquish day-to-day lead and maintainer work. These jobs will be taken over by the excellent &lt;a href=&quot;http://twitter.com/kylefuller&quot;&gt;Kyle&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/orta&quot;&gt;Orta&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Kyle will focus on the technical aspects, such as identifying issues, reviewing patches, and release management; summarized as the technical lead.&lt;/p&gt;

&lt;p&gt;Orta, on the other hand, will focus on the user oriented design aspects, ensuring that the command-line interface and DSLs are kept as simple and intuitive as possible; summarized as the user-experience lead.&lt;/p&gt;

&lt;p&gt;They have already gradually been taking on these roles over the past months and with great success. With the support of the other core members, myself included, I have no doubt that they will make the homestretch to version 1.0.0 a successful one.&lt;/p&gt;

&lt;p&gt;During this homestretch there are a few fun tasks that I will then have time to work on and I can&amp;#39;t wait to work on those and show them to you.&lt;/p&gt;

&lt;p&gt;For now, keep being awesome. With &amp;lt;3 from Amsterdam.&lt;/p&gt;
</description>
    <pubDate>Mon, 02 Feb 2015 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/The-captain-leaves-the-bridge</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/The-captain-leaves-the-bridge</guid>
  </item>
  
  
  
  <item>
    <title>Pod Authors Guide to CocoaPods Frameworks</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;CocoaPods 0.36&lt;/em&gt; will bring the long-awaited support for Frameworks and Swift.
It isn&amp;#39;t released and considered stable yet, but a beta is now available for everyone via &lt;code&gt;[sudo] gem install cocoapods --pre&lt;/code&gt;.
Pod authors will especially want to try this version to make sure their pods will work with the upcoming release. This is because if a single dependency in a user&amp;#39;s project requires being a framework, then your Pod will also become a framework.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h2 id=&quot;what-is-special-about-frameworks-integrated-by-cocoapods&quot;&gt;What is special about Frameworks integrated by CocoaPods?&lt;/h2&gt;

&lt;p&gt;With CocoaPods, Frameworks are mostly set up in way similar to how it is done via Xcode.
This is to make the entire integration inspectable, understandable and allows us to unleash the power of the whole existing toolchain.&lt;/p&gt;

&lt;p&gt;Many of the tools only play nicely together in an Xcode environment where certain build variables are present.
Cocoa Touch Frameworks use Clang Modules, which are also required to import and link them to your Swift app.
Therefore the module map is included in the built framework bundle.&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/Frameworks-Developers/frameworks_vs_libraries.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/Frameworks-Developers/frameworks_vs_libraries.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;h2 id=&quot;dynamic-frameworks-vs-static-libraries&quot;&gt;Dynamic Frameworks vs. Static Libraries&lt;/h2&gt;

&lt;p&gt;So what&amp;#39;s the difference between those two product types?&lt;/p&gt;

&lt;p&gt;Dynamic Frameworks are bundles, which basically means that they are directories with the file suffix &lt;code&gt;.framework&lt;/code&gt; and Finder treats them mostly like regular files. If you tap into a framework, you will see a common directory structure:&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/Frameworks-Developers/bananakit_framework.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/Frameworks-Developers/bananakit_framework.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;They bundle extra data besides a binary, which is in that case dynamically linkable and holds different slices for each architecture. Up to this point it is the same as a static library. However, a framework holds the following additional data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Public Headers&lt;/strong&gt; - These are stripped for application targets, as they are only important to distribute the framework as code for compilation. The public headers also include the generated headers for public Swift symbols, e.g. &lt;code&gt;Alamofire-Swift.h&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A Code Signature For The Whole Contents&lt;/strong&gt; - This has to be (re-)calculated when embedding a framework into an application target, as the headers are stripped before.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Its Resources&lt;/strong&gt; - The resources used e.g. Images for UI components.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hosted Dynamic Frameworks and Libraries&lt;/strong&gt; - This can be the case for so called Umbrella Frameworks provided by Apple. There are no use-cases where this happens with CocoaPods.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Clang Module Map&lt;/strong&gt; and &lt;strong&gt;the Swift modules&lt;/strong&gt; - These are mostly internal toolchain artifacts, which carry declarations about API / header visibility and module link-ability.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An Info.plist&lt;/strong&gt; - This specifies author, version and copyright information.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One caveat about bundling resources is, that until now we had to embed all resources into the application bundle. These resources were referenced programmatically by &lt;code&gt;[NSBundle mainBundle]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pod authors were able to use &lt;code&gt;mainBundle&lt;/code&gt; referencing to include resources the Pod brought into the app bundle.
But with frameworks, you have to make sure that you reference them more specifically by getting a reference to your framework&amp;#39;s bundle e.g.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;objective-c language-objective-c&quot; data-lang=&quot;objective-c&quot;&gt;&lt;span class=&quot;cp&quot;&gt;# in Objective-C&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;NSBundle&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;bundleForClass&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ClassFromPodspec&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;cp&quot;&gt;# or in swift&lt;/span&gt;
&lt;span class=&quot;bp&quot;&gt;NSBundle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;forClass&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ClassFromPodspec&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;This will then work for both frameworks and static libraries. There are very few cases where you want to reference the main bundle directly or indirectly, e.g. by using &lt;code&gt;[UIImage imageNamed:]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The advantage to this improved resource handling is that resources won&amp;#39;t conflict when they have the same names because they are namespaced by the framework bundle.
Furthermore we don&amp;#39;t have to apply the build rules to the resources ourselves as e.g. asset catalogs and storyboards need to be compiled. This should decrease build times for project using Pods that include many resources.&lt;/p&gt;

&lt;h3 id=&quot;module-names&quot;&gt;Module Names&lt;/h3&gt;

&lt;p&gt;Names of Clang Modules are limited to be C99ext-identifiers. This means that they can only contain alphanumeric characters and underscores, and cannot begin with a number. Looking through the official spec repo, we discovered some popular pods, which don&amp;#39;t match these requirements.&lt;/p&gt;

&lt;p&gt;Before, as a Pod author, you could use &lt;code&gt;header_dir&lt;/code&gt; to customize the name prefixing your headers from the user target. E.g. if your pod is named &lt;code&gt;123BánànâKit&lt;/code&gt;, you could set it to &lt;code&gt;BananaKit&lt;/code&gt;, it is available by &lt;code&gt;import &amp;lt;BananaKit/BananaKit.h&amp;gt;&lt;/code&gt; instead of &lt;code&gt;#import &amp;lt;123BánànâKit/BananaKit.h&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We are still supporting this usage, but also introducing a new attribute &lt;code&gt;module_name&lt;/code&gt;, which you declare in your Podspecs. This new attribute has the advantage that it will be properly linted and verified, otherwise we will work from the &lt;code&gt;header_dir&lt;/code&gt; option. If either attribute is not present then we will derive with the spec&amp;#39;s name to match the Clang Module name requirements.&lt;/p&gt;

&lt;p&gt;In a nutshell, look at the following Swift snippet, which concisely expresses the way in which we determine the module name.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;swift language-swift&quot; data-lang=&quot;swift&quot;&gt;&lt;span class=&quot;c1&quot;&gt;//let c99ext_identifier: String -&amp;gt; String?&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;module_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Specification&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;module_name&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;??&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c99ext_identifier&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;header_dir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;??&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c99ext_identifier&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h3 id=&quot;module-maps&quot;&gt;Module Maps&lt;/h3&gt;

&lt;p&gt;A Module Map is a declaration of the headers, which form the public (or private) interface of a Clang Module.
Luckily, those have been designed so that they can stay in the background and the developer can leverage known and existing structures, without having to learn the DSL.
The default modulemap looks basically always the same:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;framework module BananaKit {
  umbrella header &amp;quot;BananaKit.h&amp;quot;

  export *
  module * { export * }
}
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;This references only one file explicitly: the umbrella header.&lt;/p&gt;

&lt;p&gt;You can export the public API for your framework inside a umbrella header and &lt;em&gt;all transitive imported&lt;/em&gt; headers.
Clang will take care of making module exports that can be imported by Objective-C and Swift.&lt;/p&gt;

&lt;h3 id=&quot;what-does-transitive-imported-mean-in-this-context&quot;&gt;What Does &lt;em&gt;Transitive Imported&lt;/em&gt; Mean In This Context?&lt;/h3&gt;

&lt;p&gt;Transitive relations are a &lt;a href=&quot;http://en.wikipedia.org/wiki/Transitive_relation&quot;&gt;mathematical concept&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Whenever an element &lt;em&gt;a&lt;/em&gt; is related to an element &lt;em&gt;b&lt;/em&gt;, and &lt;em&gt;b&lt;/em&gt; is in turn related to an element &lt;em&gt;c&lt;/em&gt;, then &lt;em&gt;a&lt;/em&gt; is also related to &lt;em&gt;c&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We have here the binary relation of a header file, which imports another header file.
The transitive closure means that all headers, which are imported by header files, which you have imported from a certain file are indirectly imported to that file, too. That&amp;#39;s also the same for all header files, which are imported by the collection of those headers.
Surely, you know this property from your app target, whenever you import a header, which imports other headers, the classes and symbols, which are defined there, are also available in your app code.
The same has to apply for import statements in Umbrella Headers and effect the module visibility with Clang modules.&lt;/p&gt;

&lt;h3 id=&quot;what-are-umbrella-headers&quot;&gt;What are Umbrella Headers?&lt;/h3&gt;

&lt;p&gt;For our example it could look like this:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;objc language-objc&quot; data-lang=&quot;objc&quot;&gt;&lt;span class=&quot;cp&quot;&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Monkey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;cp&quot;&gt;#import &amp;quot;BKBananaFruit.h&amp;quot;&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#import &amp;quot;BKBananaPalmTree.h&amp;quot;&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#import &amp;quot;BKBananaPalmTreeLeaf.h&amp;quot;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;FOUNDATION_EXPORT&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BananaKitVersionNumber&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;FOUNDATION_EXPORT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BananaKitVersionString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;The original purpose is to index all public headers of a directory to have a shorthand for imports/includes to access the full API of a library. Over time, they began to cover more and more purposes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;With &lt;strong&gt;(Cocoa Touch) Frameworks&lt;/strong&gt;: they allow quick access to versioning values defined in their Info.plist by on-the-fly generated C code. Therefore they have to define an interface to make them accessible. These are the constant declarations found in the Xcode template prefixed by &lt;code&gt;FOUNDATION_EXPORT&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;With &lt;strong&gt;Clang modules&lt;/strong&gt;: they are used to define the public interface of a module.&lt;/li&gt;
&lt;li&gt;With &lt;strong&gt;Swift&lt;/strong&gt;: they are the bridging header for the framework module, which essentially means that all Objective-C code you&amp;#39;re interfacing from Swift within your framework has to be part of its public API.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;current-situation-with-existing-podspecs&quot;&gt;Current Situation with Existing Podspecs&lt;/h3&gt;

&lt;p&gt;There has never been a declarable Umbrella Header in Xcode. So Pod authors have never had to specify one.&lt;/p&gt;

&lt;p&gt;Though it has always been a known pattern to have one public header, which imports &lt;em&gt;all&lt;/em&gt; other public headers &lt;em&gt;transitively&lt;/em&gt;. This isn&amp;#39;t always the case.&lt;/p&gt;

&lt;p&gt;For this reason, CocoaPods takes responsibility and generates a custom Umbrella Header (e.g. &lt;code&gt;Pods-iOS Example-AFNetworking-umbrella.h&lt;/code&gt;). This is injected by a custom module map, so that we don&amp;#39;t run into name ambiguities. Otherwise, the default module map would assume it has the same name as the framework, which could already been taken.&lt;/p&gt;

&lt;p&gt;Our generated header imports all declared public headers. This also defines the &lt;code&gt;FOUNDATION_EXPORT&lt;/code&gt;s for the versioning constants, with the name which is used by CocoaPods for the framework to integrate. Furthermore this avoids problems in some special cases: e.g. AFNetworking has a subspec, which provides categories for UIKit that has its own mass-import header &lt;code&gt;AFNetworking+UIKit.h&lt;/code&gt;, which isn&amp;#39;t imported by the &lt;code&gt;AFNetworking.h&lt;/code&gt; header for OSX compatibility.&lt;/p&gt;

&lt;p&gt;To use this subspec in Swift without a generated umbrella header, you would need to create a bridging header and use an import like &lt;code&gt;#import &amp;lt;AFNetworking/AFNetworking+UIKit.h&amp;gt;&lt;/code&gt;. With the generated umbrella header, you just need to &lt;code&gt;import AFNetworking&lt;/code&gt; if you have the subspec included in your Podfile. If your pod doesn&amp;#39;t work out of the box, you can use &lt;code&gt;pod lib lint --use-frameworks &amp;lt;YourPod.podspec&amp;gt;&lt;/code&gt;, to check what is wrong. We tried that with different popular pods and sometimes ran into issues caused by misconfigured public headers.&lt;/p&gt;

&lt;h4 id=&quot;about-public-headers&quot;&gt;About Public Headers&lt;/h4&gt;

&lt;p&gt;Public Headers in Podspecs are declared by &lt;code&gt;s.public_header_files = [&amp;quot;Core/*.h&amp;quot;, &amp;quot;Tree/**.h&amp;quot;]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you don&amp;#39;t include this specification, then all your headers would be public.
This isn&amp;#39;t recommeded for most cases.&lt;/p&gt;

&lt;p&gt;Generally, you should make sure that you have self-contained headers and that those only expose the parts of your implementation which is consumed by your Pods users. This has several advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It allows you to refactor the private implementation part without necessarily releasing a major update, which makes the version migration easier and allows you to focus on further improving your pod instead of explain your users how the API has changed.&lt;/li&gt;
&lt;li&gt;It impedes misusage, because you would need to modify header access to use or manipulate classes or properties, which are not intended to be used externally.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;common-header-pitfalls&quot;&gt;Common Header Pitfalls&lt;/h4&gt;

&lt;p&gt;If you have an header like this:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;objectivec language-objectivec&quot; data-lang=&quot;objectivec&quot;&gt;&lt;span class=&quot;c1&quot;&gt;/// BKBananaFruit.h&lt;/span&gt;

&lt;span class=&quot;cp&quot;&gt;#import &amp;quot;BKBananaTree.h&amp;quot;&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#import &amp;quot;monkey.h&amp;quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;@interface&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;BKBananaFruit&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;@property&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;nonatomic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;weak&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BKBananaTree&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tree&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;peel:&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Monkey&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;monkey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;@end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;And if you get an error like the one below, don&amp;#39;t let it fool you.&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/Frameworks-Developers/bananakit-error-non-modular-headers.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/Frameworks-Developers/bananakit-error-non-modular-headers.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;You can include headers inside frameworks, &lt;strong&gt;but not quoted headers&lt;/strong&gt;, which are not in scope of the framework&amp;#39;s public headers. So you have two choices in this case: Either make the header &lt;code&gt;BKBananaFruit.h&lt;/code&gt; private by excluding it from the public header declaration or use a system import to import the monkey.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;diff language-diff&quot; data-lang=&quot;diff&quot;&gt;&lt;span class=&quot;gd&quot;&gt;-#import &amp;quot;monkey.h&amp;quot;&lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+#import &amp;lt;monkey/monkey.h&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h4 id=&quot;xcode-oddities&quot;&gt;Xcode Oddities&lt;/h4&gt;

&lt;p&gt;We have seen this error a few times during development.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;&amp;lt;unknown&amp;gt;:0: error: could not build Objective-C module &amp;#39;BananaKit&amp;#39;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;An error like above can appear, if you develop a framework in Xcode, and you alter header visibility to fix build problems like described previously and try to ensure a clean build state by executing the Clean action (&lt;strong&gt;⌘+
⇧+K&lt;/strong&gt; in Xcode). In this situation, it can be helpful to nuke the products build directory (alas &lt;code&gt;DerivedData&lt;/code&gt;) manually from the file system.&lt;/p&gt;

&lt;h2 id=&quot;availability&quot;&gt;Availability&lt;/h2&gt;

&lt;p&gt;CocoaPods only supports Swift on OS X 10.9 and newer, and iOS 8 and newer.&lt;/p&gt;

&lt;p&gt;Here&amp;#39;s why:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Swift is supported on OS X 10.9 / iOS 7 and newer, as stated by Apple numerous times.&lt;/li&gt;
&lt;li&gt;There is &lt;a href=&quot;http://openradar.appspot.com/radar?id=5536341827780608&quot;&gt;no support for building static archives with Swift&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Dynamic frameworks are supported on all versions of OS X.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dynamic frameworks are unsupported on iOS versions prior to 8:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ld: warning: embedded dylibs/frameworks only run on iOS 8 or later.&lt;/p&gt;
&lt;/blockquote&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From this we can conclude that it is &lt;strong&gt;not possible&lt;/strong&gt; to support Swift on any platforms earlier than OS X 10.9 and iOS 8.&lt;/p&gt;

&lt;p&gt;To use Swift libraries on apps that support iOS 7, you must manually copy the files into your application project.&lt;/p&gt;

&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;/h2&gt;

&lt;p&gt;To install the latest Beta of CocoaPods you can run:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;sudo&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; gem install cocoapods --prerelease
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Until version 1.0 we strongly encourage you to keep CocoaPods up-to-date. For more user facing changes, you can take a look at our &lt;a href=&quot;https://github.com/CocoaPods/blog.cocoapods.org/pull/59&quot;&gt;upcoming official release blog post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For all the details, take a look into the
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/pull/2835&quot;&gt;PR&lt;/a&gt;!&lt;/p&gt;
</description>
    <pubDate>Thu, 25 Dec 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Pod-Authors-Guide-to-CocoaPods-Frameworks</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Pod-Authors-Guide-to-CocoaPods-Frameworks</guid>
  </item>
  
  
  
  <item>
    <title>Search Engine</title>
    <description>&lt;p&gt;TL;DR:
The &lt;a href=&quot;http://cocoapods.org&quot;&gt;CocoaPods search engine&lt;/a&gt; is not &lt;a href=&quot;http://www.mongodb-is-web-scale.com/&quot;&gt;web scale&lt;/a&gt;, but instead tailored to our needs. Here&amp;#39;s why and how.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;First let&amp;#39;s look at some numbers...
Currently, the CocoaPods search engine indexes &lt;a href=&quot;http://metrics.cocoapods.org/api/v1/status&quot;&gt;7378 pods&lt;/a&gt;.
From these pods, it indexes &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/search.rb#L70-L78&quot;&gt;name&lt;/a&gt;, &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/search.rb#L79-L89&quot;&gt;author&lt;/a&gt;, &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/search.rb#L90-L92&quot;&gt;version&lt;/a&gt;, &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/search.rb#L93-L97&quot;&gt;dependencies&lt;/a&gt;, &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/search.rb#L98-L101&quot;&gt;platform&lt;/a&gt;, &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/search.rb#L102-L107&quot;&gt;summary&lt;/a&gt;, and &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/search.rb#L108-L111&quot;&gt;synthesized tags&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On average, people search &lt;a href=&quot;http://status.cocoapods.org/#custom-metrics-container&quot;&gt;13 times per minute&lt;/a&gt;, more during the week, less on weekends (switch to the Month view to see that).
The occasional spike is roughly ten times that, so about twice per second.
These spikes are not visible on the status page, as the number of requests are averaged over five minutes.
As you can see, the search engine never rests:
CocoaPods are searched for at all times.&lt;/p&gt;

&lt;p&gt;How do our users search?&lt;/p&gt;

&lt;h2 id=&quot;searching-on-cocoapods-org&quot;&gt;Searching on cocoapods.org&lt;/h2&gt;

&lt;p&gt;CocoaPods can be searched via the &lt;a href=&quot;http://blog.cocoapods.org/Search-API-Version-1/&quot;&gt;Search API&lt;/a&gt;, so for example at &lt;a href=&quot;http://search.cocoapods.org/api/v1/pods.flat.hash.json?query=author:tony%20author:arnold&quot;&gt;http://search.cocoapods.org/api/v1/pods.flat.hash.json?query=author:tony%20author:arnold&lt;/a&gt;, or via &lt;a href=&quot;http://cocoapods.org/?q=author:tony%20author:arnold&quot;&gt;cocoapods.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The latter, the &lt;a href=&quot;cocoapods.org&quot;&gt;web site front end interface&lt;/a&gt;, uses the former and is more interesting, so let&amp;#39;s have a look at that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It is a fast as-you-type search – if you don&amp;#39;t type for &lt;a href=&quot;https://github.com/CocoaPods/cocoapods.org/blob/f93a89e845dc66dd29f78d52921d1c455b8a6b87/middleman/source/javascripts/search.config.js#L229&quot;&gt;166 ms&lt;/a&gt;, it sends a query to the Search API.&lt;/li&gt;
&lt;li&gt;The second feature I&amp;#39;d like to look at in more detail in the next section:
showing where your query words were found and offering the most appropriate guess.&lt;/li&gt;
&lt;li&gt;It lets you know when it hasn&amp;#39;t found anything, but offers helpful suggestions, such as when you search for &lt;a href=&quot;http://cocoapods.org/?q=datanotfound&quot;&gt;datanotfound&lt;/a&gt;. To do that, it &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/app.rb#L111-L132&quot;&gt;tries to split&lt;/a&gt; your query &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/search.rb#L175&quot;&gt;based on the indexed data&lt;/a&gt;. It also displays a &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/app.rb#L120-L122&quot;&gt;tag facet cloud&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;It sorts the results by &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/models/pod.rb#L40-L44&quot;&gt;popularity&lt;/a&gt;, a metric &lt;a href=&quot;http://twitter.com/orta&quot;&gt;orta&lt;/a&gt; came up with together with &lt;a href=&quot;http://twitter.com/dbgrandi&quot;&gt;David Grandinetti&lt;/a&gt;.
This is the default sorting algorithm right now, but we&amp;#39;re &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/issues/51#issuecomment-61655760&quot;&gt;working&lt;/a&gt; &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/issues/51#issuecomment-61655811&quot;&gt;on more&lt;/a&gt;. Adding a new algorithm is easy and &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/search.rb#L246-L283&quot;&gt;has already been done&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Other features include storing the query in the URL for easy copying, or a results addination (portmanteau of &amp;quot;adding&amp;quot; and &amp;quot;pagination&amp;quot;), or being able to select which platform the pods are filtered with.&lt;/p&gt;

&lt;p&gt;With the search-as-you-type feature, we encountered an interesting issue:
Because shorter queries yield more results, and therefore take longer, it was possible that a request made earlier could arrive after a request made later.
This led to a jarring &amp;quot;jumping&amp;quot; of results.&lt;/p&gt;

&lt;p&gt;To solve this issue, we &lt;a href=&quot;https://github.com/CocoaPods/cocoapods.org/blob/161daa79fddea07eca734fc19ce1fd0a915949fb/middleman/source/javascripts/search.config.js#L195-L218&quot;&gt;only show results that arrive in the order we sent them&lt;/a&gt;.
If we send requests A, B, and C, and A returns first, we show it. If then C returns, we show it too, as it arrived in order.
If then B arrives after C, &lt;a href=&quot;https://github.com/CocoaPods/cocoapods.org/blob/161daa79fddea07eca734fc19ce1fd0a915949fb/middleman/source/javascripts/search.config.js#L316-L321&quot;&gt;we discard it&lt;/a&gt;, as it is out of order.
That neatly solves the issue of jumping results, and also ensures a very responsive feeling for a user.&lt;/p&gt;

&lt;p&gt;But what is the second feature about?&lt;/p&gt;

&lt;h2 id=&quot;picky&quot;&gt;Picky&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://pickyrb.com/&quot;&gt;Picky&lt;/a&gt; is a &lt;a href=&quot;http://pickyrb.com/details.html&quot;&gt;semantic text search engine&lt;/a&gt;, running on Ruby.
It is fast (it uses C for the core bits), flexible (it uses Ruby for maximum flexibility), and versatile.
On the other hand it does not yet offer a drop-in server, so if you need a web service, you need to write one, such as we did.
We use Picky for &lt;a href=&quot;http://search.cocoapods.org&quot;&gt;search.cocoapods.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Using Picky had two main impacts:
we were able to create a highly specialized search engine for pods, and we can harness the power of a semantic search engine.&lt;/p&gt;

&lt;p&gt;So what is this semantic search you mention?
If you run &lt;a href=&quot;http://cocoapods.org/?q=orta&quot;&gt;orta&lt;/a&gt;, in the top right corner you can see an &amp;quot;Author 5&amp;quot;.
This means that Orta has been found five times as an author.
This may not be too exciting.&lt;/p&gt;

&lt;p&gt;However, if you enter two words, or parts of words, then Picky can start guessing what you mean.
For example, if you enter &lt;a href=&quot;http://cocoapods.org/?q=orta%20m&quot;&gt;orta m&lt;/a&gt;, then Picky guesses that you meant &amp;quot;Author+Name&amp;quot; (2 results) first, and &amp;quot;Author&amp;quot; (1 result) second.
The former refers to the two pods which are named &amp;quot;M*&amp;quot; and have Orta as an author.
The latter refers to the Mixpanel pod which has two authors:
Orta and Mixpanel (which is why the M* finds that one).&lt;/p&gt;

&lt;p&gt;If you click &lt;a href=&quot;http://cocoapods.org/?q=author%3Aorta%20name%3Am*&quot;&gt;one of these suggestions&lt;/a&gt;, then you can see that it&amp;#39;s possible to let Picky know what you are looking for, if you already know (&amp;quot;author:orta name:m&amp;quot;).
Normally you don&amp;#39;t need it, but it can help if you have almost no idea anymore what the pod was called.
For example, perhaps you still remember that the author may have been Bob or Bert, so you enter a &amp;quot;B&amp;quot;.
The pod almost certainly has a word with a c in it, so you add a &amp;quot;C&amp;quot;.
Then Picky will show you all possibilities that a query like &amp;quot;B* C&amp;quot; results in.
&lt;a href=&quot;http://cocoapods.org/?q=author%3Ab*%20name%3Ac&quot;&gt;This query&lt;/a&gt; is the resulting one.&lt;/p&gt;

&lt;p&gt;To decide what combination of categories the query words are most likely in, Picky decides based on probability.
However, since we also know what combinations people will most likely look for, we&amp;#39;ve told Picky what to prefer:
for often occurring combinations, &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/search.rb#L126-L141&quot;&gt;we&amp;#39;ve added boosts&lt;/a&gt;.
So if your query is found in name (+3) and dependencies (-4), then it will most likely show the name results on top.&lt;/p&gt;

&lt;p&gt;And how is it specialized for pods?
For example, when indexing pod names, we give the search engine the pieces we expect will be queried for.
That usually means e.g. for &lt;a href=&quot;http://cocoapods.org/?q=ticoredatasync&quot;&gt;&amp;quot;TICoreDataSync&amp;quot;&lt;/a&gt;, we &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/models/pod.rb#L232&quot;&gt;use the whole word&lt;/a&gt;, &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/models/pod.rb#L233&quot;&gt;split it into the two uppercase initials&lt;/a&gt;, and &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/models/pod.rb#L237&quot;&gt;each word starting with an uppercase letter&lt;/a&gt;, and also &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/models/pod.rb#L234&quot;&gt;the whole word without the two initials&lt;/a&gt;.
This enables you to search for &lt;a href=&quot;http://cocoapods.org/?q=coredata&quot;&gt;&amp;quot;coredata&amp;quot;&lt;/a&gt; and get the &amp;quot;TICoreDataSync&amp;quot; pod.
Or you can search for &lt;a href=&quot;http://cocoapods.org/?q=network&quot;&gt;&amp;quot;network&amp;quot;&lt;/a&gt;, and get AFNetworking.&lt;/p&gt;

&lt;p&gt;Personally, I feel very strongly about creating specialized search engines if you want to provide the best experience for your users.&lt;/p&gt;

&lt;h2 id=&quot;limitations&quot;&gt;Limitations&lt;/h2&gt;

&lt;p&gt;As the CocoaPods team cannot afford a server farm, but only a single server on Heroku, and a cheap shared CPU at that, we needed to be smart in designing the infrastructure.
We started with a list of requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It should fit and work on a shared Heroku CPU.&lt;/li&gt;
&lt;li&gt;It should reindex pods using Trunk web hook calls. So if a pod is pushed to Trunk, search should know about it ASAP (in less than 30 seconds).&lt;/li&gt;
&lt;li&gt;It should be stable. Nobody likes not being able to search.&lt;/li&gt;
&lt;li&gt;It should have little downtime when restarting.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To satisfy these requirements, we started thinking about the design.&lt;/p&gt;

&lt;h2 id=&quot;design&quot;&gt;Design&lt;/h2&gt;

&lt;p&gt;From running the search engine for a few years, we knew:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For it to be responsive, we need multiple web workers.&lt;/li&gt;
&lt;li&gt;Searches are generally fast.&lt;/li&gt;
&lt;li&gt;To handle Trunk webhook calls (similar to GitHub webhook calls), we needed a HTTP endpoint serving these.&lt;/li&gt;
&lt;li&gt;To index pods while searches are being made, we need it to be done in the same process (since we use the Picky memory index, the fastest option, and Redis wasn&amp;#39;t an option with our budget).&lt;/li&gt;
&lt;li&gt;Indexing a pod takes almost negligible time.&lt;/li&gt;
&lt;li&gt;No downtime on a single Heroku CPU is impossible, because restarts cannot be avoided.&lt;/li&gt;
&lt;li&gt;We don&amp;#39;t need to serve a 1000 requests a second, even though a performance-lover like me wants to. 20-30 is enough by far (1200-1800 per minute), and we should design for that. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a result, we arrived at this design:&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/search-engine/design.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/search-engine/design.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;Before Unicorn &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/unicorn.rb#L6&quot;&gt;spawns two web workers&lt;/a&gt;, we &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/ARCHITECTURE.md&quot;&gt;fork off an analytics and a search process&lt;/a&gt;.
Both only load what they need after forking.
Before we fork any of these, we &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/unicorn.rb#L15-L21&quot;&gt;open up channels&lt;/a&gt; so the web workers can communicate with the search process and the analytics process.&lt;/p&gt;

&lt;p&gt;When a web worker forks, it &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/unicorn.rb#L38-L39&quot;&gt;chooses one of the above channels&lt;/a&gt; to communicate with the search engine and analytics process.
Web workers are very thin – they &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/search.rb#L238&quot;&gt;only send the queries to the search engine process&lt;/a&gt;. 
This means any web worker can be restarted without problem, as they are relatively light.&lt;/p&gt;

&lt;h3 id=&quot;handling-queries&quot;&gt;Handling queries&lt;/h3&gt;

&lt;p&gt;If any query comes in, it is &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/search.rb#L236-L252&quot;&gt;handed off to the search engine process&lt;/a&gt;, and &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/app.rb#L165-L178&quot;&gt;also sent to the analytics process&lt;/a&gt;.
The analytics process is only &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/analytics_worker.rb#L13-L21&quot;&gt;concerned with sending analytics&lt;/a&gt; data to Google Analytics.
We need it to run in a separate process as currently we are using a synchronous library which would block the process.&lt;/p&gt;

&lt;p&gt;The search engine process &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/unicorn.rb#L18&quot;&gt;jumps straight&lt;/a&gt; into an &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/channel.rb#L48-L81&quot;&gt;event loop&lt;/a&gt; after forking.
While looping, it &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/channel.rb#L65&quot;&gt;checks if any requests have arrived&lt;/a&gt; via channels.
After that, it &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/search_worker.rb#L46-L59&quot;&gt;starts indexing pods&lt;/a&gt;, taken &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/pods.rb#L14-L43&quot;&gt;from the database&lt;/a&gt;, a few at a time.
In this way we can avoid long downtimes, as we can immediately return a few pods.
A drawback of this technique is that people won&amp;#39;t get all pods they would usually get as for example only 100 pods may yet be in the index.
However, we index the pods in the order of popularity, so we fill them in from the top of the results list, so to speak.
So even if the search engine is still indexing, you get relevant results.&lt;/p&gt;

&lt;p&gt;This event loop also &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/search_worker.rb#L82-L84&quot;&gt;counts the queries&lt;/a&gt; for display on &lt;a href=&quot;http://status.cocoapods.org/#custom-metrics-container&quot;&gt;status.cocoapods.org&lt;/a&gt;.
Every &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/search_worker.rb#L63&quot;&gt;30 seconds&lt;/a&gt;, it &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/search_worker.rb#L105-L111&quot;&gt;sends the stats&lt;/a&gt; to the statuspage.
To not stop the event loop, we &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/stats_sender.rb#L27-L32&quot;&gt;fork off&lt;/a&gt; these web service calls.&lt;/p&gt;

&lt;p&gt;One issue that occurred about 9 hours after putting this live was that the search engine ran out of resources.
After investigating, I had to shamefully admit that I forgot to &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/stats_sender.rb#L9-L11&quot;&gt;clean up&lt;/a&gt; after these forks.
This resulted in that single &lt;a href=&quot;http://heroku.com/&quot;&gt;Heroku&lt;/a&gt; process handling on the order of 2000 child processes until it croaked, which occurred at about 9 hours after restarting.
I was and am impressed at Heroku going for that long.
Now, for example, we send calls to the status page every 30 seconds, &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/stats_sender.rb#L27&quot;&gt;remember the child process PID&lt;/a&gt; and &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/stats_sender.rb#L9-L10&quot;&gt;clean it up&lt;/a&gt; again &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/stats_sender.rb#L15&quot;&gt;before we send off&lt;/a&gt; the next call.
Now the search engine purrs along nicely.&lt;/p&gt;

&lt;h3 id=&quot;handling-trunk-webhook-calls&quot;&gt;Handling Trunk webhook calls&lt;/h3&gt;

&lt;p&gt;To be able to index on the fly, any of the three web workers &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/app.rb#L145-L163&quot;&gt;handle Trunk webhook calls&lt;/a&gt;.
They then inform the search engine process, also &lt;a href=&quot;&quot;&gt;via channels&lt;/a&gt;, which then will &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/search_worker.rb#L162&quot;&gt;reload the right pod&lt;/a&gt; from the Trunk DB and &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/eeb25b8aad023936f0db9f19a73ce0ac4985d012/lib/search_worker.rb#L163&quot;&gt;reindex it&lt;/a&gt;.
This has resulted in a less than 30 second delay between you pushing to Trunk and the search engine spewing out updated results.
Note that there is some browser caching of results going on, so when you try it, please clean the cache and reload.&lt;/p&gt;

&lt;h2 id=&quot;summary-and-the-future&quot;&gt;Summary and The Future&lt;/h2&gt;

&lt;p&gt;To make a truly CocoaPod-specific search engine that would enable us to experiment and at the same time fit on a single shared Heroku instance, we used &lt;a href=&quot;http://pickyrb.com/&quot;&gt;Picky&lt;/a&gt;, &lt;a href=&quot;http://heroku.com/&quot;&gt;Heroku&lt;/a&gt; and a multiprocessing-based structure (with a single process search event loop), while still being able to serve enough results at a time.&lt;/p&gt;

&lt;p&gt;We are currently &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/issues/51&quot;&gt;working towards a CocoaPods search interface version 2&lt;/a&gt; that will - I think - blow your minds.
It will be the culmination of &lt;em&gt;months&lt;/em&gt; (seriously!) of volunteer work and will pull together data from our many APIs to provide the snazziest pod searching interface possible.&lt;/p&gt;

&lt;p&gt;Please leave your ideas if you have an idea to add.&lt;/p&gt;
</description>
    <pubDate>Mon, 15 Dec 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/search-engine</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/search-engine</guid>
  </item>
  
  
  
  <item>
    <title>Metrics API</title>
    <description>&lt;p&gt;TL;DR:
We have a new &lt;em&gt;metrics&lt;/em&gt; API that you can now use.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;For the past nine months, we&amp;#39;ve had a metrics API where we gather data for each pod, currently only from GitHub.&lt;/p&gt;

&lt;h2 id=&quot;api&quot;&gt;API&lt;/h2&gt;

&lt;p&gt;Currently the API provides GitHub metrics, per pod.
The provided format is JSON, which is also the default.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s best if you give it a try yourself.
Here&amp;#39;s a popular pod:
&lt;a href=&quot;http://metrics.cocoapods.org/api/v1/pods/AFNetworking.json&quot;&gt;http://metrics.cocoapods.org/api/v1/pods/AFNetworking.json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And here&amp;#39;s a not yet popular pod:
&lt;a href=&quot;http://metrics.cocoapods.org/api/v1/pods/KFData.json&quot;&gt;http://metrics.cocoapods.org/api/v1/pods/KFData.json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The API pattern is, you guessed it:
&lt;a href=&quot;http://metrics.cocoapods.org/api/v1/pods/PODNAME.json&quot;&gt;http://metrics.cocoapods.org/api/v1/pods/PODNAME.json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each pod&amp;#39;s data is updated roughly every 2 hours.&lt;/p&gt;

&lt;p&gt;To check the status of the metrics app, you can call:
&lt;a href=&quot;http://metrics.cocoapods.org/api/v1/status&quot;&gt;http://metrics.cocoapods.org/api/v1/status&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will tell you the total amount of pods, and how many have been found on GitHub, and how many have not been found after three tries.&lt;/p&gt;

&lt;h2 id=&quot;design&quot;&gt;Design&lt;/h2&gt;

&lt;p&gt;The metrics app is very straightforward.
It lives on Heroku and consists of two pieces:
A round robin updater, and a resetter.&lt;/p&gt;

&lt;p&gt;The updater is forked off as the web app is started.
It runs forever and goes through each pod, one by one.
Every second, it queries GitHub for metrics data of another pod.
Currently, all pods are updated roughly every two hours.&lt;/p&gt;

&lt;p&gt;If it can&amp;#39;t find the pod, it marks the pod as once not found.
If your pod is not found three times (on GitHub), roughly 6 hours, it gives up on the pod.
Currently there are 117 pods which have no corresponding repo page on GitHub.
This is ok, as not everybody is or needs to be on GitHub.&lt;/p&gt;

&lt;p&gt;If a pod is not found, won&amp;#39;t metrics ever try again?
We&amp;#39;ve got that covered.
The resetter listens to the Trunk (where you push pods) web hooks.
The trunk web hook system pings many CocoaPods websites to inform them of updated pods.
If a new pod has been added, just a new versions, or a new commits – it pings for example the metrics webapp.
If the metrics app receives the Trunk app&amp;#39;s bat signal, it resets the pod&amp;#39;s not found count.
From then on, metrics will try to find the pod&amp;#39;s metrics again on GitHub.&lt;/p&gt;

&lt;h2 id=&quot;closing-words&quot;&gt;Closing words&lt;/h2&gt;

&lt;p&gt;Why use this instead of the GitHub API?
You can access it via a pod&amp;#39;s name and it&amp;#39;s designed to be extensible, so more exciting metrics will be added.&lt;/p&gt;

&lt;p&gt;We hope you&amp;#39;ll use the API for success and profit.
If you do, let us know.&lt;/p&gt;

&lt;p&gt;Also, if you feel strongly that another service (besides GitHub) should be included, let us know.&lt;/p&gt;

&lt;p&gt;Go forth and measure!&lt;/p&gt;
</description>
    <pubDate>Thu, 11 Dec 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/metrics-api</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/metrics-api</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 0.35 and Molinillo</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;CocoaPods 0.35&lt;/em&gt; has been released, with major improvements to the dependency resolution process, &lt;a href=&quot;https://stripe.com/blog/stripe-open-source-retreat&quot;&gt;thanks to Stripe&amp;#39;s support&lt;/a&gt;. Making the 0.35 release possible is the concurrent release of &lt;a href=&quot;https://github.com/CocoaPods/Molinillo&quot;&gt;Molinillo&lt;/a&gt; 0.1, our new dependency resolution module.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;The CocoaPods 0.35 is much more limited in scope than &lt;a href=&quot;http://blog.cocoapods.org/CocoaPods-0.34/&quot;&gt;0.34 was&lt;/a&gt;, but the improvements in this version center on the heart of what CocoaPods is: a dependency manager. While the list of new features may seem short, don&amp;#39;t be disappointed: this is a major step forward for CocoaPods.&lt;/p&gt;

&lt;h2 id=&quot;dependency-resolution&quot;&gt;Dependency Resolution&lt;/h2&gt;

&lt;p&gt;At the heart of any dependency managers is its &lt;code&gt;Resolver&lt;/code&gt;, whose job is to take a list of dependencies (defined in a &lt;code&gt;Podfile&lt;/code&gt;) and transform those explicit  requirements into a complete set of Pods to install. With CocoaPods 0.35, the core dependency resolution code has been completely rewritten, giving birth to Molinillo, a generic dependency resolution module. This change should improve the experience of using CocoaPods by making things work in a more predictable manner and allowing you to focus more on your project instead of making things easier for CocoaPods.&lt;/p&gt;

&lt;h3 id=&quot;automatic-conflict-resolution&quot;&gt;Automatic Conflict Resolution&lt;/h3&gt;

&lt;p&gt;Consider the following &lt;code&gt;Podfile&lt;/code&gt; and note that CocoaPods will by default, when no version requirements are specified, try to activate the latest available version of a pod. (The versions in this example are based on the latest available versions of the pods in question &lt;em&gt;at the time of writing&lt;/em&gt;).&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;AFAmazonS3Client&amp;#39;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# Version 2.0.0 activates AFNetworking with: &amp;gt;= 2.0.0 &amp;amp;&amp;amp; &amp;lt; 3.0.0&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;CargoBay&amp;#39;&lt;/span&gt;         &lt;span class=&quot;c1&quot;&gt;# Version 2.1.0 activates AFNetworking with: &amp;gt;= 2.2.0 &amp;amp;&amp;amp; &amp;lt; 3.0.0&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;AFOAuth2Client&amp;#39;&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;# Version 0.1.2 activates AFNetworking with: &amp;gt;= 1.3.0 &amp;amp;&amp;amp; &amp;lt; 2.0.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;On prior versions of CocoaPods, attempting to &lt;code&gt;pod install&lt;/code&gt; would yield an error saying &lt;code&gt;Unable to satisfy the following requirements&lt;/code&gt; since the latest versions of all three pods have incompatible dependencies on different versions of AFNetworking. With the old resolver, we would naïvely try to activate the latest spec version for the first dependency and continue from there, which would lead to a conflict, since there was no way to get to an older version of &lt;code&gt;AFNetworking&lt;/code&gt; (or any of the pods that depended upon it). No more. With the transition to &lt;a href=&quot;https://github.com/CocoaPods/Molinillo&quot;&gt;&lt;code&gt;Molinillo&lt;/code&gt;&lt;/a&gt;, a generic dependency resolution gem I&amp;#39;ve been writing at Stripe, Podfiles like this will have such conflicts automatically resolved. &lt;/p&gt;

&lt;p&gt;Let&amp;#39;s take a look at the same &lt;code&gt;Podfile&lt;/code&gt; in CocoaPods 0.35:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;AFAmazonS3Client&amp;#39;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# Version 1.0.1 activates AFNetworking with: &amp;gt;= 1.3.0 &amp;amp;&amp;amp; &amp;lt; 2.0.0&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;CargoBay&amp;#39;&lt;/span&gt;         &lt;span class=&quot;c1&quot;&gt;# Version 1.0.0 activates AFNetworking with: &amp;gt;= 1.0.0 &amp;amp;&amp;amp; &amp;lt; 2.0.0&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;AFOAuth2Client&amp;#39;&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;# Version 0.1.2 activates AFNetworking with: &amp;gt;= 1.3.0 &amp;amp;&amp;amp; &amp;lt; 2.0.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;From the above, it is clear that the latest versions of &lt;code&gt;AFAmazonS3Client&lt;/code&gt; and &lt;code&gt;CargoBay&lt;/code&gt; are not compatible with the requirements of &lt;code&gt;AFOAuth2Client&lt;/code&gt;. As such, the new resolver will now &lt;strong&gt;backtrack&lt;/strong&gt; and try to satisfy the requirements of &lt;code&gt;AFOAuth2Client&lt;/code&gt; by looking for &lt;strong&gt;older&lt;/strong&gt; versions of &lt;code&gt;AFAmazonS3Client&lt;/code&gt; and &lt;code&gt;CargoBay&lt;/code&gt; that are compatible with &lt;code&gt;AFNetworking&lt;/code&gt; versions between &lt;code&gt;1.3.0&lt;/code&gt; and &lt;code&gt;2.0.0&lt;/code&gt;, thus activating &lt;code&gt;AFNetworking&lt;/code&gt; version &lt;code&gt;1.3.4&lt;/code&gt; and correctly satisfying all of the dependencies in the &lt;code&gt;Podfile&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The resolver is now able to backtrack when conflicts arise, thus allowing it to simultaneously satisfy all dependency constraints, or definitely state that the Podfile is unresolvable. The development of a &lt;a href=&quot;https://github.com/CocoaPods/Resolver-Integration-Specs&quot;&gt;language-agnostic resolver integration suite&lt;/a&gt; made this possible, and will hopefully ensure that other dependency managers can provide a consistent resolution process.&lt;/p&gt;

&lt;h3 id=&quot;improved-locking&quot;&gt;Improved Locking&lt;/h3&gt;

&lt;p&gt;CocoaPods has always had a version locking feature (it&amp;#39;s your &lt;code&gt;Podfile.lock&lt;/code&gt;) that tries to ensure that, whenever someone clones a project and runs &lt;code&gt;pod install&lt;/code&gt;, they will get the same dependency versions as you. Well, in CocoaPods 0.35, that version locking has been extended to &lt;em&gt;implicit&lt;/em&gt; dependencies as well, so your &lt;code&gt;Podfile.lock&lt;/code&gt; is now an absolute source of truth.&lt;/p&gt;

&lt;h3 id=&quot;pre-release-dependencies&quot;&gt;Pre-Release Dependencies&lt;/h3&gt;

&lt;p&gt;At CocoaPods, we love it when people make pre-release versions of their libraries -- we do it ourselves! In order to more strictly conform with &lt;a href=&quot;http://semver.org&quot;&gt;Semantic Versioning&lt;/a&gt;, pre-release versions of a Pod will now only be considered in the resolution process if there is any dependency on the pod with a pre-release version in its requirement.&lt;/p&gt;

&lt;p&gt;Thus, if you want a pre-release version, such as a beta, you will have to specify that in your Podfile, like so:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;AFNetworking&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;~&amp;gt; 2.0.0-RC1&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h3 id=&quot;external-source-optimizations&quot;&gt;External Source Optimizations&lt;/h3&gt;

&lt;p&gt;Handling of dependencies with external sources (e.g., &lt;code&gt;pod &amp;#39;RestKit&amp;#39;, git: &amp;#39;https://github.com/RestKit/RestKit.git&amp;#39;&lt;/code&gt;) has been optimized and clarified in this release. CocoaPods now only downloads each Pod with an external source once, which has the nice side effect of making linting specifications that have a lot of subspec dependencies faster. CocoaPods also lets you know when there are conflicting dependencies, so you can remove unwanted duplication from your &lt;code&gt;Podfile&lt;/code&gt;. Finally, CocoaPods lets you know if you specify the same Pod with different external sources, instead of a random source being chosen.&lt;/p&gt;

&lt;h3 id=&quot;locking-checkout-options&quot;&gt;Locking Checkout Options&lt;/h3&gt;

&lt;p&gt;At the intersection of improved locking and external source optimizations is CocoaPods 0.35’s final feature: the lockfile now hold the information necessary to ensure that dependencies directed installed from a repository will be locked to the same revision until updated. That means this Podfile, along with its corresponding Podfile.lock, will ensure that every member of your team is always on the same revision of &lt;em&gt;all&lt;/em&gt; of your dependencies:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;AFNetworking&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:git&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;https://github.com/AFNetworking/AFNetworking.git&amp;#39;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;RestKit&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:git&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;https://github.com/RestKit/RestKit.git&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:branch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;development&amp;#39;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;ARAnalytics&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;~&amp;gt; 2.9.0&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;AFNetworking&lt;/code&gt; will continue to use the same commit that was downloaded when you first ran &lt;code&gt;pod install&lt;/code&gt;, so you don’t have to worry about changes sneaking in when you run &lt;code&gt;pod install&lt;/code&gt; on a new machine. As always, &lt;code&gt;pod update AFNetworking&lt;/code&gt; will update you to the latest commit.&lt;/p&gt;

&lt;h2 id=&quot;performance-improvements&quot;&gt;Performance Improvements&lt;/h2&gt;

&lt;p&gt;Molinillo makes resolving a normal application&amp;#39;s Podfile roughly &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/pull/2637#issuecomment-60422101&quot;&gt;1.5x faster&lt;/a&gt; than the old resolver, which is astonishing given the wider breadth of its feature-set. Additionally, the external source optimizations should make fetching multiple subspecs from an external source many times faster.&lt;/p&gt;

&lt;p&gt;The vast majority of this release&amp;#39;s performance improvements come from &lt;a href=&quot;https://github.com/alloy&quot;&gt;Eloy&amp;#39;s&lt;/a&gt; work on optimizing expensive operations in &lt;a href=&quot;https://github.com/CocoaPods/Xcodeproj&quot;&gt;Xcodeproj&lt;/a&gt;. This makes CocoaPods&amp;#39; integration steps blaze by!&lt;/p&gt;

&lt;h2 id=&quot;bonus-news&quot;&gt;Bonus News&lt;/h2&gt;

&lt;p&gt;I’ve been working on bringing &lt;a href=&quot;https://github.com/CocoaPods/Molinillo&quot;&gt;Molinillo&lt;/a&gt; over to &lt;a href=&quot;https://github.com/bundler/bundler&quot;&gt;Bundler&lt;/a&gt; so we can hopefully share a dependency resolution implementation in the future.&lt;/p&gt;

&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;/h2&gt;

&lt;p&gt;To install the last release of CocoaPods you can run:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;sudo&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; gem install cocoapods
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Until version 1.0 we strongly encourage you to keep CocoaPods up-to-date.&lt;/p&gt;

&lt;p&gt;For all the details, don’t miss the
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/blob/master/CHANGELOG.md&quot;&gt;Changelog&lt;/a&gt;!&lt;/p&gt;
</description>
    <pubDate>Wed, 19 Nov 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-0.35</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-0.35</guid>
  </item>
  
  
  
  <item>
    <title>2014</title>
    <description>&lt;p&gt;CocoaPods is a reflection on the Cocoa community, a mirror that reflects the effort of thousands on individual contributions to a greater idea of sharing and helping each other to improve. As the community grows, so does the tooling around it, growing on both complexity and size.&lt;/p&gt;

&lt;p&gt;A year ago we unveiled the new CocoaPods branding. It was the culmination of 6 months of design and development work for a few volunteers in their spare time. Let&amp;#39;s take a look at what else has changed in the last year.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h2 id=&quot;contributions&quot;&gt;Contributions&lt;/h2&gt;

&lt;p&gt;We had two people paid to work full time for a period on CocoaPods this year. The first, Fabio Pelosin, used his time sponsored by &lt;a href=&quot;http://blog.cocoapods.org/SoundCloud/&quot;&gt;SoundCloud&lt;/a&gt; on refactoring internals, helping to bring in support for CocoaPods plugins and per-config Pods, then finally improving the command line interface. The second, Samuel Giddins, has been mostly working on a &lt;a href=&quot;https://github.com/CocoaPods/Molinillo/&quot;&gt;iterative dependency resolver&lt;/a&gt; for both CocoaPods and Bundler ( CocoaPods for Ruby. )&lt;/p&gt;

&lt;p&gt;The team in general has shifted too. A lot of the current major commiters were not working on CocoaPods last year. We&amp;#39;ve increased the number of active developers from roughly 4 to roughly 8. This is hard to judge because CocoaPods is a side project for most. But there&amp;#39;s a lot of new and &lt;a href=&quot;http://blog.cocoapods.org/starting-open-source/&quot;&gt;very welcome faces&lt;/a&gt; in the contributors chat room.&lt;/p&gt;

&lt;h2 id=&quot;web-properties&quot;&gt;Web Properties&lt;/h2&gt;

&lt;p&gt;A year ago, documentation existed in four places; the CocoaPods homepage, a developer reference based on the ruby source code, a docs subsite and the GitHub wiki. This was consolidated into a single guides site which everything important goes into, with the expectation that StackOverflow would fill in gaps.&lt;/p&gt;

&lt;p&gt;The traffic for the website went from a 60,000 impressions/month to a combined 180,000. This splits out from cocoapods.org: 120,000, blog.cocoapods.org: 8,000, guides.cocoapods.org: 55,000.&lt;/p&gt;

&lt;p&gt;We changed the focus of the homepage to reflect what we were seeing in analytics; people were spending a lot of time using our search. The new design moved search front and center on the website and it shows in our analytics, we went from 70,000 searches per month, to a massive 825,000. It increased its complexity, and was re-written to deal with the scale. It also now uses our metrics to derive a sorting algorithm for popularity. It&amp;#39;s not perfect, but it&amp;#39;s a great step in where &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/issues/51&quot;&gt;we want to go&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We introduced a few new web services, there&amp;#39;s a &lt;a href=&quot;https://github.com/CocoaPods/metrics.cocoapods.org/&quot;&gt;metrics engine&lt;/a&gt; that constantly grabs metrics from GitHub (and soon &lt;a href=&quot;http://cocoadocs.org/docsets/AFNetworking/2.4.1/stats.json&quot;&gt;CocoaDocs for quality&lt;/a&gt;) for all &lt;a href=&quot;http://metrics.cocoapods.org/api/v1/pods/KFData&quot;&gt;Pods&lt;/a&gt;. This will make up the bulk of a true CocoaPods API.&lt;/p&gt;

&lt;p&gt;There&amp;#39;s an authentication server, trunk, which provides library authors with the ability to control who can push releases of their library. Previously we were using Pull Requests, of which the community make 12,000+, making us one of GitHub&amp;#39;s most &lt;a href=&quot;https://octoverse.github.com&quot;&gt;active repos&lt;/a&gt;. Now it&amp;#39;s bigger, and automated. Because of this we saw an increase of contributors to the specs repo go from 1,800 to 4,200. On the other side, we&amp;#39;re now seeing roughly 1,500 downloads of the Specs repo a day.&lt;/p&gt;

&lt;h2 id=&quot;community&quot;&gt;Community&lt;/h2&gt;

&lt;p&gt;As a nice metric of interest, the &lt;a href=&quot;https://twitter.com/CocoaPods&quot;&gt;@CocoaPods&lt;/a&gt; twitter account has gone from 4k to over 10k. We split out the new pod announcements to a separate twitter account &lt;a href=&quot;https://twitter.com/CocoaPodsFeed&quot;&gt;@CocoaPodsFeed&lt;/a&gt; in order to deal with the number of new pods.&lt;/p&gt;

&lt;p&gt;On the subject of new Pods, this vastly increased 2,400 to 7,000. I expect this is in-part due to the network effect, and reducing the barrier to entry. We devoted a considerable amount of time towards making a OSS library very easy with the command &lt;code&gt;pod lib create&lt;/code&gt; offering &lt;a href=&quot;http://guides.cocoapods.org/making/using-pod-lib-create.html&quot;&gt;best practices as defaults&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;events&quot;&gt;Events&lt;/h2&gt;

&lt;p&gt;We ran a some CocoaPods events, a few meetups which went swimmingly. A hackathon based around a CocoaPods plugin. The most interesting was a &lt;a href=&quot;http://blog.cocoapods.org/CocoaPods-Bug-Bash/&quot;&gt;CocoaPods bug bash&lt;/a&gt;. The idea was that we try deal with as many small issues as possible, we planned it for a weekend but had completed by the first day. The second day was spent improving CocoaPods. The bash gave us some great experience in onboarding and &lt;a href=&quot;http://guides.cocoapods.org/contributing/dev-environment.html&quot;&gt;bootstrapping people&lt;/a&gt; to work on CocoaPods which resulted in a meta-repo, &lt;a href=&quot;https://github.com/cocoapods/Rainforest&quot;&gt;Rainforest&lt;/a&gt;, that holds all the repos. It also introduced new contributors who are invaluable now.&lt;/p&gt;

&lt;h2 id=&quot;cocoapods&quot;&gt;CocoaPods&lt;/h2&gt;

&lt;p&gt;We hit 1,000,000 total downloads of the CocoaPods Gem this month.&lt;/p&gt;

&lt;p&gt;The last release in October 2013 was CocoaPods 0.26. Since then CocoaPods has added:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Config based Pods&lt;/li&gt;
&lt;li&gt;Plugin support&lt;/li&gt;
&lt;li&gt;Updating a specific pod&lt;/li&gt;
&lt;li&gt;Vastly reduces networking around local caching&lt;/li&gt;
&lt;li&gt;Moved to support JSON podspecs&lt;/li&gt;
&lt;li&gt;Switched to pre-built libraries&lt;/li&gt;
&lt;li&gt;Added a command to try any Pod instantly&lt;/li&gt;
&lt;li&gt;Handles Xcodeproj merge conflicts elegantly&lt;/li&gt;
&lt;li&gt;Added the ability to deprecate a Pod&lt;/li&gt;
&lt;li&gt;Release Candidates for CocoaPods&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;1-0&quot;&gt;1.0&lt;/h2&gt;

&lt;p&gt;The future is very bright with the imminent next release bringing in the work on the resolver. &lt;/p&gt;

&lt;p&gt;Then Swift CocoaPods. This has a singular Pull Request you &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/pull/2835&quot;&gt;can follow&lt;/a&gt;. I&amp;#39;ve personally migrated the Artsy iOS Swift App to remove all submodules and &lt;a href=&quot;https://github.com/artsy/eidolon/pull/317&quot;&gt;use just CocoaPods&lt;/a&gt;. Making a Swift or Dynamic Framework pod will be &lt;a href=&quot;https://github.com/Alamofire/Alamofire/pull/218&quot;&gt;no different&lt;/a&gt; from an Objective-C one.&lt;/p&gt;

&lt;p&gt;We&amp;#39;ve been working towards a stable 1.0 release which means long term support. As an issue can only be in one milestone our official &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/milestones&quot;&gt;1.0 milestone&lt;/a&gt; is a little empty. Swift support pushed us back a bit on this, but not considerably.&lt;/p&gt;

&lt;p&gt;On a personal note. It&amp;#39;s been super gratifying to work on such a high profile tool used by so many people. I think that CocoaPods considerably lowers the barrier to entry for new programmers, and makes it easy for the experienced to improve their codebases by covering the entire ground from library discovery to Xcode integration. This is the fourth year since the first CocoaPods commit and it has been the best so far.&lt;/p&gt;
</description>
    <pubDate>Tue, 18 Nov 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Stats-2014</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Stats-2014</guid>
  </item>
  
  
  
  <item>
    <title>Starting Open Source</title>
    <description>&lt;p&gt;On July the 7th I attended the &lt;a href=&quot;http://www.meetup.com/CocoaHeads-Stockholm/&quot;&gt;CocoaHeads Stockholm&lt;/a&gt; meetup. For this particular meetup the brilliant, but unknown to me at the time, &lt;a href=&quot;https://twitter.com/orta&quot;&gt;Orta Therox&lt;/a&gt; held a talk about open source, &lt;a href=&quot;http://cocoapods.org/&quot;&gt;CocoaPods&lt;/a&gt; and how they work at &lt;a href=&quot;https://artsy.net/&quot;&gt;Artsy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For very long time beforehand I had felt that I was not contributing enough back to all the awesome projects that I used daily; CocoaPods being one of them. Orta really inspired me to take the first steps to contribute back. I promptly went home and started working on a issue I found among the &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues&quot;&gt;CocoaPods issues&lt;/a&gt; on GitHub. After finishing that I jumped straight on to another related issue. After a landing a few PRs I was invited to the CocoaPods slack team to discuss further. This post talks about my first steps into contributing back to a large project.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Why do Github issues often become filled people saying things like &lt;strong&gt;+1&lt;/strong&gt;, &lt;strong&gt;I need this&lt;/strong&gt; and &lt;strong&gt;Would be awesome&lt;/strong&gt; instead of PRs solving the issue?&lt;/p&gt;

&lt;p&gt;I can relate to this, I have made my fair share of &lt;strong&gt;+1&lt;/strong&gt; and &lt;strong&gt;I need this&lt;/strong&gt; comments. From my very personal, but probably non-unique experience, it&amp;#39;s really a mentality issue more than anything. Ultimately it&amp;#39;s related to my confidence as a programmer and a slight touch of &lt;a href=&quot;https://en.wikipedia.org/wiki/Impostor_syndrome&quot;&gt;Impostor Syndrome&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;i-cant-provide-value&quot;&gt;I can&amp;#39;t provide value&lt;/h3&gt;

&lt;p&gt;A statement that I often used to justify my passivity was &lt;strong&gt;I can&amp;#39;t provide value here, the other contributors are just too skilled&lt;/strong&gt;. It&amp;#39;s true that many open source projects are huge behemoths with a lot of code and things to understand, but every single contribution still matters and provides value to the project. A project without contributions, big or small, will stagnate.&lt;/p&gt;

&lt;p&gt;I think there&amp;#39;s also an important point to be made here about making the project accessible for new contributors. It should be as simple as possible to get started, that means setup of environment and finding issue which are suited for contributors who are not yet familiar with the code base. CocoaPods does both of these very well.&lt;/p&gt;

&lt;p&gt;For setup there&amp;#39;s a repository called &lt;a href=&quot;https://github.com/CocoaPods/Rainforest&quot;&gt;Rainforest&lt;/a&gt; which contains a rake task to setup everything needed to develop CocoaPods. Additionally almost all repositories contain a rake task called &lt;code&gt;bootstrap&lt;/code&gt; which will setup the repository for development.&lt;/p&gt;

&lt;p&gt;For finding issues CocoaPods uses a labelling systems to illustrate how difficult an issue is as seen &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/labels&quot;&gt;here&lt;/a&gt;. The label &lt;code&gt;easy&lt;/code&gt; is perfect for finding tasks for new contributors. In fact I have started working on quite a few of them, but many times I ran into problems which were too difficult or things I simply didn&amp;#39;t understand well enough. I abandoned quite a few issues because of getting stuck, which is both good and bad. It&amp;#39;s good because it&amp;#39;s important that you are able to try your hand at solving issues and failing without being assigned the issue or feeling pressure to finish it. The bad part leads me to the next issue I had, asking questions.&lt;/p&gt;

&lt;h3 id=&quot;i-shouldnt-waste-the-core-contributors-time-by-asking-trivial-questions&quot;&gt;I shouldn&amp;#39;t waste the core contributors time by asking trivial questions&lt;/h3&gt;

&lt;p&gt;Even after getting passed the initial feeling of not being able to provide any value, landing my first PR helped with this, I was still reluctant to ask the core contributors questions because I felt like I was wasting their time. To quote myself from a discussion we had.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;That&amp;#39;s one of my concerns. I know that everyone else can implement trivial things much faster than me. I try to weigh asking question against that to not produce negative value&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;While it&amp;#39;s true that having core contributors spending time on helping you might produce negative net value in the short term, in the long term you will end up with more developers who are productive and familiar with the code base.&lt;/p&gt;

&lt;p&gt;This was best expressed by one of the core contributors.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Let me just re-iterate @k0nserv: please ask us &lt;em&gt;any&lt;/em&gt; and &lt;em&gt;every&lt;/em&gt; question you have. That&amp;#39;s why all of us work on CocoaPods&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;After forcing myself to submit my first PR to CocoaPods things got a lot easier. I felt happy for contributing something and because it was received in a good way by the maintainers. Getting past my doubt to ask question was really only about getting told it wasn&amp;#39;t the problem I was making it out to be.&lt;/p&gt;

&lt;p&gt;So back to the original problem, since my first contributions to CocoaPods I have sent numerous PRs to other projects where I saw that something was lacking. This has been things like SSL improvements to the AWS cookbooks and a minor spelling error for a gem I was considering for work. I truly feel like I have stepped out of the &lt;strong&gt;+1&lt;/strong&gt; mentality and into the &lt;strong&gt;I&amp;#39;ll submit a PR fixing the problem I found&lt;/strong&gt; mentality. Starting out with open source contributions is one of those things where you just need to take a plunge and soon you&amp;#39;ll find yourself doing it naturally.&lt;/p&gt;

&lt;h2 id=&quot;recommendations-for-contributors&quot;&gt;Recommendations for contributors&lt;/h2&gt;

&lt;p&gt;Do you want to contribute to open source, but are having the same doubts as me or maybe completely different doubts? Here are my tips for getting started.&lt;/p&gt;

&lt;p&gt;The initial hurdle is mainly about deciding to do it and picking a project. For the project it makes sense to pick something that you use yourself and even more so if you already have a task identified. If you don&amp;#39;t have a specific task you want to work on checkout the issues on GitHub and if you can&amp;#39;t find something that seems like a good fit for a new contributor in the issues ask the maintainers. Good candidates for projects are dependency managers, libraries, and other supporting tools.&lt;/p&gt;

&lt;p&gt;So you picked your project and task and started working on it. If it&amp;#39;s a fairly large project such as CocoaPods it&amp;#39;s good to remember that it&amp;#39;s perfectly fine that you don&amp;#39;t grasp all the ins and outs of the code, in fact you don&amp;#39;t have to. The important thing is understanding enough of the code which is related to the task you are working on. If you work with iOS or OSX CocoaPods is of course the perfect choice of project.&lt;/p&gt;

&lt;p&gt;When you finished your task make sure that you have tests covering any new code or old tests which might have had to be adjusted also make sure that you&amp;#39;re adhering to any style guides set by the project. Submit your PR and wait. Fix any issues raised by the maintainers and hopefully your PR will be merged. Good job!&lt;/p&gt;

&lt;p&gt;The next time you find yourself frustrated with something missing or not working in an open source tool you use remember that you have the power to fix it!&lt;/p&gt;

&lt;h2 id=&quot;recommendations-for-maintainers&quot;&gt;Recommendations for maintainers&lt;/h2&gt;

&lt;p&gt;If you want to have more contributors helping out with a project you are maintaining(why wouldn&amp;#39;t you?) make sure that it&amp;#39;s accessible and provide a good introduction for new contributors. This includes things like setup, running tests, code conventions, CI, labelling of issues.&lt;/p&gt;

&lt;p&gt;Answer questions when asked and encourage a community where questions should be asked not silenced.&lt;/p&gt;

&lt;p&gt;I feel like CocoaPods really is a good project to be inspired by in this regard. It&amp;#39;s a truly an awesome project to get started with.&lt;/p&gt;

&lt;h2 id=&quot;and-remember&quot;&gt;And Remember&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;http://media.giphy.com/media/q9fohf0Erd50A/giphy.gif&quot; alt=&quot;You&amp;#39;re awesome&quot;&gt;&lt;/p&gt;
</description>
    <pubDate>Sat, 25 Oct 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/starting-open-source</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/starting-open-source</guid>
  </item>
  
  
  
  <item>
    <title>Coins</title>
    <description>&lt;p&gt;Physical objects for abstract ephemeral work.&lt;/p&gt;

&lt;p&gt;Working on tools is all about levels of abstraction. CocoaPods abstracts away the idea of dealing with the transmission, setup and installation of a Cocoa Library into just &lt;code&gt;pod &amp;quot;FDModel&amp;quot;&lt;/code&gt;. The bits and pieces behind the internals are just as abstracted away from CocoaPods through ruby gems like &lt;code&gt;Xcodeproj&lt;/code&gt;, &lt;code&gt;Molinillo&lt;/code&gt; and &lt;code&gt;CLAide&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Devoting time to CocoaPods is not a thank-less task, those who have become known for their work on CocoaPods have vastly improved their &lt;a href=&quot;http://www.slate.com/articles/business/the_bet/2014/05/klout_is_basically_dead_but_it_finally_matters.html&quot;&gt;Klout score&lt;/a&gt;. Being a person who has submitted two or three pull requests probably hasn&amp;#39;t though. We want to try and do something to say thanks in  a meaningful way. We opted for token of our gratitude in the form of a coin. We&amp;#39;ll be getting these sent out to the top 80 contributors to CocoaPods the tool.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;style&gt;
#coins {
  background: url(/assets/blog_img/coins/core_contributor.jpg) no-repeat center center ;
  -webkit-background-size: cover;
  -moz-background-size: cover;
  -o-background-size: cover;
  background-size: cover;
}
&lt;/style&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/coins/c.jpg &#39;&gt;&lt;img  src=&#39;/assets/blog_img/coins/c.jpg&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;Turns out a friend from my &lt;a href=&quot;http://en.wikipedia.org/wiki/Huddersfield&quot;&gt;old hometown&lt;/a&gt; has started up a company selling &lt;a href=&quot;https://www.madebycooper.co.uk&quot;&gt;custom metalwork objects&lt;/a&gt;. When I was over last they let me share their office and showed me some beautiful pieces they had been making. I knew this was the perfect answer to the question I had been thinking about for a while &lt;em&gt;&amp;quot;How can we give something back?&amp;quot;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Most commits from people outside of the top 15 are people scratching their own itches. Annoyed at the tool they use isn&amp;#39;t quite working how they&amp;#39;d like. For a lot it&amp;#39;s their first entry into writing ruby code. The dev team guides and helps out as much as possible but it still took someone to take the first step on their own. Our selection process for the top 80 isn&amp;#39;t even that strict, if you submitted a lot of grammar and spelling fixes to the websites you&amp;#39;ve also made a really useful contribution to the community. It helped.&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/coins/coins.jpg &#39;&gt;&lt;img  src=&#39;/assets/blog_img/coins/coins.jpg&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;They&amp;#39;re gold because you&amp;#39;re awesome.&lt;/p&gt;

&lt;p&gt;They&amp;#39;re hefty because we care.&lt;/p&gt;

&lt;p&gt;The core dev team aren&amp;#39;t the only people making CocoaPods.&lt;/p&gt;

&lt;h3 id=&quot;thank-you-all&quot;&gt;Thank you all&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/fabiopelosin&quot;&gt;fabiopelosin&lt;/a&gt;, &lt;a href=&quot;https://github.com/alloy&quot;&gt;alloy&lt;/a&gt;, &lt;a href=&quot;https://github.com/orta&quot;&gt;orta&lt;/a&gt;, &lt;a href=&quot;https://github.com/floere&quot;&gt;floere&lt;/a&gt;, &lt;a href=&quot;https://github.com/segiddins&quot;&gt;segiddins&lt;/a&gt;, &lt;a href=&quot;https://github.com/kylef&quot;&gt;kylef&lt;/a&gt;, &lt;a href=&quot;https://github.com/neonichu&quot;&gt;neonichu&lt;/a&gt;, &lt;a href=&quot;https://github.com/lukeredpath&quot;&gt;lukeredpath&lt;/a&gt;, &lt;a href=&quot;https://github.com/AliSoftware&quot;&gt;AliSoftware&lt;/a&gt;, &lt;a href=&quot;https://github.com/Keithbsmiley&quot;&gt;Keithbsmiley&lt;/a&gt;, &lt;a href=&quot;https://github.com/mtitolo&quot;&gt;mtitolo&lt;/a&gt;, &lt;a href=&quot;https://github.com/Kapin&quot;&gt;Kapin&lt;/a&gt;, &lt;a href=&quot;https://github.com/nolanw&quot;&gt;nolanw&lt;/a&gt;, &lt;a href=&quot;https://github.com/goonzoid&quot;&gt;goonzoid&lt;/a&gt;, &lt;a href=&quot;https://github.com/mrackwitz&quot;&gt;mrackwitz&lt;/a&gt;, &lt;a href=&quot;https://github.com/siuying&quot;&gt;siuying&lt;/a&gt;, &lt;a href=&quot;https://github.com/supermarin&quot;&gt;supermarin&lt;/a&gt;, &lt;a href=&quot;https://github.com/jasl8r&quot;&gt;jasl8r&lt;/a&gt;, &lt;a href=&quot;https://github.com/yas375&quot;&gt;yas375&lt;/a&gt;, &lt;a href=&quot;https://github.com/dbgrandi&quot;&gt;dbgrandi&lt;/a&gt;, &lt;a href=&quot;https://github.com/subdigital&quot;&gt;subdigital&lt;/a&gt;, &lt;a href=&quot;https://github.com/kommen&quot;&gt;kommen&lt;/a&gt;, &lt;a href=&quot;https://github.com/ianyh&quot;&gt;ianyh&lt;/a&gt;, &lt;a href=&quot;https://github.com/xslim&quot;&gt;xslim&lt;/a&gt;, &lt;a href=&quot;https://github.com/swizzlr&quot;&gt;swizzlr&lt;/a&gt;, &lt;a href=&quot;https://github.com/pietbrauer&quot;&gt;pietbrauer&lt;/a&gt;, &lt;a href=&quot;https://github.com/pbernery&quot;&gt;pbernery&lt;/a&gt;, &lt;a href=&quot;https://github.com/0xced&quot;&gt;0xced&lt;/a&gt;, &lt;a href=&quot;https://github.com/clarkda&quot;&gt;clarkda&lt;/a&gt;, &lt;a href=&quot;https://github.com/mk&quot;&gt;mk&lt;/a&gt;, &lt;a href=&quot;https://github.com/jweinberg&quot;&gt;jweinberg&lt;/a&gt;, &lt;a href=&quot;https://github.com/carsonmcdonald&quot;&gt;carsonmcdonald&lt;/a&gt;, &lt;a href=&quot;https://github.com/Manfred&quot;&gt;Manfred&lt;/a&gt;, &lt;a href=&quot;https://github.com/nevyn&quot;&gt;nevyn&lt;/a&gt;, &lt;a href=&quot;https://github.com/fmccann&quot;&gt;fmccann&lt;/a&gt;, &lt;a href=&quot;https://github.com/k0nserv&quot;&gt;k0nserv&lt;/a&gt;, &lt;a href=&quot;https://github.com/squarefrog&quot;&gt;squarefrog&lt;/a&gt;, &lt;a href=&quot;https://github.com/luisdelarosa&quot;&gt;luisdelarosa&lt;/a&gt;, &lt;a href=&quot;https://github.com/tayhalla&quot;&gt;tayhalla&lt;/a&gt;, &lt;a href=&quot;https://github.com/dlackty&quot;&gt;dlackty&lt;/a&gt;, &lt;a href=&quot;https://github.com/gfontenot&quot;&gt;gfontenot&lt;/a&gt;, &lt;a href=&quot;https://github.com/blakewatters&quot;&gt;blakewatters&lt;/a&gt;, &lt;a href=&quot;https://github.com/Thomvis&quot;&gt;Thomvis&lt;/a&gt;, &lt;a href=&quot;https://github.com/joe-loco&quot;&gt;joe-loco&lt;/a&gt;, &lt;a href=&quot;https://github.com/groue&quot;&gt;groue&lt;/a&gt;, &lt;a href=&quot;https://github.com/AshFurrow&quot;&gt;AshFurrow&lt;/a&gt;, &lt;a href=&quot;https://github.com/heyzooi&quot;&gt;heyzooi&lt;/a&gt;, &lt;a href=&quot;https://github.com/dev4dev&quot;&gt;dev4dev&lt;/a&gt;, &lt;a href=&quot;https://github.com/croach&quot;&gt;croach&lt;/a&gt;, &lt;a href=&quot;https://github.com/farcaller&quot;&gt;farcaller&lt;/a&gt;, &lt;a href=&quot;https://github.com/samstewart&quot;&gt;samstewart&lt;/a&gt;, &lt;a href=&quot;https://github.com/dlvenable&quot;&gt;dlvenable&lt;/a&gt;, &lt;a href=&quot;https://github.com/dcutting&quot;&gt;dcutting&lt;/a&gt;, &lt;a href=&quot;https://github.com/nskboy&quot;&gt;nskboy&lt;/a&gt;, &lt;a href=&quot;https://github.com/Ashton-W&quot;&gt;Ashton-W&lt;/a&gt;, &lt;a href=&quot;https://github.com/rivera-ernesto&quot;&gt;rivera-ernesto&lt;/a&gt;, &lt;a href=&quot;https://github.com/lazerwalker&quot;&gt;lazerwalker&lt;/a&gt;, &lt;a href=&quot;https://github.com/phatblat&quot;&gt;phatblat&lt;/a&gt;, &lt;a href=&quot;https://github.com/ulrikdamm&quot;&gt;ulrikdamm&lt;/a&gt;, &lt;a href=&quot;https://github.com/chriseidhof&quot;&gt;chriseidhof&lt;/a&gt;, &lt;a href=&quot;https://github.com/drodriguez&quot;&gt;drodriguez&lt;/a&gt;, &lt;a href=&quot;https://github.com/olarivain&quot;&gt;olarivain&lt;/a&gt;, &lt;a href=&quot;https://github.com/MaxGabriel&quot;&gt;MaxGabriel&lt;/a&gt;, &lt;a href=&quot;https://github.com/schneiderandre&quot;&gt;schneiderandre&lt;/a&gt;, &lt;a href=&quot;https://github.com/andreamazz&quot;&gt;andreamazz&lt;/a&gt;, &lt;a href=&quot;https://github.com/nmccann&quot;&gt;nmccann&lt;/a&gt;, &lt;a href=&quot;https://github.com/Lascorbe&quot;&gt;Lascorbe&lt;/a&gt;, &lt;a href=&quot;https://github.com/dhoerl&quot;&gt;dhoerl&lt;/a&gt;, &lt;a href=&quot;https://github.com/Noreaster76&quot;&gt;Noreaster76&lt;/a&gt;, &lt;a href=&quot;https://github.com/l4u&quot;&gt;l4u&lt;/a&gt;, &lt;a href=&quot;https://github.com/seivan&quot;&gt;seivan&lt;/a&gt;, &lt;a href=&quot;https://github.com/netbe&quot;&gt;netbe&lt;/a&gt;, &lt;a href=&quot;https://github.com/paulyoung&quot;&gt;paulyoung&lt;/a&gt;, &lt;a href=&quot;https://github.com/kattrali&quot;&gt;kattrali&lt;/a&gt;, &lt;a href=&quot;https://github.com/fluidsonic&quot;&gt;fluidsonic&lt;/a&gt;, &lt;a href=&quot;https://github.com/alexrothenberg&quot;&gt;alexrothenberg&lt;/a&gt;, &lt;a href=&quot;https://github.com/martincik&quot;&gt;martincik&lt;/a&gt;, &lt;a href=&quot;https://github.com/btaylor&quot;&gt;btaylor&lt;/a&gt;, &lt;a href=&quot;https://github.com/listrophy&quot;&gt;listrophy&lt;/a&gt;, &lt;a href=&quot;https://github.com/modocache&quot;&gt;modocache&lt;/a&gt; and &lt;a href=&quot;https://github.com/atomkirk&quot;&gt;atomkirk&lt;/a&gt;.&lt;/p&gt;

&lt;p style=&quot;text-align:right&quot;&gt;&lt;em&gt;I&#39;m not looking forward to mailing these!&lt;/em&gt;&lt;/p&gt;
</description>
    <pubDate>Wed, 22 Oct 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Coins</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Coins</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 0.34</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;CocoaPods 0.34&lt;/em&gt; which includes the work sponsored by
&lt;a href=&quot;https://soundcloud.com&quot;&gt;SoundCloud&lt;/a&gt; has been released. The highlights? Support
for scoping Pods per build configuration, declaration of source repositories,
and faster downloads.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This release will require making changes to your &lt;a href=&quot;https://github.com/artsy/eidolon/blob/master/Podfile#L1-L2&quot;&gt;Podfile&lt;/a&gt;s&lt;/em&gt;&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;I would like to thank &lt;a href=&quot;https://soundcloud.com&quot;&gt;SoundCloud&lt;/a&gt; and the &lt;a href=&quot;http://foundation.travis-ci.org&quot;&gt;Travis
Foundation&lt;/a&gt; for their support. Without their
contribution, this release wouldn&amp;#39;t have been nearly as extensive. Initiatives
like this constitute an important engine to foster the development of the
CocoaPods community.&lt;/p&gt;

&lt;h2 id=&quot;dependencies-per-build-configuration&quot;&gt;Dependencies per build configuration&lt;/h2&gt;

&lt;p&gt;Read this:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Lookback&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:configurations&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;Debug&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Are you getting it?&lt;/p&gt;

&lt;p&gt;Finally you can specify dependencies per build configuration. This is one of
the most requested CocoaPods features… ever.&lt;/p&gt;

&lt;p&gt;The work on this functionality was kick-started by &lt;a href=&quot;https://github.com/nevyn&quot;&gt;Joachim
Bengtsson&lt;/a&gt; with what I could describe only as a great
open source attitude. Joachim was interested in curating the complete
experience of &lt;a href=&quot;https://lookback.io&quot;&gt;Lookback&lt;/a&gt;, including installation with
CocoaPods. Instead of just opening an issue he went above and beyond and
proposed one of the most ambitious pull requests which we ever received.
Unfortunately given its implications with the integration strategy, the patch
entered a limbo where it remained stuck for more than a year. However, thanks
to the support of SoundCloud (and the patience of Eloy) this feature has been
released.&lt;/p&gt;

&lt;p&gt;There are some caveats to keep in mind though:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Currently, dependencies can be scoped by configuration only by Pod rather
than by individual subspecs.&lt;/li&gt;
&lt;li&gt;All the resources are copied regardless of the build configurations.&lt;/li&gt;
&lt;li&gt;The Acknowledgements files generated by CocoaPods include all the Pods
regardless of whether they are scoped by build configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;private-spec-repositories&quot;&gt;Private spec repositories&lt;/h2&gt;

&lt;p&gt;Another feature which our users frequently ask for is the support
for declaring spec repositories in the Podfile. With this change the Podfile
becomes fully deterministic. This feature was kickstarted by &lt;a href=&quot;https://github.com/netbe&quot;&gt;François
Benaiteau&lt;/a&gt;. Here is how it works:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;https://github.com/CocoaPods/Specs&amp;#39;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;https://github.com/Organization/Specs&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;You might be wondering what happens when a repository is not already cloned on
the user’s system. Well, wonder no more, because &lt;a href=&quot;https://github.com/segiddins&quot;&gt;Samuel
Giddins&lt;/a&gt; has taken this feature to
the next level. If a repository is missing, CocoaPods will automatically clone
it and it will even &lt;strong&gt;finely craft a suitable&lt;/strong&gt; name.&lt;/p&gt;

&lt;p&gt;To ease the transition, the pre 0.34 behaviour of implicitly including all the
repos is still being supported, if no repo has been specified in the Podfile.
However this logic as been deprecated, so this is a good time to adopt the new
syntax in the Podfile.&lt;/p&gt;

&lt;p&gt;Another thing to keep in mind is that the order of the repositories matter.
CocoaPods will only consider the versions of a Pod available in the first repo
where that Pod is available. Higher versions of a Pod specified in repositories
declared after one including the Pod are not considered. This feature prevents
a Pod switching to another repository by accident during an update because a
new higher version has been introduced. This can be case with a private repo
where the last version of a Pod available in the master repo is customised.&lt;/p&gt;

&lt;h2 id=&quot;faster-downloads&quot;&gt;Faster downloads&lt;/h2&gt;

&lt;p&gt;97% of the Pods available in the master repo use a git source (6193 out of 6403
to be precise). We noticed this trend early on during the development of
CocoaPods and we have adopted a cache for this download strategy. This solution
worked reasonably well for users cycling a common pool of Pods and upgrading
them. However, it had the disadvantage of incurring in a performance hit during
the first clone of a Pod. This hit was dramatically stronger for repositories
with a complex history.&lt;/p&gt;

&lt;p&gt;Fortunately &lt;a href=&quot;https://github.com/supermarin&quot;&gt;Marin Usalj&lt;/a&gt; come to the rescue and
proposed to move away from the caching system in favour of shallow cloning git
repos. The result? A faster experience and an even faster &lt;code&gt;pod try&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;reorganisation-of-the-pods-directory&quot;&gt;Reorganisation of the Pods directory&lt;/h2&gt;

&lt;p&gt;The Pods directory has not been the pinnacle of human organisation. With the
development of CocoaPods different artefacts have been added and the layout of
the CocoaPods home has became a bit cluttered. We decided that the time to tidy
up our room has come. However we couldn’t leave existing installations
in the cold. So we have implemented a migration mechanism that &lt;strong&gt;completely&lt;/strong&gt;
automates the transition. This is the tree that we are aiming at:&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/CocoaPods-0.34/pod_dir.png&#39;&gt;&lt;img width=&quot;559&quot; class=&quot;image-zooma&quot;  src=&#39;/assets/blog_img/CocoaPods-0.34/pod_dir.png&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately during the release candidates we discovered that a non negligible
number of Pods rely on the unsupported &lt;code&gt;PODS_ROOT&lt;/code&gt; configuration setting
instead of using the
&lt;a href=&quot;http://guides.cocoapods.org/syntax/podspec.html#vendored_frameworks&quot;&gt;&lt;code&gt;vendored_frameworks&lt;/code&gt;&lt;/a&gt;
and the
&lt;a href=&quot;http://guides.cocoapods.org/syntax/podspec.html#vendored_libraries&quot;&gt;&lt;code&gt;vendored_libraries&lt;/code&gt;&lt;/a&gt;
attributes. To prevent issues we reverted the change which moved the sources
of the Pods in the directory aptly named &lt;code&gt;Sources&lt;/code&gt; – I know this name is pure
art. However, this is a temporary band aid and &lt;em&gt;Podspecs maintainers should
update their specifications as soon as possible&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id=&quot;foundation-work&quot;&gt;Foundation work&lt;/h2&gt;

&lt;p&gt;The support from SoundCloud and the Travis Foundation extended to a less
visible but certainly not less important level.&lt;/p&gt;

&lt;p&gt;Many of the CocoaPods dependencies have been cleaned up. Most of their issues
have been solved. Code-base style and the coverage was taken care of. Solid
dependencies means that the CocoaPods-Core team now can focus only in the last
mile, especially in the integration strategies.&lt;/p&gt;

&lt;p&gt;Another tiny, tiny, tiny, but very significant change is that now
&lt;code&gt;requires_arc&lt;/code&gt; defaults to true on Podspecs. This might look like the easiest
patch ever (just one line of code) however it provides an insight on the real
complexity of CocoaPods development: preserving existing installations… a.k.a
backwards compatibility. So this innocent looking
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/267&quot;&gt;issue&lt;/a&gt; required to switch
the entire specs repo to JSON (in order to safely edit all the specs
programmatically) which in turn required to implement the trunk (in order to
prevent the mater repo from becoming a Babel of different formats). Of course
stating that those features stemmed from this  issue is a stretch, but at least
for me, their seed was planted there. I’m personally super happy to see it
finally closed after more than two years. By the way, if you have a custom
and private Podspecs I would recommend to check them to avoid any issue.&lt;/p&gt;

&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;/h2&gt;

&lt;p&gt;To install the last release of CocoaPods you can run:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;sudo&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; gem install cocoapods
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Until version 1.0 we strongly encourage you to keep CocoaPods up-to-date.&lt;/p&gt;

&lt;p&gt;For all the details, don’t miss the
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/blob/master/CHANGELOG.md&quot;&gt;Changelog&lt;/a&gt;.&lt;/p&gt;
</description>
    <pubDate>Fri, 26 Sep 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-0.34</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-0.34</guid>
  </item>
  
  
  
  <item>
    <title>pod lib create v2</title>
    <description>&lt;p&gt;&lt;code&gt;pod lib create&lt;/code&gt; has been our way of trying to encourage standards, and to make it easy to create a new library. Before today it would leave a &lt;a href=&quot;http://code.dblock.org/reorganizing-cocoapod-folder-structure-for-unit-and-integration-testing&quot;&gt;lot of setup&lt;/a&gt; at the developer&amp;#39;s discretion. The new version automates a lot of common problems away and starts you with a new library structure. Read on for details.&lt;/p&gt;

&lt;p&gt;Or just go straight to the &lt;a href=&quot;http://guides.cocoapods.org/making/using-pod-lib-create.html&quot;&gt;Using Pod Lib Create guide&lt;/a&gt;.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Rather than explain what it does, which the guide does a better job of, I want to show the end result:&lt;/p&gt;

&lt;p&gt;&lt;center&gt;
&lt;a href=&quot;http://guides.cocoapods.org/assets/images/pod_lib_create/xcode.png&quot;&gt;&lt;img src=&quot;http://guides.cocoapods.org/assets/images/pod_lib_create/xcode.png&quot; class=&quot;image-zoom&quot;&gt;&lt;/a&gt;
&lt;/center&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You can edit your Podspec metadata, like the README and Library Podspec in Xcode.&lt;/li&gt;
&lt;li&gt;There is an automatically generated project with your own Prefix settings.&lt;/li&gt;
&lt;li&gt;Extremely easy to start writing library tests, we include stubs for Specta/Expecta and Kiwi.&lt;/li&gt;
&lt;li&gt;Your library is set up as a Development Pod.&lt;/li&gt;
&lt;li&gt;We include some useful Pods for bootstrapping your project.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This update is available today because of how Fabio built templates to allow for custom repos, and it definitely accepts &lt;a href=&quot;https://github.com/CocoaPods/pod-template&quot;&gt;pull requests and issues&lt;/a&gt;.&lt;/p&gt;
</description>
    <pubDate>Thu, 26 Jun 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Pod-Lib-Create</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Pod-Lib-Create</guid>
  </item>
  
  
  
  <item>
    <title>Pod Roulette Hackathon SF Summary</title>
    <description>&lt;iframe src=&quot;https://docs.google.com/file/d/0B_iY-nlLiaNqdm16QTA5Nk9yTm8/preview&quot; width=&quot;100%&quot; height=&quot;480&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;Last Saturday we ran the &lt;a href=&quot;http://blog.cocoapods.org/Pod-Roulette-Hackathon/&quot;&gt;first CocoaPods hackathon&lt;/a&gt; with a great turn out especially considering post-WWDC tiredness.&lt;/p&gt;

&lt;p&gt;We ran it based on &lt;a href=&quot;http://podroulette.com&quot;&gt;Pod Roulette&lt;/a&gt;, and surprisingly most projects stayed true to the theme. We assigned each team three random Pods which needed to be used in their projects, adding additional Pods was fine, but you had to use each randomly assigned Pod in some fashion.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/Hackathon-Summary/kickoff.jpg &#39;&gt;&lt;img  src=&#39;/assets/blog_img/Hackathon-Summary/kickoff.jpg&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;Here&amp;#39;s what we ended up with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;StickyHeaderFlowLayoutFiltersSortDescriptorWilsonRank&lt;/strong&gt;, dubbed the &lt;em&gt;Instagram of beatboxing&lt;/em&gt; by &lt;a href=&quot;https://twitter.com/topwobble/&quot;&gt;@topwobble&lt;/a&gt; and team. &lt;a href=&quot;https://github.com/evilstudios/Wilson&quot;&gt;Source on GitHub&lt;/a&gt; and &lt;a href=&quot;http://codepen.io/benknight/pen/LluhH&quot;&gt;Audio Snippet&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PullToRefreshPopperToolsImageDownloader&lt;/strong&gt;, an &lt;a href=&quot;http://imgur.com&quot;&gt;Imgur&lt;/a&gt; Roulette app by &lt;a href=&quot;https://twitter.com/alexdaukrainian/&quot;&gt;@alexdaukrainian&lt;/a&gt; and team. &lt;a href=&quot;https://github.com/gamenerds/PTRImageDownloader&quot;&gt;Source on GitHub&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/alexdaukrainian/status/475527364646936576&quot;&gt;Video&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;InterfaCSSStatusBarBlurryTableViewController&lt;/strong&gt;, a MultiPeerConnectivity enabled app by &lt;a href=&quot;https://twitter.com/orta/&quot;&gt;@orta&lt;/a&gt; and team. &lt;a href=&quot;https://github.com/orta/InterfaCSSStatusBarBlurryTableViewController&quot;&gt;Source on GitHub&lt;/a&gt;. Orta also worked on an iOS 8 keyboard, for offering quick access to popular animated GIFs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GtmHttpFetcherCoreLinkCocoa&lt;/strong&gt;, an app for remote controlling a &lt;a href=&quot;http://pjlink.jbmia.or.jp/english/&quot;&gt;PJLink-enabled&lt;/a&gt; projector with your Pebble by &lt;a href=&quot;https://twitter.com/hbehrens/&quot;&gt;@hbehrens&lt;/a&gt; and team. Source will be available after cleanup.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apart from those fun projects, we even got some useful stuff as well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://twitter.com/simjp&quot;&gt;@simjp&lt;/a&gt; worked on &lt;a href=&quot;https://github.com/realm/jazzy&quot;&gt;jazzy&lt;/a&gt;, a better way to generate documentation using Xcode&amp;#39;s &lt;em&gt;SourceKit&lt;/em&gt;!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://twitter.com/blakewatters&quot;&gt;@blakewatters&lt;/a&gt; released &lt;a href=&quot;https://github.com/layerhq/FMDBMigrationManager&quot;&gt;FMDBMigrationManager&lt;/a&gt;, a library for managing SQLite database schemas with FMDB.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks a lot to &lt;a href=&quot;https://layer.com&quot;&gt;Layer&lt;/a&gt; for hosting the event and graciously providing food and drinks!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/blog_img/Hackathon-Summary/welcome.jpg&quot;&gt;&lt;img src=&quot;/assets/blog_img/Hackathon-Summary/welcome.jpg&quot; width=&quot;50%&quot; style=&quot;float:right;&quot;&gt;&lt;/a&gt;
&lt;a shref=&quot;/assets/blog_img/Hackathon-Summary/office.jpg&quot;&gt;&lt;img src=&quot;/assets/blog_img/Hackathon-Summary/office.jpg&quot; width=&quot;50%&quot; style=&quot;float:right;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
</description>
    <pubDate>Thu, 12 Jun 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Hackathon-Summary</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Hackathon-Summary</guid>
  </item>
  
  
  
  <item>
    <title>Stripe's Open Source Retreat</title>
    <description>&lt;p&gt;Today, I am beyond excited to announce that I will be working full-time on CocoaPods this autumn, courtesy of Stripe&amp;#39;s &lt;a href=&quot;https://stripe.com/blog/open-source-retreat-grantees&quot;&gt;Open Source Retreat&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For three months, in addition to my normal work on CocoaPods, I will be working to write a reference implementation of an iterative dependency resolver that will be shared by CocoaPods and &lt;a href=&quot;https://bundler.io/&quot;&gt;Bundler&lt;/a&gt; (and available to any developer that wants to use it).
As part of the project, I will also be writing a language-agnostic test suite to help standardize behavior across different implementations of resolvers.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Ever since I first joined GitHub, I have dreamed about writing open source software for a living. Stripe is both making my dream a reality and truly supporting great open source work.&lt;/p&gt;

&lt;p&gt;Since joining the CocoaPods Core team two months ago, I have set my eyes on the resolver.
Right now, it has a &amp;#39;naive&amp;#39; implementation: we just go through the dependencies list and pick the highest version that &amp;#39;fits&amp;#39; with the current requirements.
The right way to do this is to add automatic conflict resolution: when we run into a versioning conflict, we need to &amp;#39;back up&amp;#39; and try another set of versions.
This is a tough algorithmic problem, and exploring the best way to do it (both in terms of algorithm and architecture) has prevented us from tackling it before now.
With this rewrite, we will be a giant leap closer to CocoaPods 1.0.&lt;/p&gt;

&lt;p&gt;Come September, I will be in San Fransisco, taking a year off of university, working on CocoaPods full-time. This means I&amp;#39;ll be working on even more issues, contributing more features, and hopefully writing a few interesting updates on my progress.&lt;/p&gt;

&lt;p&gt;The entire CocoaPods team and I are incredibly grateful to &lt;a href=&quot;https://stripe.com/&quot;&gt;Stripe&lt;/a&gt; for supporting our work and sharing our visions for the future of open-source.&lt;/p&gt;
</description>
    <pubDate>Mon, 09 Jun 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Stripe-Open-Source-Retreat</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Stripe-Open-Source-Retreat</guid>
  </item>
  
  
  
  <item>
    <title>Pod Roulette Hackathon - San Francisco - 7th June 2014</title>
    <description>&lt;p&gt;Have you heard of &lt;a href=&quot;http://podroulette.com&quot;&gt;pod-roulette&lt;/a&gt;? If not, here&amp;#39;s their elevator pitch:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Just moved to the big city, got a seed investment but don&amp;#39;t have an idea what to do next?&lt;/p&gt;

&lt;p&gt;Pod Roulette will find three random pods and prepare a project for you in a few seconds.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After seeing this project, we knew that there should be a &lt;strong&gt;hackathon&lt;/strong&gt; using this.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;And now there is: right after WWDC, on &lt;strong&gt;Saturday, June 7th 2014&lt;/strong&gt;, we will meet &lt;strong&gt;at 10am&lt;/strong&gt; and hack on our randomly determined projects until 5pm, then there will be presentations from 6pm to 7pm. Of course you can also come around and hack on something else, for example we can set you up with getting started to contribute to CocoaPods itself.&lt;/p&gt;

&lt;p&gt;The hackathon will be &lt;strong&gt;hosted at Layer HQ&lt;/strong&gt;, which can be reached by a &lt;a href=&quot;https://www.google.com/maps/dir/Moscone+Center/470+Alabama+St,+San+Francisco,+CA+94110/@37.7737857,-122.4268309,14z/data=!3m1!4b1!4m14!4m13!1m5!1m1!1s0x808580877d2fc9ad:0xd182ccc332c28697!2m2!1d-122.401557!2d37.784173!1m5!1m1!1s0x808f7e3074359e0f:0x710aa5eaaf53cd94!2m2!1d-122.412559!2d37.763261!3e3&quot;&gt;short bus ride&lt;/a&gt; from Moscone. They will be graciously providing lunch, dinner and drinks - thanks! &lt;/p&gt;

&lt;p&gt;Join our &lt;a href=&quot;http://www.meetup.com/CocoaPods-SF/&quot;&gt;meetup&lt;/a&gt; group and &lt;a href=&quot;http://www.meetup.com/CocoaPods-SF/events/186336602/&quot; data-event=&quot;186336602&quot; class=&quot;mu-rsvp-btn&quot;&gt;RSVP&lt;/a&gt; online.&lt;/p&gt;

&lt;p&gt;As always, don&amp;#39;t be a jerk --&amp;gt; &lt;a href=&quot;http://cocoapods.org/legal&quot;&gt;Code of Conduct&lt;/a&gt;&lt;/p&gt;

&lt;script&gt;!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s); js.id=id;js.async=true;js.src=&quot;https://secure.meetup.com/script/21021123101537681383/api/mu.btns.js?id=a74a4o9ar6ca0btqqmtk1k5uv2&quot;;fjs.parentNode.insertBefore(js,fjs);}}(document,&quot;script&quot;,&quot;mu-bootjs&quot;);&lt;/script&gt;
</description>
    <pubDate>Sat, 31 May 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Pod-Roulette-Hackathon</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Pod-Roulette-Hackathon</guid>
  </item>
  
  
  
  <item>
    <title>On Launching CocoaDocs Version 2</title>
    <description>&lt;p&gt;In March 2013 I uploaded the &lt;a href=&quot;https://github.com/CocoaPods/cocoadocs.org/commit/93e9896b04f79eb09be28a9056671b1d23f3143d&quot;&gt;initial commit&lt;/a&gt; for &lt;a href=&quot;http://cocoadocs.org&quot;&gt;CocoaDocs&lt;/a&gt;. This action triggered a roller-coaster &lt;a href=&quot;http://orta.github.io/on/being/27/#cocoadocs&quot;&gt;year for me&lt;/a&gt;. I&amp;#39;m super excited to announce the second iteration of CocoaDocs is now running and &lt;a href=&quot;http://cocoadocs.org/docsets/ReactiveCocoa/2.3.1/&quot;&gt;parsing&lt;/a&gt; &lt;a href=&quot;http://cocoadocs.org/docsets/ARAnalytics/2.7.2/&quot;&gt;new&lt;/a&gt; &lt;a href=&quot;http://cocoadocs.org/docsets/BlocksKit/2.2.3/&quot;&gt;Docsets&lt;/a&gt;.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot; style=&quot;padding-bottom:0px;&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;http://cocoadocs.org/docsets/OHHTTPStubs/3.1.2/&#39;&gt;&lt;img  width=&quot;1024&quot; src=&#39;/assets/blog_img/cocoadocs/headline.jpg&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;h2 id=&quot;key-features-list&quot;&gt;Key Features List&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Travis CI is now important&lt;/li&gt;
&lt;li&gt;Documentation number of shame&lt;/li&gt;
&lt;li&gt;Easy access to License info&lt;/li&gt;
&lt;li&gt;Per &lt;a href=&quot;http://cocoadocs.org/readme&quot;&gt;library style&lt;/a&gt; settings&lt;/li&gt;
&lt;li&gt;Programming Guides&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://kapeli.com/dash&quot;&gt;Dash&lt;/a&gt; specific layouts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So it came to me as a surprise that CocoaDocs narrowly beats the CocoaPods Guides in terms of web traffic. It was the original point at which I (&lt;a href=&quot;http://orta.github.io&quot;&gt;orta&lt;/a&gt;) had made a major contribution to the OSS community, and whilst it&amp;#39;s great technically, it has always bothered me that I was constrained in the design. It bothered me enough that I &lt;a href=&quot;/redesign/&quot;&gt;started a redesign process&lt;/a&gt; for the entire of CocoaPods. Now I am free of this burden.&lt;/p&gt;

&lt;p&gt;With the mostly solid foundations of CocoaDocs working, I was free to sit back and debate the wider reaching implications. CocoaDocs at its core is about best practices, &lt;a href=&quot;http://nshipster.com/documentation/&quot;&gt;adding documentation&lt;/a&gt; is an important part of a libraries lifecycle. I believe testing is another, because of how easy it is to get started with Travis CI and the fact that it is free for open source it is in my opinion a no-brainer to include that metadata in a library.&lt;/p&gt;

&lt;h2 id=&quot;getting-started&quot;&gt;Getting started&lt;/h2&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot; style=&quot;padding-bottom:0px;&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;http://cocoadocs.org/readme&#39;&gt;&lt;img width=&quot;1024&quot; src=&#39;/assets/blog_img/cocoadocs/readme.jpg&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;I also felt that CocoaDocs was a black box for developers who didn&amp;#39;t want to read the source code, which is basically everyone. So I&amp;#39;ve taken the liberty of creating a &lt;a href=&quot;http://cocoadocs.org/readme/&quot;&gt;CocoaDocs Developer Docs&lt;/a&gt;. This is an area where you can preview your custom styling, and get the answers to a lot of the questions I&amp;#39;ve answer on twitter.&lt;/p&gt;

&lt;h2 id=&quot;coming-up&quot;&gt;Coming up&lt;/h2&gt;

&lt;p&gt;This is not a full release of CocoaDocs 2, I&amp;#39;m waiting till post-WWDC 2014 to know whether the world has changed yet again to start the process of running CocoaDocs on over 15k libraries. During this time period new libraries get the new style, old libraries keep the old style. There are still a few &lt;a href=&quot;https://github.com/CocoaPods/cocoadocs.org/issues?state=open&quot;&gt;open issues&lt;/a&gt; on CocoaDocs but there&amp;#39;s time, we&amp;#39;re at a solid 95% now.&lt;/p&gt;

&lt;p&gt;CocoaDocs could not have existed without help from &lt;a href=&quot;http://gentlebytes.com/appledoc/&quot;&gt;appledoc&lt;/a&gt;, &lt;a href=&quot;/assets/blog_img/cocoadocs/danger.jpg&quot;&gt;Danger&lt;/a&gt;, the &lt;a href=&quot;http://cocoapods.org/about&quot;&gt;CocoaPods Dev Team&lt;/a&gt; and everyone who has contributed a library.&lt;/p&gt;
</description>
    <pubDate>Mon, 26 May 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaDocs2-Launch</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaDocs2-Launch</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods AltLabs - San Francisco - 5th June 2014</title>
    <description>&lt;p&gt;It&amp;#39;s been a busy week, with the introduction of Trunk and CocoaPods 0.33.
We&amp;#39;re delighted to announce another event in San Francisco, this time it&amp;#39;s
&lt;a href=&quot;http://www.altconf.com/altlabs/&quot;&gt;AltLabs&lt;/a&gt;, a labs session dedicated to
CocoaPods. Special thanks goes to &lt;a href=&quot;http://www.altconf.com/&quot;&gt;AltConf&lt;/a&gt; for
hosting the session.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;The labs session will give you a perfect opportunity to come along and meet
some of the team behind CocoaPods. We will be able to assist you on any issues
you have with CocoaPods along with migrating your pods to the brand new trunk
system. Our session will also allow you to get help setting up a development
environment and making your first contribution to CocoaPods.&lt;/p&gt;

&lt;p&gt;Since we have a lot going on during WWDC, I&amp;#39;m going to take this opportunity to
give you a quick reminder of all the events we are hosting so you don&amp;#39;t miss out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/Cocoa-Kucha-4/&quot;&gt;Cocoa Kucha 4 (28th May 2014)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/CocoaPods-WWDC-Party/&quot;&gt;The CocoaPodsAlt State of the Union (2nd June 2014)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CocoaPods Labs (5th June 2014, 9am - noon)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The session will be hosted at Jillian&amp;#39;s which is right across the street from
both AltConf and Moscone West. So you have absolutely no excuse not to pop
over if you are in San Francisco for either events.&lt;/p&gt;

&lt;p&gt;Join our &lt;a href=&quot;http://www.meetup.com/CocoaPods-SF/&quot;&gt;meetup&lt;/a&gt; group and &lt;a href=&quot;http://www.meetup.com/CocoaPods-SF/events/184789102/&quot; data-event=&quot;184789102&quot; class=&quot;mu-rsvp-btn&quot;&gt;RSVP&lt;/a&gt; online.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://cocoapods.org/legal&quot;&gt;Code of Conduct&lt;/a&gt;&lt;/p&gt;

&lt;script&gt;!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s); js.id=id;js.async=true;js.src=&quot;https://secure.meetup.com/script/21021123101537681383/api/mu.btns.js?id=a74a4o9ar6ca0btqqmtk1k5uv2&quot;;fjs.parentNode.insertBefore(js,fjs);}}(document,&quot;script&quot;,&quot;mu-bootjs&quot;);&lt;/script&gt;
</description>
    <pubDate>Fri, 23 May 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-AltLabs</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-AltLabs</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 0.33</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;CocoaPods 0.33 has been released. It is shiny and brings a huge change
for our community… the support for CocoaPods Trunk.&lt;/em&gt;&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h2 id=&quot;new-command-line-ui&quot;&gt;New command line UI&lt;/h2&gt;

&lt;p&gt;The help banners of the command line have been tuned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each element now is consistently identified by a single colour. The
highlighting is also performed in the descriptions of the commands to make
them more readable.&lt;/li&gt;
&lt;li&gt;The alignment of the various elements and of their description has been
carefully crafted.&lt;/li&gt;
&lt;li&gt;The descriptions and other bodies of text now are consistently wrapped to the
width of the terminal (or to a maximum value to preserve readability for full
screen windows).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/CocoaPods-0.33/pod_help.png&#39;&gt;&lt;img width=&quot;775&quot; class=&quot;image-zoom&quot;  src=&#39;/assets/blog_img/CocoaPods-0.33/pod_help.png&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;There is still some debate about how to handle light backgrounds. So if you
have a well-construed argument share your view on
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/2159&quot;&gt;CocoaPods#2159&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Another interesting enhancement is the inclusion of a suggestion for
unrecognised arguments, which makes typos much easier to catch.&lt;/p&gt;

&lt;p&gt;Finally, a galore of minor tweaks have been implemented:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The naked &lt;code&gt;pod&lt;/code&gt; command doesn’t default to &lt;code&gt;pod install&lt;/code&gt; anymore because it
presented an error if the Podfile was not found. This context dependant
behaviour was not the experience we are looking for our new users.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;--version&lt;/code&gt; option is not available anymore in sub-commands and gained the
ability of presenting the versions of the installed plugins if coupled with
the &lt;code&gt;--verbose&lt;/code&gt; option.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;command-line-completion&quot;&gt;Command line completion&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;--completion-script&lt;/code&gt; option has been implemented for the &lt;code&gt;pod&lt;/code&gt; command.
It prints a completion script for the current shell (currently only the Z shell
is supported). The result is: faster than ever CocoaPoding:&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/CocoaPods-0.33/pod_search_completion.gif&#39;&gt;&lt;img width=&quot;500&quot;  src=&#39;/assets/blog_img/CocoaPods-0.33/pod_search_completion.gif&#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;We choose to generate a script because this approach is much faster than
invoking the &lt;code&gt;pod&lt;/code&gt; command line tool to provide the completions. Unfortunately
this approach will not pick changes relate to the installation (or the removal)
of plugins or changes due to CocoaPods updates.&lt;/p&gt;

&lt;p&gt;If you are using a properly configured Z shell, you can install or update the
completion script with the following commands:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;rm -f /usr/local/share/zsh/site-functions/_pod
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;pod --completion-script &amp;gt; /usr/local/share/zsh/site-functions/_pod
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;exec &lt;/span&gt;zsh
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h2 id=&quot;cocoapods-trunk&quot;&gt;cocoapods-trunk&lt;/h2&gt;

&lt;p&gt;CocoaPods trunk is the new way to share specs via the CocoaPods Master repo. If
you haven’t heard about it yet, you can read the details about it in the
dedicated &lt;a href=&quot;/CocoaPods-Trunk/&quot;&gt;blog post&lt;/a&gt;. For CocoaPods users it is relevant to
know that the &lt;code&gt;pod push&lt;/code&gt; command has been moved to &lt;code&gt;pod repo push&lt;/code&gt; (a temporary
alias has been provided) because since this version it is intended to be used
for private repos. Moreover, to prevent users sharing accidentally private
  specs with world, the &lt;code&gt;pod repo push&lt;/code&gt; command will abort if there is an
  attempt to push to a repo where the master repo as the remote.&lt;/p&gt;

&lt;p&gt;During the development of trunk we discovered that some users are not properly
leveraging private repos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you are using the master repo to add your own private specs, don’t do this.&lt;/li&gt;
&lt;li&gt;If you are using the name ‘master’ for you own private spec-repo, don’t do this.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Things will break.&lt;/p&gt;

&lt;h2 id=&quot;cocoapods-plugins&quot;&gt;cocoapods-plugins&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/dbgrandi&quot;&gt;David Grandinetti&lt;/a&gt; and &lt;a href=&quot;https://github.com/AliSoftware&quot;&gt;Olivier
Halligon&lt;/a&gt; have been hard at work to tame the
proliferation of plugins. The result is the extremely meta &lt;code&gt;cocoapods-plugins&lt;/code&gt;
plugin which can list, search and check the available versions of the most
useful CocoaPods plugins.  Moreover, &lt;a href=&quot;https://github.com/neonichu&quot;&gt;Boris
Bügling&lt;/a&gt; created a template (&lt;code&gt;pod plugins create&lt;/code&gt;)
so getting started has never been easier.&lt;/p&gt;

&lt;p&gt;A great example of a new CocoaPods plugin is &lt;a href=&quot;http://podroulette.com&quot;&gt;podroulette&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;/h2&gt;

&lt;p&gt;To install the last release of CocoaPods you can run:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;sudo&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; gem install cocoapods
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Until version 1.0 we strongly encourage you to keep CocoaPods up-to-date.&lt;/p&gt;

&lt;p&gt;For all the details, don’t miss the
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/blob/master/CHANGELOG.md&quot;&gt;Changelog&lt;/a&gt;.&lt;/p&gt;
</description>
    <pubDate>Wed, 21 May 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-0.33</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-0.33</guid>
  </item>
  
  
  
  <item>
    <title>Claim Your Pods</title>
    <description>&lt;p&gt;Today we are introducing the ‘Trunk’ web-service. An awesome new way for podspec
authors to submit their libraries to the master specs repository. For
authors who have previously had push access the workflow should be very
similar using the &lt;code&gt;pod push&lt;/code&gt; subcommand. For more information on the ‘Trunk’
web-service itself, see &lt;a href=&quot;http://blog.cocoapods.org/CocoaPods-Trunk/&quot;&gt;the previous blog post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Along with these changes we are adding a hierarchy of ownership to
submitted podspecs. This way library maintainers will have complete
control over submissions of their specs to the master repo.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Moving forward this ownership will be determined by the first user to
submit a new spec. With existing podspecs, granting ownership will be a
little more complicated.&lt;/p&gt;

&lt;h2 id=&quot;claim-your-pod&quot;&gt;Claim your Pod&lt;/h2&gt;

&lt;h3 id=&quot;claim-submission&quot;&gt;Claim submission&lt;/h3&gt;

&lt;p&gt;For the next few days we will be taking applications from spec authors
to claim their pods. This will set initial ownership for your libraries
within the ‘Trunk’ web-service allowing you, and the people you allow, to push new
specs for the given library. To do this we&amp;#39;ll need you to fill out
this &lt;a href=&quot;https://trunk.cocoapods.org/disputes&quot;&gt;form&lt;/a&gt; with the email address 
you would like use to identify with as an owner and the pod name you&amp;#39;re 
claiming. Be sure to use the email address you use with Github so the 
commit logs will show your Github account.&lt;/p&gt;

&lt;h3 id=&quot;claim-collisions&quot;&gt;Claim collisions&lt;/h3&gt;

&lt;p&gt;In the case that someone has already submitted a claim for the pod you
are claiming we&amp;#39;ll have to grant ownership differently. If you are one
of many maintainers of the pod, it&amp;#39;s likely that your co-maintainers have
already gained ownership to the repo and can add you.&lt;/p&gt;

&lt;h3 id=&quot;co-maintainer-access&quot;&gt;Co-maintainer access&lt;/h3&gt;

&lt;p&gt;If you maintain a spec along with a few other contributors you can all
be added as owners to that spec. The initial owner can add other
contributors through the &lt;a href=&quot;http://guides.cocoapods.org/making/getting-setup-with-trunk&quot;&gt;command line interface&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;moving-forward&quot;&gt;Moving forward&lt;/h2&gt;

&lt;p&gt;We will take submissions for ownership until most specs have owners. We
estimate this will take a week or so.&lt;/p&gt;

&lt;p&gt;After this any new specs you submit will default to your ownership. In
the future ownership claims will be handled by the CocoaPods dev team. 
One important side effect of this new workflow is how submitting pods 
will change besides just using the &lt;code&gt;push&lt;/code&gt; command. &lt;/p&gt;

&lt;p&gt;Currently many spec authors rely on Travis to validate the correctness 
of their new spec versions. &lt;em&gt;We will no longer be using Travis for CI builds.&lt;/em&gt; 
When submitting a new version of your podspec the command line tool will 
run a local &lt;code&gt;pod spec lint&lt;/code&gt; verifying the spec&amp;#39;s validity locally. &lt;/p&gt;

&lt;p&gt;After submitting a new version of a spec any revisions to that version must 
be submitted as a pull request to the &lt;a href=&quot;https://github.com/CocoaPods/Specs&quot;&gt;master repo&lt;/a&gt;. 
Because of this I would recommend that you thoroughly test your spec with the linting
&lt;a href=&quot;http://guides.cocoapods.org/terminal/commands.html#pod_lib_lint&quot;&gt;tools&lt;/a&gt;
and by using it in your real applications and/or demo applications to make sure
everything works as expected. This is &lt;em&gt;your&lt;/em&gt; responsibility from hereon out.&lt;/p&gt;
</description>
    <pubDate>Tue, 20 May 2014 15:38:00 +0100</pubDate>
    <link>https://blog.cocoapods.org/Claim-Your-Pods</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Claim-Your-Pods</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods Trunk</title>
    <description>&lt;p&gt;After a year of architecture design and hard work, we are proud to introduce the ‘Trunk’ web-service, which will dramatically improve the user-experience of podspec publishers.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;TL;DR We have good reasons for why and how we’re going to continue from here, but feel free to skip over the history lessons and straight to: &lt;a href=&quot;#trunk&quot;&gt;‘Trunk’, our solution&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;the-past-and-the-why&quot;&gt;The past and the why&lt;/h2&gt;

&lt;p&gt;Many have asked “why doesn’t CocoaPods have a simple way to publish new Pods, like RubyGems and NPM etc have?”, so let’s shine some light on that.&lt;/p&gt;

&lt;p&gt;Arguably, configuring a black-box such as Xcode and getting native code to be compiled for various platforms, deployment targets, and architectures to build and the permutations thereof is way harder than what RubyGems, NPM, and the likes have to do. Obviously this is a huge benefit of scripting languages, which (often) do not need to deal with these seemingly arcane workflows.&lt;/p&gt;

&lt;p&gt;So, back when I started work on CocoaPods, I did not want to spend much time on a centralised web-service yet if we didn’t even know &lt;em&gt;all&lt;/em&gt; the details about our ‘core-business’ yet. Even if you can create a web-service “over a weekend”, that doesn’t mean it’s particularly helpful to the process of figuring out the hard parts, namely resolving, installing, and integrating your dependencies.&lt;/p&gt;

&lt;p&gt;In fact, starting off with a web-service makes the whole process &lt;em&gt;harder&lt;/em&gt;, because running a web-service means you now suddenly have to do maintenance on that, as the community will expect it to be up 100% of the time. And if there is &lt;strong&gt;one thing&lt;/strong&gt; I have learned, then it’s that having this responsibility as a group of volunteers –&lt;em&gt;doing a lot of this in their spare-time and for gratis&lt;/em&gt;– it is that inevitably there will be burn-out and/or the need to raise a lot of money due to possibly hard to maintain architectural decisions. (Examples of this are the amount of pressure on the RubyGems.org volunteers in the case of downtime etc and &lt;a href=&quot;https://scalenpm.nodejitsu.com&quot;&gt;scalenpm.org&lt;/a&gt; in the case of needing large funds to maintain their infrastructure.)&lt;/p&gt;

&lt;p&gt;I also wanted to design the architecture so that, for instance, companies that want to use their private dependencies through CocoaPods would not have to configure and host a web-service either. Nobody wants to do more than is necessary, not in the least because it just makes for a frustrating server-admin experience.&lt;/p&gt;

&lt;p&gt;From these reasons stems the simple solution to host these in a simple directory structure and use established SCM systems to keep these versioned and simple to distribute. This strategy to keep things simple has served us rather well. However, at a certain scale, and especially in a Open-Source environment such as our ‘master’ spec-repo, there inevitably comes a time where you need to take it to the next level…&lt;/p&gt;

&lt;h2 id=&quot;the-problem&quot;&gt;The problem&lt;/h2&gt;

&lt;p&gt;Our ‘master’ spec-repo boss, Sir &lt;a href=&quot;http://twitter.com/SmileyKeith&quot;&gt;Keith Smiley&lt;/a&gt;, is a review-and-merge-monster and has been able to keep-up with all of the pull-requests that you have been sending his way for the last two years. But, as we can clearly see the rising trend of number of Pods being published, at some point even Keith won’t be able to handle your scale.&lt;/p&gt;

&lt;p&gt;Another issue we noticed is that the current workflow of creating a pull-request and automatically getting feedback from Travis in addition to manual reviews from Keith and &lt;a href=&quot;http://twitter.com/squarefrog&quot;&gt;Paul&lt;/a&gt; has lead to many podspec publishers being too ‘lazy’ and instead of properly testing whether or not a podspec will actually work well for a user by testing it in their own applications, they end-up updating and pushing their specs until it supposedly works. This is not only an abuse of the time our volunteers have, but it also shifts the responsibility to ensure proper working podspecs away from the publisher.&lt;/p&gt;

&lt;p&gt;Other people in the community would like to create web-services around CocoaPods and for this they need some form of API and a format &lt;em&gt;other&lt;/em&gt; than Ruby, to be able to interpret the podspecs and provide any meaningful service around them.&lt;/p&gt;

&lt;p&gt;Finally, at some point, even &lt;em&gt;the most well-intended person&lt;/em&gt; will slip up. A good example of this is when an unauthorised person pushed a podspec for an non-existing AFNetworking version. Obviously, the only person that should be allowed to do so is &lt;a href=&quot;http://twitter.com/mattt&quot;&gt;Mattt&lt;/a&gt; (the author of AFNetworking) and possibly other (maintainers) that Mattt gives his blessing to do so.&lt;/p&gt;

&lt;p&gt;The solution? An automated web-service and a database of registered &amp;#39;owners&amp;#39; with an ACL layer that only allows designated people to release new versions.&lt;/p&gt;

&lt;h2 id=&quot;trunk&quot;&gt;‘Trunk’, our solution&lt;/h2&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/trunk/cocoapods-trunk-image.jpg &#39;&gt;&lt;img  src=&#39;/assets/blog_img/trunk/cocoapods-trunk-image.jpg &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cocoa Pods in varying levels of ripeness growing on the trunk of a tree.&lt;/em&gt; – &lt;a href=&quot;http://en.wikipedia.org/wiki/Cocoa_production_in_Ivory_Coast&quot;&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today we are launching our web-service to remedy the aforementioned problems. The introduction of the ‘Trunk’ web-service means that publishers can now publish Pods directly from the command-line, &lt;em&gt;without&lt;/em&gt; the need to create a pull-request.&lt;/p&gt;

&lt;p&gt;The first person to publish a pod automatically gets designated as the ‘owner’ of that pod name in the scope of the ‘master’ spec-repo. The ‘owner’ can then add other ‘owners’ as they see fit. Only ‘owners’ are allowed to publish subsequent versions of said pod. For more information on this and interacting with ‘Trunk’ in general, see &lt;a href=&quot;http://guides.cocoapods.org/making/getting-setup-with-trunk&quot;&gt;this guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Note that we are still hosting the canonical database of available Pods and their specifications in &lt;a href=&quot;https://github.com/CocoaPods/Specs&quot;&gt;the same git repo on GitHub&lt;/a&gt;. This means that if something were to affect the uptime/stability of this database, our users can rely on GitHub’s professional and 24/7 support. Thus, if ‘Trunk’ were to go down, for whatever reason, our normal users are not affected and only ‘owners’ will be unable to publish new Pods during that time-frame. All in all, this means better stability for &lt;em&gt;you&lt;/em&gt;, our users, and less stress on &lt;em&gt;us&lt;/em&gt;, the volunteers. A simple overview of our architecture is shown in the following diagram:&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/trunk/architecture-diagram.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/trunk/architecture-diagram.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;With regards to ensuring that a podspec works properly, &lt;em&gt;you&lt;/em&gt;, the ‘owner’, and &lt;em&gt;only&lt;/em&gt; you are responsible for a podspec working properly. We only validate your podspec on our end for the bare-minimum meta-data that we need to be able to register your podspec. We will &lt;strong&gt;no&lt;/strong&gt; longer validate your podspec for you on Travis. And we will &lt;strong&gt;not&lt;/strong&gt; accept updates to published podspecs without a rigorous review process that is to be performed through a pull-request on the ‘master’ spec-repo. Thus, it is &lt;em&gt;highly&lt;/em&gt; recommended that you test your podspec in your own real applications and/or demo applications &lt;em&gt;before&lt;/em&gt; you publish a podspec.&lt;/p&gt;

&lt;p&gt;Finally, the ‘Trunk’ web-service will no longer store the podspecs in the Ruby format. Instead these will be stored as JSON and thus will directly be usable by people wanting to create other web-services around the CocoaPods ecosystem.&lt;/p&gt;

&lt;h2 id=&quot;transition&quot;&gt;Transition&lt;/h2&gt;

&lt;p&gt;While we transition to the ‘Trunk’ web-service, we will have a grace-period during which all the currently known Pods can be claimed by their respective ‘owners’. During this period &lt;code&gt;pod trunk push&lt;/code&gt; will be &lt;strong&gt;disabled&lt;/strong&gt;, until we are satisfied that the majority of the (important) Pods are claimed. Please read Keith’s &lt;a href=&quot;http://blog.cocoapods.org/Claim-Your-Pods/&quot;&gt;blog post on this topic&lt;/a&gt; for more information on claiming your Pods.&lt;/p&gt;

&lt;h2 id=&quot;frequently-asked-questions&quot;&gt;Frequently Asked Questions&lt;/h2&gt;

&lt;h3 id=&quot;i-m-getting-a-push-access-is-currently-disabled-message-what-s-wrong&quot;&gt;I’m getting a &amp;quot;[!] Push access is currently disabled.&amp;quot; message, what’s wrong?&lt;/h3&gt;

&lt;p&gt;During the claims period, &lt;code&gt;pod trunk push&lt;/code&gt; will be disabled. Please see the ‘&lt;a href=&quot;#transition&quot;&gt;Transition&lt;/a&gt;’ section.&lt;/p&gt;

&lt;h3 id=&quot;will-i-still-be-able-to-make-modifications-to-a-published-podspec&quot;&gt;Will I still be able to make modifications to a published podspec?&lt;/h3&gt;

&lt;p&gt;Once a podspec for a specific version of a pod is published, you won&amp;#39;t be able to modify it. At least not in an automated fashion.
The majority of update requests are a results of contributors not sufficiently testing their podspec beforehand.
Generally what you want to do is to publish a &lt;strong&gt;new version&lt;/strong&gt; for a pod, not edit an already published version in-place.&lt;/p&gt;

&lt;p&gt;However, if you really fall into some exceptional case and really have to modify an already published podspec for a given version, you may still create a pull-request against the ‘master’ spec-repo; but we will not necessarily accept it and we do not offer any guarantees on turn-around time.&lt;/p&gt;

&lt;h3 id=&quot;how-can-i-distinguish-the-format-of-a-podspec&quot;&gt;How can I distinguish the format of a podspec.&lt;/h3&gt;

&lt;p&gt;Podspecs using the Ruby DSL will use the &lt;code&gt;.podspec&lt;/code&gt; extension, JSON based
podspecs will use &lt;code&gt;.podspec.json&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;will-the-specs-in-the-ruby-format-be-deprecated&quot;&gt;Will the specs in the Ruby format be deprecated?&lt;/h3&gt;

&lt;p&gt;No, they are here to stay and are the preferred method if you need to be able to perform automatic generation, such as collecting a list of all the source files from disk. The &lt;code&gt;pod trunk push&lt;/code&gt; command will take care of converting the podspec to JSON. This means that you do &lt;em&gt;not&lt;/em&gt; have to change any existing podspecs.&lt;/p&gt;

&lt;h3 id=&quot;will-private-repositories-need-to-adopt-the-json-format&quot;&gt;Will private repositories need to adopt the JSON format?&lt;/h3&gt;

&lt;p&gt;No. Moreover, the &lt;code&gt;pod push&lt;/code&gt; command will keep the old behaviour, except that we are moving this into &lt;code&gt;pod repo push&lt;/code&gt; to emphasise the distinction.
Just keep in mind that if two files are available CocoaPods will prefer the JSON format.&lt;/p&gt;

&lt;h3 id=&quot;can-i-access-the-specs-via-http&quot;&gt;Can I access the specs via HTTP?&lt;/h3&gt;

&lt;p&gt;Yes, you can use the following endpoints of the GitHub API. At a later point we will introduce a public API on ‘Trunk’ that you can use to standardise this, although it should be noted that if you do not need more than what the GitHub API already offers, it’s best to just use that, as GitHub will be able to offer better uptimes than we can.&lt;/p&gt;

&lt;p&gt;To the get the list of the available Pods:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;https://api.github.com/repos/CocoaPods/Specs/contents/Specs
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;To the get the available versions of a Pod:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;https://api.github.com/repos/CocoaPods/Specs/contents/Specs/ObjectiveSugar
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;To fetch the podspec of a version of a Pod:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;https://api.github.com/repos/CocoaPods/Specs/contents/Specs/ObjectiveSugar/0.9/ObjectiveSugar.podspec.json
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;</description>
    <pubDate>Tue, 20 May 2014 15:37:00 +0100</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-Trunk</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-Trunk</guid>
  </item>
  
  
  
  <item>
    <title>Cocoa Kucha 4 - San Francisco - 28th May 2014</title>
    <description>&lt;p&gt;&lt;a href=&quot;https://twitter.com/orta&quot;&gt;Orta&lt;/a&gt; has been kind enough to organise yet another
Cocoa Kucha. This time he&amp;#39;s pulled together an awesome collection of talented
people based in San Francisco, along with a couple of visitors down for WWDC.
Cocoa Kucha 4 is generously hosted by &lt;a href=&quot;http://www.hipbyte.com&quot;&gt;HipByte&lt;/a&gt; after
their RubyMotion &lt;a href=&quot;http://www.rubymotion.com/conference/2014/&quot;&gt;#inspect conference&lt;/a&gt;,
which is just days before WWDC kicks-off.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Like with the other Kuchas, this meetup is in the style of &lt;a href=&quot;http://www.pechakucha.org/faq&quot;&gt;Pecha
Kucha&lt;/a&gt; where there are 8 speakers doing short
talks related to Objective-C for 6 minutes and 20 seconds. The speaker must go
though 20 slides, 20 seconds per slide. This keeps them to the point and makes
it a lot easier for people to get started.&lt;/p&gt;

&lt;h3 id=&quot;speakers&quot;&gt;Speakers&lt;/h3&gt;

&lt;p&gt;I&amp;#39;m excited to share the list of speakers, which includes five members of the
CocoaPods dev team:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/andyarvanitis&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;Andy Arvanitis&quot;&gt;&lt;/a&gt;
Andy Arvanitis - &lt;a href=&quot;https://twitter.com/andyarvanitis&quot;&gt;@andyarvanitis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kattrali&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;Delisa Mason&quot;&gt;&lt;/a&gt;
Delisa Mason - &lt;a href=&quot;https://twitter.com/kattrali&quot;&gt;@kattrali&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kylef&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;Kyle Fuller&quot;&gt;&lt;/a&gt;
Kyle Fuller - &lt;a href=&quot;https://twitter.com/kylefuller&quot;&gt;@kylefuller&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/speednoisemovement&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;Leonard Grey&quot;&gt;&lt;/a&gt;
Leonard Grey - &lt;a href=&quot;https://twitter.com/speednoise&quot;&gt;@speednoise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/supermarin&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;Marin Usalj&quot;&gt;&lt;/a&gt;
Marin Usalj - &lt;a href=&quot;https://twitter.com/_supermarin&quot;&gt;@_supermarin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mtitolo&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;Michele Titolo&quot;&gt;&lt;/a&gt;
Michele Titolo - &lt;a href=&quot;https://twitter.com/micheletitolo&quot;&gt;@micheletitolo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rebecca Goldman - &lt;a href=&quot;https://twitter.com/RebeccaGoldman&quot;&gt;@RebeccaGoldman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/soffes&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;Sam Soffes&quot;&gt;&lt;/a&gt;
Sam Soffes - &lt;a href=&quot;https://twitter.com/soffes&quot;&gt;@soffes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alloy&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;Eloy Durán&quot;&gt;&lt;/a&gt;
Eloy Durán - &lt;a href=&quot;https://twitter.com/alloy&quot;&gt;@alloy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The event is hosted at &lt;a href=&quot;http://www.rubymotion.com/conference/2014/#Location&quot;&gt;Fort Mason&lt;/a&gt;
after the first day of the #inspect conference. Join our &lt;a href=&quot;http://www.meetup.com/CocoaPods-SF/&quot;&gt;meetup&lt;/a&gt; group and &lt;a href=&quot;http://www.meetup.com/CocoaPods-SF/events/180676392/&quot; data-event=&quot;180676392&quot; class=&quot;mu-rsvp-btn&quot;&gt;RSVP&lt;/a&gt; online.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://cocoapods.org/legal&quot;&gt;Code of Conduct&lt;/a&gt;&lt;/p&gt;

&lt;script&gt;!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s); js.id=id;js.async=true;js.src=&quot;https://secure.meetup.com/script/21021123101537681383/api/mu.btns.js?id=a74a4o9ar6ca0btqqmtk1k5uv2&quot;;fjs.parentNode.insertBefore(js,fjs);}}(document,&quot;script&quot;,&quot;mu-bootjs&quot;);&lt;/script&gt;
</description>
    <pubDate>Fri, 02 May 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Cocoa-Kucha-4</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Cocoa-Kucha-4</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 3rd WWDC Meetup: 2nd June 2014</title>
    <description>&lt;p&gt;Apple have their developers state of the union address. We have ours. We&amp;#39;re working with the &lt;a href=&quot;http://www.altconf.com&quot;&gt;Alt Conference&lt;/a&gt; to have a great opening event to the WWDC week: The CocoaPodsAlt State of the Union. You should come along.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;&lt;a href=&quot;http://cocoapods.org&quot;&gt;CocoaPods&lt;/a&gt; is a dependency manager for Objective-C, it makes it very easy for people to use open source code or to share code between multiple apps elegantly. It&amp;#39;s become an annual tradition now for CocoaPods to host &lt;a href=&quot;http://www.eventbrite.com/e/cocoapods-2nd-annual-wwdc-meetup-tickets-6887230893&quot;&gt;an event&lt;/a&gt; at WWDC, we want to make this another great one. &lt;/p&gt;

&lt;iframe style=&quot;margin-left:32px;float:right; display:inline-block;&quot; width=&quot;225&quot; height=&quot;570&quot; src=&quot;http://meetu.ps/2jKYMx&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;There will be a keynote by &lt;a href=&quot;http://orta.github.io&quot;&gt;Orta Therox&lt;/a&gt; with both &lt;a href=&quot;https://twitter.com/alloy&quot;&gt;Eloy Durán&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/fabiopelosin&quot;&gt;Fabio Pelosin&lt;/a&gt; skyping in to assist. We will go through some of the large changes that are happening behind the scenes in CocoaPods, show-off some new things and talk about future plans.&lt;/p&gt;

&lt;p&gt;We will also have a large contingent of the CocoaPods dev team giving some talks on some of the work they&amp;#39;ve been doing around the community:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://buegling.com&quot;&gt;Boris Bügling&lt;/a&gt; - On learning Ruby by &lt;a href=&quot;https://github.com/CocoaPods/Core/commits?author=neonichu&quot;&gt;contributing&lt;/a&gt; &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/commits?author=neonichu&quot;&gt;to&lt;/a&gt; CocoaPods.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://supermar.in&quot;&gt;Marin Usalj&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://michele.io&quot;&gt;Michele Titolo&lt;/a&gt; - On Private Pods&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://kylefuller.co.uk&quot;&gt;Kyle Fuller&lt;/a&gt; - Creating your first Pod&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We were planning on hosting it at 7:00pm and should be over by around 10:00pm, this should give everyone chance to then move on to some of the late night parties that will be happening around San Francisco.
The meetup will be hosted at the &lt;a href=&quot;https://www.twilio.com/&quot;&gt;Twilio&lt;/a&gt; offices, who are just a short walk away from the Moscone Center. They will be graciously providing both food &amp;amp; beer.&lt;/p&gt;

&lt;p&gt;Join our &lt;a href=&quot;http://www.meetup.com/CocoaPods-SF/&quot;&gt;meetup&lt;/a&gt; group and &lt;a href=&quot;http://www.meetup.com/CocoaPods-SF/events/177557362/&quot; data-event=&quot;177557362&quot; class=&quot;mu-rsvp-btn&quot;&gt;RSVP&lt;/a&gt; online.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://cocoapods.org/legal&quot;&gt;Code of Conduct&lt;/a&gt;&lt;/p&gt;

&lt;script&gt;!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s); js.id=id;js.async=true;js.src=&quot;https://secure.meetup.com/script/21021123101537681383/api/mu.btns.js?id=a74a4o9ar6ca0btqqmtk1k5uv2&quot;;fjs.parentNode.insertBefore(js,fjs);}}(document,&quot;script&quot;,&quot;mu-bootjs&quot;);&lt;/script&gt;
</description>
    <pubDate>Mon, 21 Apr 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-WWDC-Party</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-WWDC-Party</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 0.32</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;CocoaPod 0.32 is here! It brings a vastly improved &lt;code&gt;update&lt;/code&gt;
command and a galore of improvements. Including the ability to deprecate pods.&lt;/em&gt;&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h2 id=&quot;update-command-improvements&quot;&gt;Update Command Improvements&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/mrackwitz&quot;&gt;Marius Rackwitz&lt;/a&gt; just added one of the most
requested CocoaPods features:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;pod repo update NAME
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Exactly. Now you can scope your update to &lt;em&gt;only one&lt;/em&gt; Pod.&lt;/p&gt;

&lt;p&gt;This is not the only improvement to the update command, as &lt;a href=&quot;https://github.com/andreamazz&quot;&gt;Andrea
Mazzini&lt;/a&gt; also took care of polishing the
experience by adding to the installation output the version from which a Pod is
being updated.&lt;/p&gt;

&lt;h2 id=&quot;development-pods&quot;&gt;Development Pods&lt;/h2&gt;

&lt;p&gt;Now the file references in Xcode are absolute or relative depending on how they
are specified in the Podfile. This feature was implemented by &lt;a href=&quot;https://github.com/samuelwford&quot;&gt;Samuel
Ford&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;deprecations&quot;&gt;Deprecations&lt;/h2&gt;

&lt;p&gt;Another feature that we&amp;#39;ve received a lot of requests for is Pod deprecation.
Thanks to the work of &lt;a href=&quot;https://github.com/paulyoung&quot;&gt;Paul Young&lt;/a&gt; this feature
is already supported at the DSL level.&lt;/p&gt;

&lt;p&gt;You can either specify whether a Pod is just deprecated:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;spec.deprecated = true
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Or whether it has been deprecated &lt;em&gt;in favor of another&lt;/em&gt; Pod:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;spec.deprecated_in_favor_of = &amp;#39;NewMoreAwesomePod&amp;#39;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Unfortunately CocoaPods doesn’t display this information yet, but the super
prolific &lt;a href=&quot;https://github.com/segiddins&quot;&gt;Samuel E. Giddins&lt;/a&gt; is &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/pull/2044&quot;&gt;already on
it&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;linter&quot;&gt;Linter&lt;/h2&gt;

&lt;p&gt;The linter has seen a lot of activity and now is more aggressive than ever.
Expect some great linting on the new Pods. Now it even checks the validity of
screenshots.&lt;/p&gt;

&lt;h2 id=&quot;updated-cocoapods-feed&quot;&gt;Updated CocoaPods Feed&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://feeds.cocoapods.org&quot;&gt;feeds.cocoapods.org&lt;/a&gt; now shows the latest new
CocoaPods libraries  released in the last few days. Consider it an alternative
to the &lt;a href=&quot;http://twitter.com/cocoapodsfeed&quot;&gt;@CocoaPodsFeed&lt;/a&gt; twitter feed.&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;a href=&quot;http://feeds.cocoapods.org&quot;&gt;
&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/CocoaPods-0.32/feeds_1.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/CocoaPods-0.32/feeds_1.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;And off course we display the beautiful screenshots of the Pods (including
gifs):&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;a href=&quot;http://feeds.cocoapods.org&quot;&gt;
&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/CocoaPods-0.32/feeds_2.gif &#39;&gt;&lt;img  src=&#39;/assets/blog_img/CocoaPods-0.32/feeds_2.gif &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;

&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;/h2&gt;

&lt;p&gt;To install the last release of CocoaPods you can run:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;$ [sudo] gem install cocoapods
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Until version 1.0 we strongly encourage you to keep CocoaPods up-to-date.&lt;/p&gt;

&lt;p&gt;For all the details, don’t miss the
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/blob/master/CHANGELOG.md&quot;&gt;Changelog&lt;/a&gt;.&lt;/p&gt;
</description>
    <pubDate>Tue, 15 Apr 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-0.32</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-0.32</guid>
  </item>
  
  
  
  <item>
    <title>AppIe Acquires CocoaPods</title>
    <description>&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; We hope you enjoyed our April Fools’ day prank! We are still an independent open-source project and fully committed to you, our users. In case it wasn’t completely clear to you, you &lt;em&gt;may&lt;/em&gt; have thought that this post mentions a big well-known technology company, however, it in fact mentions ‘Appie’, which –with our sans-serif font– looks different when spelled with a capital ‘I’ ;) &lt;a href=&quot;https://twitter.com/AppieDuran/status/450975104395390976/photo/1&quot;&gt;Appie&lt;/a&gt; is Eloy’s dog, we are not sure whether or not this prank was planned years ahead…&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;Big news, everybody! AppIe* has finally acquired CocoaPods.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;After several months of discussions and meetings we are proud to finally be able to announce big news:
CocoaPods has been acquired by AppIe for US$ 20 Million on the 1st of April, today.&lt;/p&gt;

&lt;h2 id=&quot;cocoapods-appie&quot;&gt;CocoaPods @ AppIe&lt;/h2&gt;

&lt;p&gt;With one exception (see below), the existing CocoaPods Core Team will move to the AppIe Campus.
We can&amp;#39;t describe how excited we are to continue to improve giving you the best in pod-based dependency handling under AppIe&amp;#39;s fold.&lt;/p&gt;

&lt;p&gt;CocoaPods will become an extension to Xcode.
For just $4.99 you get access to over 3000 existing pods, and this is a one-time purchase, valid forever.&lt;/p&gt;

&lt;h3 id=&quot;what-this-means-for-you&quot;&gt;What this means for you&lt;/h3&gt;

&lt;p&gt;We anticipate not everybody agreeing with our course of action.
So here&amp;#39;s what this move means for you, our most appreciated pod writers.&lt;/p&gt;

&lt;p&gt;Existing pod owners will be remunerated via one of our generous plans: Bean, Pod, or Plantation (details on the sizes will follow).
If you do not feel happy with one of our plans, please contact us privately, and we will be able to work out a deal that will benefit all parties.&lt;/p&gt;

&lt;h3 id=&quot;future-developments&quot;&gt;Future Developments&lt;/h3&gt;

&lt;p&gt;We have several exciting plans for the future:
Each pod will be able to charge a price and also offer in-pod purchases.
It will also be possible to remotely remove a faulty pod from a client.
We feel that this will enhance security and usability for our clients.
Initially, we will charge a price for each uploaded version, but we are aiming to remove this by the middle of 2014.&lt;/p&gt;

&lt;h3 id=&quot;eloy-dur-n&quot;&gt;Eloy Durán&lt;/h3&gt;

&lt;p&gt;Sadly, we have to add a bitter drop to this otherwise sweet nectar.
While the CocoaPods core team stood as one behind this decision, founder Eloy Durán could not be persuaded to stay on board and was convinced to leave the OSS group he had founded, even after we offered him a generous severance package (in his own words): &amp;quot;Please accept this free license for life for CocoaPods.&amp;quot;&lt;/p&gt;

&lt;p&gt;We regret his decision but wish him all the best and good luck in future endeavours.
We also hope that he can somehow support his idealistic lifestyle despite not recognizing great financial opportunities.&lt;/p&gt;

&lt;p&gt;Update: &lt;a href=&quot;http://www.rubymotion.com/&quot;&gt;RubyMotion&lt;/a&gt; has just announced Eloy&amp;#39;s real reasons to leave CocoaPods. Read more about it in &lt;a href=&quot;https://twitter.com/RubyMotion/status/450955155551555584&quot;&gt;their tweet&lt;/a&gt;. We hope his boat will survive the move!&lt;/p&gt;

&lt;h3 id=&quot;see-you-soon&quot;&gt;See you soon&lt;/h3&gt;

&lt;p&gt;The CocoaPods Core Team will be taking a few weeks off in Hawaii as part of this deal.
See you on soon on an Xcode near you!&lt;/p&gt;

&lt;p&gt;*Here&amp;#39;s &lt;a href=&quot;https://twitter.com/AppieDuran/status/450975104395390976/photo/1&quot;&gt;a company portrait of AppIe&lt;/a&gt;.&lt;/p&gt;
</description>
    <pubDate>Tue, 01 Apr 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Big-News</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Big-News</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 0.31</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;The bug bash has been a massive success: all the tickets have been triaged at least once, almost 80 were closed, with 16 Pull Requests sent to fix or enhance CocoaPods. The result? CocoaPods 0.31!&lt;/em&gt;&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h2 id=&quot;the-cocoapods-bug-bash&quot;&gt;The CocoaPods Bug Bash&lt;/h2&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;  4 meetups world wide, 
  33 people, 
  16 pull requests, 
  6  claimed issues still being worked on, 
  86 issues confirmed as existing, 
  55 closed issues, and a total of 428 triage actions by participants.
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;We managed to raise the number of participants in the &lt;a href=&quot;http://cocoapods.org/about&quot;&gt;CocoaPods dev tools&lt;/a&gt; to over 170 contributors. With the top contributor &lt;a href=&quot;https://github.com/neonichu&quot;&gt;Neonichu&lt;/a&gt; submitting 9 PRs, and still finding time to contribute to other projects during the weekend. Mind-blowing.&lt;/p&gt;

&lt;h2 id=&quot;things-new-to-cocoapods&quot;&gt;Things new to CocoaPods&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/lrz&quot;&gt;Laurent Sansonetti&lt;/a&gt; Ordered the output of pods correctly when versions went over two digits in the &lt;code&gt;pod spec&lt;/code&gt; commands.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/dlackty&quot;&gt;Richard Lee&lt;/a&gt; made linter checks if your homepage works so you won&amp;#39;t accidentally link to the wrong place, on top of that he made sure that when running &lt;code&gt;pod install&lt;/code&gt; on Travis CI it runs with the right shell encoding.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/z00b&quot;&gt;Robert Zuber&lt;/a&gt; wrapped up &lt;a href=&quot;https://github.com/StefanDamm&quot;&gt;Stefan Damm&lt;/a&gt;&amp;#39;s PR to include the versions of the Pods to the output of &lt;code&gt;pod list&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/apalancat&quot;&gt;Marc Boquet&lt;/a&gt; Unset the &lt;code&gt;CDPATH&lt;/code&gt; env variable before shelling-out to &lt;code&gt;prepare_command&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;the-most-important-fix&quot;&gt;The most important fix&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Resolve crash related to the I18n deprecation warning.&lt;br&gt;
&lt;a href=&quot;https://github.com/alloy&quot;&gt;Eloy Durán&lt;/a&gt;
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/1950&quot;&gt;#1950&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For all the other fixes, check the &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/blob/master/CHANGELOG.md&quot;&gt;Changelog&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;/h2&gt;

&lt;p&gt;To install the last release of CocoaPods you can run:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;$ [sudo] gem install cocoapods
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Until version 1.0 we strongly encourage you to keep CocoaPods up to date.&lt;/p&gt;

&lt;p&gt;For all the details, don&amp;#39;t miss the
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/blob/master/CHANGELOG.md&quot;&gt;Changelog&lt;/a&gt;.&lt;/p&gt;
</description>
    <pubDate>Mon, 31 Mar 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-0.31</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-0.31</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 0.30</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;CocoaPods 0.30 dramatically reduces setup time &amp;amp; download size, introduces compatibility adjustments for Xcode 5.1 and the Rainforest!&lt;/em&gt;&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h2 id=&quot;smarter-setup&quot;&gt;Smarter Setup&lt;/h2&gt;

&lt;p&gt;Sometimes the small changes have the biggest impact. Folks with slow interwebs, rejoice! Because this &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/pull/1803/files#diff-5b25375a43a40f866bc3d26e7227d581L37&quot;&gt;patch&lt;/a&gt; contributed by &lt;a href=&quot;https://github.com/jverkoey&quot;&gt;Jeff Verkoeyen&lt;/a&gt; will prevent the download of the history of the master repo during setup and consequently will dramatically reduce the download size (from &lt;code&gt;&amp;gt;200MB&lt;/code&gt; to roughly &lt;code&gt;3.5MB&lt;/code&gt;). Nippy.&lt;/p&gt;

&lt;h2 id=&quot;xcode-5-1&quot;&gt;Xcode 5.1&lt;/h2&gt;

&lt;p&gt;Finally we can say bye bye (at least until the next update of Xcode) to that pesky warning about updating the build settings of the Pods thanks to &lt;a href=&quot;https://github.com/coverback&quot;&gt;Romans Karpelcevs&lt;/a&gt;. Additionally, the file references of frameworks have been fixed to work on Xcode 5.1.&lt;/p&gt;

&lt;h2 id=&quot;rainforest&quot;&gt;Rainforest&lt;/h2&gt;

&lt;p&gt;If you are a CocoaPods contributor or if you plan to hack on it, this new repo will definitely interest you. Rainforest is the home of CocoaPods development and makes setup of the CocoaPods dependencies as it should have always been: super simple!&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;$ git clone https://github.com/CocoaPods/Rainforest.git
$ cd Rainforest
$ rake bootstrap
$ rake local_dependencies_set
$ CocoaPods/bin/pod --version
0.30.0
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;And now lets experiment with some real hacking:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;$ sed -i &amp;#39;&amp;#39; &amp;#39;s/UI.puts VERSION/UI.puts &amp;quot;#{VERSION} Hacked!&amp;quot;/&amp;#39; CocoaPods/lib/cocoapods/command.rb
$ CocoaPods/bin/pod --version
0.30.0 Hacked!
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Whoah!&lt;/p&gt;

&lt;h2 id=&quot;other-improvements&quot;&gt;Other Improvements&lt;/h2&gt;

&lt;p&gt;This release is decorated with minor touches all around the way, from word wrapping help banners to the terminal width to saving in the Podfile the name of the project in &lt;code&gt;pod init&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/lazerwalker&quot;&gt;Mike Walker&lt;/a&gt; improved robustness against spaces and quotes in paths.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/banjun&quot;&gt;banjun&lt;/a&gt; added support to ignore SVN externals.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kylef&quot;&gt;Kyle Fuller&lt;/a&gt; added support for the &lt;code&gt;docset_url&lt;/code&gt; attribute.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/pietbrauer&quot;&gt;Piet Brauer&lt;/a&gt; added the support for the specification of a template URL for the pod lib create command.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/carsonmcdonald&quot;&gt;Carson McDonald&lt;/a&gt; had been on fire and added a bunch of missing tests – let me sneak in a personal thanks to him – to CocoaPods.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;/h2&gt;

&lt;p&gt;To install the last release of CocoaPods you can run:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;$ [sudo] gem install cocoapods
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Until version 1.0 we strongly encourage you to keep CocoaPods up to date.&lt;/p&gt;

&lt;p&gt;For all the details, don&amp;#39;t miss the
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/blob/master/CHANGELOG.md&quot;&gt;Changelog&lt;/a&gt;.&lt;/p&gt;
</description>
    <pubDate>Sat, 29 Mar 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-0.30</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-0.30</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods Bug Bash</title>
    <description>&lt;p&gt;With the announcement that Fabio will be &lt;a href=&quot;/SoundCloud/&quot;&gt;working full time on CocoaPods&lt;/a&gt; (thanks &lt;a href=&quot;https://soundcloud.com/&quot;&gt;SoundCloud!&lt;/a&gt;) for three months, we looked for ways to get the most bang for our buck on his time. In true Open Source style we looked at ways of getting people to help out cleaning out the GitHub issues. &lt;/p&gt;

&lt;p&gt;We then looked for interesting incentives, and we have some compelling icing on the proverbial cake.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h2 id=&quot;the-plan&quot;&gt;The Plan&lt;/h2&gt;

&lt;p&gt;We want to clean up our issues, remove duplicates, improve the writing and make them easily reproducible. &lt;/p&gt;

&lt;p&gt;Fixing issues themselves would be lovely, but it&amp;#39;s not the focus. This means you don&amp;#39;t have to know a lot of ruby, but more apply general debugging skills to the problem.&lt;/p&gt;

&lt;h3 id=&quot;how-will-it-work&quot;&gt;How will it work?&lt;/h3&gt;

&lt;p&gt;On the last weekend of March, the 29th / 30th &lt;a href=&quot;http://cocoapods.org/about&quot;&gt;we&lt;/a&gt; will be in the CocoaPods IRC channel ( &lt;a href=&quot;irc://chat.freenode.net#cocoapods&quot;&gt;chat.freenode.net#cocoapods&lt;/a&gt; ) offering help to people. There will be an IRC bot that will assign people random CocoaPods GitHub issues when they request them, they then can triage it. We will then generate a leaderboard from the number of issues dealt with and give out some prizes at the end. This is a great opportunity to give back to the CocoaPods project and to say hi to the authors and other Objective-C developers in the chat room.&lt;/p&gt;

&lt;h3 id=&quot;you-mentioned-prizes&quot;&gt;You mentioned prizes?&lt;/h3&gt;

&lt;p&gt;Well, we reached out to some of the great indie dev tool makers - tools I use everyday - asking if they would be kind enough to donate a license or two. We&amp;#39;ll be able to give out licenses for the top contributors for the following apps: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.jetbrains.com/objc&quot;&gt;AppCode&lt;/a&gt; - The alternative Objective-C IDE.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://neat.io/bee/&quot;&gt;Bee&lt;/a&gt; - Mac issue tracker supporting GitHub Issues, FogBugz and JIRA.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://kapeli.com/dash&quot;&gt;Dash&lt;/a&gt; - Instantly access developer documentation.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.helloresolven.com/portfolio/gifbrewery&quot;&gt;GIFBrewery&lt;/a&gt; - The best tool for converting MP4 to .gif.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://revealapp.com&quot;&gt;Reveal&lt;/a&gt; - The best way to explore the iOS view hierarchy.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.rubymotion.com&quot;&gt;RubyMotion&lt;/a&gt; - An awesome toolchain that lets you quickly develop and test iOS and OS X using Ruby.&lt;/li&gt;
&lt;/ul&gt;
</description>
    <pubDate>Fri, 14 Mar 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-Bug-Bash</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-Bug-Bash</guid>
  </item>
  
  
  
  <item>
    <title>Guides and Blog Deploys with Travis-CI</title>
    <description>&lt;p&gt;TL;DR Both the Guides and Blog now auto-deploy when we push to master.&lt;/p&gt;

&lt;p&gt;We are always looking for ways to make contributing to CocoaPods easier, and a quick win for us is auto-deploying the guides and blog. Now any member of the team can accept a PR, and Travis will deploy the changes within minutes.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h2 id=&quot;scripts&quot;&gt;Scripts&lt;/h2&gt;

&lt;p&gt;Travis needs instructions on how to build this code. While you can add all of those commands to the Travis config directly, that is difficult to debug and removes the ability to manually setup and deploy.&lt;/p&gt;

&lt;p&gt;Every CocoaPods repository has a &lt;code&gt;rake bootstrap&lt;/code&gt; command to ensure the environment is setup, and every site has a &lt;code&gt;rake deploy&lt;/code&gt; command. Taking the time to set these up in the past made it incredibly easy to integrate this process with Travis.&lt;/p&gt;

&lt;h2 id=&quot;pushing-to-github-pages-with-travis&quot;&gt;Pushing to Github Pages with Travis&lt;/h2&gt;

&lt;p&gt;Setting up these two repositories to push to Github pages was pretty trivial, once I figured out the correct steps.&lt;/p&gt;

&lt;h3 id=&quot;1-travis-needs-to-be-a-user&quot;&gt;1. Travis needs to be a user&lt;/h3&gt;

&lt;p&gt;Since Travis needs to push to Github, it needs a user. Pick or create a user, and get a Personal Access Token. This token is generated in Account Settings on Github. We chose to use the &lt;a href=&quot;https://github.com/CocoaPodsBot&quot;&gt;CocoaPods Bot&lt;/a&gt; account. &lt;/p&gt;

&lt;h3 id=&quot;2-authenticate-with-that-user&quot;&gt;2. Authenticate with that user&lt;/h3&gt;

&lt;p&gt;In order to identify as this user, Travis needs credentials. I chose to encrypt the user information using the  &lt;code&gt;travis&lt;/code&gt; gem. I ran the command below from within the project directory with the &lt;code&gt;add&lt;/code&gt; flag so it automatically adds the encrypted output to the &lt;code&gt;.travis.yml&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;travis encrypt &amp;#39;GIT_NAME=&amp;quot;Account Name&amp;quot; GIT_EMAIL=example@example.com GH_TOKEN=SOMEREALLYLONGSTRING&amp;#39; --add
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h3 id=&quot;3-setup-and-deploy&quot;&gt;3. Setup and Deploy&lt;/h3&gt;

&lt;p&gt;Travis build on a completely fresh checkout, so setting up the environment is key. Thankfully both sites had the &lt;code&gt;rake bootstrap&lt;/code&gt; command, so I was able to reuse that.&lt;/p&gt;

&lt;p&gt;The deploy script turned out to be the tricky part. The important step here is to make sure the deploy script relies upon the &lt;code&gt;git remote&lt;/code&gt; that&amp;#39;s setup. All of our static sites have a &lt;code&gt;rake deploy&lt;/code&gt; command, which I modified to remove the hardcoding of the remote.&lt;/p&gt;

&lt;h3 id=&quot;4-travis-yml&quot;&gt;4. travis.yml&lt;/h3&gt;

&lt;p&gt;Configure git settings in &lt;code&gt;.travis.yml&lt;/code&gt;. By default, Travis doesn&amp;#39;t have a user, so you should set the &lt;code&gt;user.email&lt;/code&gt; and &lt;code&gt;user.name&lt;/code&gt; to push with. These should match the credentials you encrypted with the token.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;install:
- git config --global user.email &amp;quot;bots@cocoapods.org&amp;quot;
- git config --global user.name &amp;quot;CocoaPods Bot&amp;quot;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h3 id=&quot;5-updating-the-remote&quot;&gt;5. Updating the remote&lt;/h3&gt;

&lt;p&gt;In this setup, Travis doesn&amp;#39;t have ssh access to the repository. Change the &lt;code&gt;git remote&lt;/code&gt; to point to &lt;code&gt;https&lt;/code&gt; with your token attached. The token is used to authenticate the push. Here&amp;#39;s what the Blog setup looks like:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;git remote set-url origin &amp;quot;https://${GH_TOKEN}@github.com/CocoaPods/blog.cocoapods.org.git&amp;quot;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h3 id=&quot;6-turn-on-travis-builds&quot;&gt;6. Turn on Travis builds&lt;/h3&gt;

&lt;p&gt;This is done from Settings. Also, since this is a deploying build, make sure that you &lt;em&gt;do not&lt;/em&gt; build when pull requests are made.&lt;/p&gt;

&lt;h3 id=&quot;7-commit-and-push-your-changes&quot;&gt;7. Commit and push your changes.&lt;/h3&gt;

&lt;p&gt;Hopefully everything will work. If not, you can make more changes, push, and wait for Travis to build.&lt;/p&gt;

&lt;h5 id=&quot;the-travis-yml&quot;&gt;The .travis.yml&lt;/h5&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;language: ruby
branches:
  only:
  - master
rvm:
- 2.0.0
install:
- git config --global user.email &amp;quot;bots@cocoapods.org&amp;quot;
- git config --global user.name &amp;quot;CocoaPods Bot&amp;quot;
- rake bootstrap
script:
- git remote set-url origin &amp;quot;https://${GH_TOKEN}@github.com/CocoaPods/blog.cocoapods.org.git&amp;quot;
- rake deploy
env:
  global:
    secure: XXXX
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h2 id=&quot;in-conclusion&quot;&gt;In Conclusion&lt;/h2&gt;

&lt;p&gt;So that&amp;#39;s how we have our Travis deploys setup now. CocoaPods is a community effort, so lowering the barrier for contributions has been one of our goals. This new setup does just that. Edit away!&lt;/p&gt;
</description>
    <pubDate>Mon, 10 Mar 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Guides-And-Blog-Travis-Deploy</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Guides-And-Blog-Travis-Deploy</guid>
  </item>
  
  
  
  <item>
    <title>SoundCloud Announcement</title>
    <description>&lt;p&gt;Today at the &lt;a href=&quot;http://mdevcon.com&quot;&gt;mdevcon&lt;/a&gt; conference we have been glad to announce that &lt;a href=&quot;https://soundcloud.com&quot;&gt;SoundCloud&lt;/a&gt; in collaboration with the &lt;a href=&quot;http://foundation.travis-ci.org&quot;&gt;Travis Foundation&lt;/a&gt; will sponsor CocoaPods development.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/SoundCloud-Travis/Talk.jpg &#39;&gt;&lt;img  src=&#39;/assets/blog_img/SoundCloud-Travis/Talk.jpg &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;https://twitter.com/Lascorbe&quot;&gt;Luis Ascorbe&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In the words of SoundCloud&amp;#39;s Developer Evangelist &lt;a href=&quot;https://twitter.com/sferik&quot;&gt;Erik Michaels-Ober&lt;/a&gt;: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Our iOS team uses CocoaPods every day to manage the dependencies of our mobile apps. We hope that will lead to improvements that benefit the entire Mac and iOS developer ecosystem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This means that I will be able to work full-time on CocoaPods for 3 months. I&amp;#39;m very excited by this and I plan to release at least one major feature each month. In addition I will take advantage of this great opportunity to iron out minor issues and refactor parts of our core, to ensure a solid basis going forward.&lt;/p&gt;

&lt;p&gt;As requirements always change I won&amp;#39;t go into specifics about them at this moment. However, as work progresses I will keep you up-to-date with blog posts about the specific features. We think you will like them!&lt;/p&gt;

&lt;p&gt;Eloy and I are very thankful to SoundCloud, Travis, and the great people there that share our passion and for helping us to help you.&lt;/p&gt;
</description>
    <pubDate>Sat, 08 Mar 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/SoundCloud</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/SoundCloud</guid>
  </item>
  
  
  
  <item>
    <title>Search API Version 1</title>
    <description>&lt;p&gt;I&amp;#39;m going to break up the doom &amp;amp; gloom around the &lt;a href=&quot;/Repairing-Our-Broken-Specs-Repository/&quot;&gt;Specs Repo change&lt;/a&gt; with some good news. We have opened up v1 of our search API!&lt;/p&gt;

&lt;p&gt;This is the API used in &lt;a href=&quot;http://cocoapods.org&quot;&gt;CocoaPods.org&lt;/a&gt; and soon on &lt;a href=&quot;http://cocoadocs.org&quot;&gt;CocoaDocs&lt;/a&gt;. Read on to find out how to use it in your own applications, I&amp;#39;m really excited to see what people do with it.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h2 id=&quot;api-description&quot;&gt;API Description&lt;/h2&gt;

&lt;h3 id=&quot;pods-endpoint&quot;&gt;Pods Endpoint&lt;/h3&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;http://search.cocoapods.org/api/pods
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h3 id=&quot;query-string-parameters&quot;&gt;Query String Parameters&lt;/h3&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;query:    The query string.
amount:   The number of results requested [Default: 20].
start-at: The offset in the set of results [Default: 0].
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h4 id=&quot;example&quot;&gt;Example&lt;/h4&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;http://search.cocoapods.org/api/pods?query=test&amp;amp;amount=100&amp;amp;start-at=50
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h4 id=&quot;what-query-string-do-i-use&quot;&gt;What query string do I use?&lt;/h4&gt;

&lt;p&gt;The &lt;code&gt;query&lt;/code&gt; string you use is what you type into the search engine on &lt;a href=&quot;http://cocoapods.org&quot;&gt;CocoaPods.org&lt;/a&gt;. In addition, you can filter on either or both platforms by prefixing the query string with &lt;code&gt;on:ios&lt;/code&gt;, &lt;code&gt;on:osx&lt;/code&gt;, or &lt;code&gt;on:ios on:osx&lt;/code&gt; (we hide this behind the four radio buttons).&lt;/p&gt;

&lt;p&gt;For example, if you&amp;#39;d like to only see &amp;quot;test&amp;quot; pods that run on iOS then you prefix the query string with &lt;code&gt;on:ios&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;curl &lt;span class=&quot;s1&quot;&gt;&amp;#39;http://search.cocoapods.org/api/pods?query=on:ios%20test&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h3 id=&quot;formats&quot;&gt;Formats&lt;/h3&gt;

&lt;p&gt;We return 4 different formats, all in JSON:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/floere/picky/wiki/results-format-and-structure&quot;&gt;Picky-style results&lt;/a&gt; with pod data as hashes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/floere/picky/wiki/results-format-and-structure&quot;&gt;Picky-style results&lt;/a&gt; of pod names as string.&lt;/li&gt;
&lt;li&gt;Flat list of results with pod data as hashes.&lt;/li&gt;
&lt;li&gt;Flat list of results of pod names as string.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What format you&amp;#39;d like you need to provide via the Accept header. The 4 options above translate into:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;Accept: application/vnd.cocoapods.org+picky.hash.json; version=1
Accept: application/vnd.cocoapods.org+picky.ids.json; version=1
Accept: application/vnd.cocoapods.org+flat.hash.json; version=1
Accept: application/vnd.cocoapods.org+flat.ids.json; version=1
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h4 id=&quot;defaults&quot;&gt;Defaults&lt;/h4&gt;

&lt;p&gt;You don&amp;#39;t have to provide all the details. For example, providing no version will return the latest version. We recommend that you always provide the version nonetheless.&lt;/p&gt;

&lt;p&gt;See a list of &lt;a href=&quot;https://github.com/CocoaPods/search.cocoapods.org/blob/8908eaaf83a11b3075d36032cb8c5896e37c7366/spec/api/accept_integration_spec.rb#L23-L59&quot;&gt;all specs&lt;/a&gt;. All of these parameters will return a result.&lt;/p&gt;

&lt;p&gt;The default format is Picky-style results with pod information as a hash.&lt;/p&gt;

&lt;h3 id=&quot;examples&quot;&gt;Examples&lt;/h3&gt;

&lt;h4 id=&quot;formats&quot;&gt;Formats&lt;/h4&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;curl &lt;span class=&quot;s1&quot;&gt;&amp;#39;http://search.cocoapods.org/api/pods?query=name:kiwi&amp;#39;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  -H &lt;span class=&quot;s2&quot;&gt;&amp;quot;Accept: application/vnd.cocoapods.org+picky.hash.json; version=1&amp;quot;&lt;/span&gt;

curl &lt;span class=&quot;s1&quot;&gt;&amp;#39;http://search.cocoapods.org/api/pods?query=name:kiwi&amp;#39;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  -H &lt;span class=&quot;s2&quot;&gt;&amp;quot;Accept: application/vnd.cocoapods.org+picky.ids.json; version=1&amp;quot;&lt;/span&gt;

curl &lt;span class=&quot;s1&quot;&gt;&amp;#39;http://search.cocoapods.org/api/pods?query=name:kiwi&amp;#39;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  -H &lt;span class=&quot;s2&quot;&gt;&amp;quot;Accept: application/vnd.cocoapods.org+flat.hash.json; version=1&amp;quot;&lt;/span&gt;

curl &lt;span class=&quot;s1&quot;&gt;&amp;#39;http://search.cocoapods.org/api/pods?query=name:kiwi&amp;#39;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  -H &lt;span class=&quot;s2&quot;&gt;&amp;quot;Accept: application/vnd.cocoapods.org+flat.ids.json; version=1&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h4 id=&quot;query-params&quot;&gt;Query Params&lt;/h4&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;curl &lt;span class=&quot;s1&quot;&gt;&amp;#39;http://search.cocoapods.org/api/pods?query=name:test&amp;#39;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  -H &lt;span class=&quot;s2&quot;&gt;&amp;quot;Accept: application/vnd.cocoapods.org+flat.ids.json&amp;quot;&lt;/span&gt;

curl &lt;span class=&quot;s1&quot;&gt;&amp;#39;http://search.cocoapods.org/api/pods?query=name:test&amp;amp;start-at=3&amp;#39;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  -H &lt;span class=&quot;s2&quot;&gt;&amp;quot;Accept: application/vnd.cocoapods.org+flat.ids.json&amp;quot;&lt;/span&gt;

curl &lt;span class=&quot;s1&quot;&gt;&amp;#39;http://search.cocoapods.org/api/pods?query=s&amp;amp;amount=1000&amp;#39;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  -H &lt;span class=&quot;s2&quot;&gt;&amp;quot;Accept: application/vnd.cocoapods.org+flat.ids.json&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h3 id=&quot;convenience-endpoints&quot;&gt;Convenience Endpoints&lt;/h3&gt;

&lt;p&gt;It&amp;#39;s not always convenient to use curl on the command line and type the Accept header. So we also offer 4 further endpoints, for quick result viewing in a browser.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;http://search.cocoapods.org/api/v1/pods.picky.hash.json?query=test
http://search.cocoapods.org/api/v1/pods.picky.ids.json?query=test
http://search.cocoapods.org/api/v1/pods.flat.hash.json?query=test
http://search.cocoapods.org/api/v1/pods.flat.ids.json?query=test
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h2 id=&quot;caveats&quot;&gt;Caveats&lt;/h2&gt;

&lt;p&gt;As we improve the search engine, it might be down for half a minute at a time, sporadically. Please allow for this eventuality in any user interfaces.&lt;/p&gt;

&lt;p&gt;Have fun with it - we are curious what you all are coming up with! Personally, I&amp;#39;d love a CocoaPod that parsed &lt;a href=&quot;https://github.com/floere/picky/wiki/results-format-and-structure&quot;&gt;Picky-style results&lt;/a&gt; and provided it to other applications &amp;lt;3&lt;/p&gt;
</description>
    <pubDate>Sun, 02 Feb 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Search-API-Version-1</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Search-API-Version-1</guid>
  </item>
  
  
  
  <item>
    <title>Cocoa Komittee - NYC</title>
    <description>&lt;p&gt;One should avoid repeating oneself. New York City is where we started running &lt;a href=&quot;http://blog.cocoapods.org/Cocoa-Kucha/&quot;&gt;Cocoa Kuchas&lt;/a&gt; last year and whilst there&amp;#39;s a lot more stories to tell here it&amp;#39;s time to move on.&lt;/p&gt;

&lt;p&gt;This month we will be hosting a panel on iOS Testing. Find out more inside.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;The Komittee is an event where we will take people with strong opinions, and get them started on a contentious topic and see if we can learn something from the process. Testing in general is a hot topic. Mix that with a tight platform, closed tools and you&amp;#39;ve got a lot of flames.&lt;/p&gt;

&lt;h2 id=&quot;details&quot;&gt;Details&lt;/h2&gt;

&lt;p&gt;We are graciously being hosted by Spotify, at their &lt;a href=&quot;https://www.google.com/maps/preview/place/Spotify+USA/@40.7420096,-74.0000379,16z/data=!4m5!1m2!2m1!1sSpotify+USA,+West+18th+Street,+New+York,+NY!3m1!1s0x0:0x8dc308c2ad65f154&quot;&gt;NYC HQ&lt;/a&gt; on the 25th of February at 7pm.&lt;/p&gt;

&lt;h2 id=&quot;topics&quot;&gt;Topics&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;QA vs Automated Unit testing&lt;/li&gt;
&lt;li&gt;Testing units of code vs Testing behavior&lt;/li&gt;
&lt;li&gt;Obj-C implementation strategies vs other ecosystems&lt;/li&gt;
&lt;li&gt;Time management&lt;/li&gt;
&lt;li&gt;Ways to improve testing for everyone&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;the-panel&quot;&gt;The Panel&lt;/h2&gt;

&lt;ul class=&#39;people&#39;&gt;
&lt;li&gt;
    &lt;a href=&quot;https://github.com/dblock&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot;&gt;&lt;/a&gt; db - &lt;a href= &quot;https://twitter.com/dblockdotorg&quot;&gt;@dblockdotorg&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;
    &lt;a href=&quot;https://github.com/benjaminjackson&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot;&gt;&lt;/a&gt; Benjamin Jackson - &lt;a href= &quot;https://twitter.com/benjaminjackson&quot;&gt;@benjaminjackson&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;
    &lt;a href=&quot;https://github.com/lazerwalker&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot;&gt;&lt;/a&gt; Mike Lazer-Walker - &lt;a href= &quot;https://twitter.com/lazerwalker&quot;&gt;@lazerwalker&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;
    &lt;a href=&quot;https://github.com/klaaspieter&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot;&gt;&lt;/a&gt; Klaas Pieter - &lt;a href= &quot;https://twitter.com/klaaspieter&quot;&gt;@klaaspieter&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;
    &lt;a href=&quot;https://github.com/paulyoung&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot;&gt;&lt;/a&gt; Paul Young - &lt;a href= &quot;https://twitter.com/py&quot;&gt;@py&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;
    &lt;a href=&quot;https://github.com/btgerst&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot;&gt;&lt;/a&gt; Brian Gerstle - &lt;a href= &quot;https://twitter.com/b_gerstle&quot;&gt;@b_gerstle&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;
    &lt;a href=&quot;https://github.com/landonf&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot;&gt;&lt;/a&gt; Landon J Fuller - &lt;a href= &quot;https://twitter.com/landonfuller&quot;&gt;@landonfuller&lt;/a&gt;
&lt;/li&gt;

&lt;/ul&gt;

&lt;h2 id=&quot;meetup-page&quot;&gt;Meetup Page&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://www.meetup.com/CocoaPods-NYC/events/164278492/&quot;&gt;Here&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;show-notes&quot;&gt;Show notes&lt;/h2&gt;

&lt;style&gt;
.notes ul p {
  margin:8px;
}
&lt;/style&gt;

&lt;div class = &quot;notes&quot;&gt;

  &lt;h4&gt;Landon Fuller&lt;/h4&gt;
  &lt;ul&gt;
    &lt;li&gt;
      &lt;h4&gt;Unit Testing&lt;/h4&gt;
      &lt;p&gt;OCUnit for projects supporting &lt;= iOS 6, and &lt;= Mac OS X 10.7&lt;/p&gt;
      &lt;p&gt;XCTest for projects supporting &gt;= iOS 7, &gt;= Mac OS X 10.8&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;h4&gt;Continual Integration&lt;/h4&gt;
      &lt;p&gt;Jenkins: http://jenkins-ci.org/&lt;/p&gt;
      &lt;p&gt;Confluence: https://www.atlassian.com/software/bamboo/&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ul&gt;

  &lt;h4&gt;Paul Young&lt;/h4&gt;
  &lt;ul&gt;
    &lt;li&gt;
    &lt;h4&gt;Frameworks&lt;/h4&gt;
      &lt;p&gt;Specta&lt;/p&gt;
      &lt;p&gt;Expecta - https://github.com/specta/expecta&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;h4&gt;OCMockito - https://github.com/jonreid/OCMockito&lt;/h4&gt;
      &lt;p&gt;I used to use OCMock but had hang ups because:&lt;/p&gt;
      &lt;p&gt;It reports test failures by raising exceptions (not useful enough, weird output, can’t click and go to the test failure). Klaas mentions this in &lt;a href=&quot;http://www.annema.me/why-i-prefer-testing-with-specta-expecta-and-ocmockito&quot;&gt;his article linked&lt;/a&gt;.&lt;/p&gt;
      &lt;p&gt;Expectations aren’t cleared when you call `stopMocking` which means you can’t use a setup step/beforeEach block to make your spec DRY.
  “Partial&quot; mocks allowed me to mock part of the subject under test which seems wrong. OCMockito doesn’t allow this.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;h4&gt;Tools&lt;/h4&gt;
      &lt;p&gt;Rake  - a la AFNetworking https://github.com/AFNetworking/AFNetworking/blob/master/Rakefile &lt;/p&gt;
      &lt;p&gt;XCTool - although having an issue currently: https://github.com/facebook/xctool/issues/314 &lt;/p&gt;
      &lt;p&gt;Travis - followed this article: http://www.objc.io/issue-6/travis-ci.html but there were a few gotchas:&lt;/p&gt;
      &lt;p&gt;Travis devs forgot to add CocoaPods to the VM so you have to install the gem in your before_script phase. It works but makes the build take a lot longer. You can make it quicker by not installing the docs for the gem. https://github.com/travis-ci/travis-ci/issues/1657 &lt;/p&gt;
      &lt;p&gt;Travis devs forgot to set some of the environment variables: https://github.com/travis-ci/travis-ci/issues/1769 &lt;/p&gt;
      &lt;p&lt;There’s no Mavericks VM yet. See AFNetworking Rakefile for a workaround. https://github.com/travis-ci/travis-ci/issues/1851 &lt;/p&gt;
      &lt;p&gt;Hockey - http://hockeyapp.net/features/ - The apps are pretty good: http://hockeyapp.net/apps/ &lt;/p&gt;

      &lt;p&gt;I followed the objc.io article to push from Travis to Hockey on a successful build in master. Thinking about seeing if Shenzhen (https://github.com/nomad/shenzhen) by Matt Thompson is a better long term solution.&lt;/p&gt;
  &lt;/ul&gt;

  &lt;h4&gt;Klaas Pieter Annema&lt;/h4&gt;
  &lt;p&gt;I use Specta, Expecta and OCMockito. I&#39;ve also been using Barista for integration tests. Everything is automatically run on Travis. Tools I use: Cocoapods, Bundler (so I can have a specific Cocoapoads version per project), Rake and xctool.&lt;/p&gt;
&lt;/div&gt;
</description>
    <pubDate>Sat, 01 Feb 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/The-Kommittee-NYC</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/The-Kommittee-NYC</guid>
  </item>
  
  
  
  <item>
    <title>Repairing Our Broken Specs Repository</title>
    <description>&lt;p&gt;&lt;em&gt;Note: If you got this problem after running &lt;code&gt;gem update&lt;/code&gt;, &lt;a href=&quot;#i-got-linked-here-after-updating-my-gems,-what-to-do?&quot;&gt;jump here&lt;/a&gt; to find a solution.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately we&amp;#39;ve encountered a bug in libgit2 and we are going to have to
&lt;strong&gt;force push&lt;/strong&gt; into &lt;a href=&quot;https://github.com/CocoaPods/Specs&quot;&gt;the Specs repository&lt;/a&gt;. (Also known as the
‘master’ spec repo.)&lt;/p&gt;

&lt;h3 id=&quot;what-does-this-mean-for-you&quot;&gt;What does this mean for you?&lt;/h3&gt;

&lt;p&gt;Well, basically your CocoaPods setup &lt;strong&gt;is going to break&lt;/strong&gt;. You are going to
have to manually delete &lt;em&gt;any&lt;/em&gt; local copies of the Specs repository and re-clone
the new version of the Specs repository. You can do that with the following
commands:&lt;/p&gt;

&lt;pre class=&#39;highlight&#39;&gt;&lt;code&gt;
    $ sudo rm -fr ~/.cocoapods/repos/master
    $ pod setup
    
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;NOTE 1:&lt;/strong&gt; If you have any local commits or changes to the Specs repository
which are not merged, you should ensure you have a copy of them. I would
recommend that you manually copy these changes over and re-commit them. You can
fix your repository without deleting, however, this is not a simple process, so
we are instead recommending that you delete your copy of the Specs repository
and any forks of it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;NOTE 2:&lt;/strong&gt; In case you are storing private podspecs in your clone of the
Specs repository or you have a private spec repo that was forked from the
Specs repository, this is a great time to clean that up by using private spec
repositories &lt;a href=&quot;http://guides.cocoapods.org/making/private-cocoapods.html&quot;&gt;The Proper Way&lt;/a&gt;. This way your private spec
repository should never be affected by issues in other spec repositories.&lt;/em&gt;&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;&lt;em&gt;If you really know what you’re doing and don’t want to re-download the
complete repo, follow &lt;a href=&quot;https://github.com/CocoaPods/Specs/issues/7029#issuecomment-33708256&quot;&gt;these&lt;/a&gt; instructions.&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&quot;why-did-this-break&quot;&gt;Why did this break?&lt;/h3&gt;

&lt;p&gt;The Specs repository has unfortunately broken due to &lt;a href=&quot;https://github.com/libgit2/libgit2/pull/2085&quot;&gt;a bug in
libgit2&lt;/a&gt; which powers &lt;a href=&quot;https://help.github.com/articles/creating-and-editing-files-in-your-repository&quot;&gt;GitHub&amp;#39;s web editor&lt;/a&gt;. This
has &lt;a href=&quot;https://github.com/CocoaPods/Specs/issues/7029#issuecomment-33429321&quot;&gt;caused our git repository to become corrupt&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;As fsck noted, it has duplicate entries, which is a violation of Git&amp;#39;s object
format. GitHub check objects as they are pushed into each fork; anyone who
has built on top of the broken tree will have their push rejected, as they
are trying to bring the broken object into their fork (as a result of it
being reachable from their new commits).&lt;/p&gt;

&lt;p&gt;We are looking into how this broken object got into the repository in the
first place. At this point it looks like a web-edit […], that was then merged
on the site via a pull request ([…] it looks like a bug in GitHub rather than
any kind of user error). We&amp;#39;re looking both into fixing the bug, but also
into giving better protection to broken objects entering the repository (i.e.
this is the exact sort of problem that the fsck-on-push checks are there to
prevent, but they do not currently extend to web edits).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The only solution is to rewrite the history of the repository and force push
the rewritten tree. Rolling out this fix basically means that all copies of the
repository have to be reset. This can be a delicate process, so deleting and
re-cloning is the safest and simplest way to do so.&lt;/p&gt;

&lt;h3 id=&quot;will-this-happen-again&quot;&gt;Will this happen again?&lt;/h3&gt;

&lt;p&gt;There is a &lt;a href=&quot;https://github.com/libgit2/libgit2/pull/2085&quot;&gt;fix&lt;/a&gt; in the works to fix the bug in libgit2. This
fixes a bug which would prevent libgit2 from corrupting a repository in this
particular case.&lt;/p&gt;

&lt;p&gt;GitHub are also working on putting checking measures in-place on the
web-editor so that it wouldn&amp;#39;t be possible to save a corrupt repository, and to
prevent any similar problems in the future. (As is already the case when using
&lt;a href=&quot;https://www.kernel.org/pub/software/scm/git/docs/git-push.html&quot;&gt;git-push&lt;/a&gt;, which runs &lt;a href=&quot;https://www.kernel.org/pub/software/scm/git/docs/git-fsck.html&quot;&gt;git-fsck&lt;/a&gt; on GitHub’s end.)&lt;/p&gt;

&lt;h3 id=&quot;acknowledgements&quot;&gt;Acknowledgements&lt;/h3&gt;

&lt;p&gt;We would like to thoroughly thank the following people for their help in both
investigating and resolving this matter. It is very much appreciated by all of
us at CocoaPods HQ and shows the power of a (larger) community of people coming
together.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jeff King (&lt;a href=&quot;https://github.com/peff&quot;&gt;@peff&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Roberto Tyley (&lt;a href=&quot;https://github.com/rtyley&quot;&gt;@rtyley&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Abizer Nasir (&lt;a href=&quot;https://github.com/Abizern&quot;&gt;@Abizern&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We are very sorry for &lt;em&gt;all&lt;/em&gt; time this issue takes away from our great early
adopters and pod providers. We are very thankful for your patience and
understanding while we work towards a smoothly functioning version 1 of
CocoaPods and its architecture.&lt;/p&gt;

&lt;h3 id=&quot;i-got-linked-here-after-updating-my-gems-what-to-do&quot;&gt;I got linked here after updating my gems, what to do?&lt;/h3&gt;

&lt;p&gt;This issue is being tracked down to an issue located in Psych. To fix it please use the following command:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;bash language-bash&quot; data-lang=&quot;bash&quot;&gt;rm -fr ~/Library/Caches/CocoaPods &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
gem update --system &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
gem update &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
gem cleanup &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
pod setup
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Now instead of seeing this:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;Setting up CocoaPods master repo
Already up-to-date.
[!] There was an error reading &amp;#39;/Users/xxxxx/.cocoapods/repos/master/CocoaPods-version.yml&amp;#39;.
Please consult http://blog.cocoapods.org/Repairing-Our-Broken-Specs-Repository/ for more information.
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;You&amp;#39;ll see this:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;Setting up CocoaPods master repo
Setup completed
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;You can find more information related to this issue &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/3539&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/issues/2908&quot;&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&amp;lt;3&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;– &lt;a href=&quot;https://twitter.com/kylefuller&quot;&gt;@kylefuller&lt;/a&gt;,
&lt;a href=&quot;https://twitter.com/SmileyKeith&quot;&gt;@SmileyKeith&lt;/a&gt;, and
&lt;a href=&quot;https://twitter.com/alloy&quot;&gt;@alloy&lt;/a&gt;&lt;/p&gt;
</description>
    <pubDate>Thu, 30 Jan 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Repairing-Our-Broken-Specs-Repository</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Repairing-Our-Broken-Specs-Repository</guid>
  </item>
  
  
  
  <item>
    <title>Cocoa Kucha 3 - Berlin - 22nd Jan 2014</title>
    <description>&lt;p&gt;And just like that the next Cocoa Kucha was declared. As part of a world-wide community 
outreach program I&amp;#39;ve been in talks with &lt;a href=&quot;http://chris.eidhof.nl&quot;&gt;Chris Eidhof&lt;/a&gt; and &lt;a href=&quot;http://www.kurutepe.com&quot;&gt;Engin Kurutepe&lt;/a&gt; 
about running a Cocoa Kucha with the &lt;a href=&quot;http://cocoaheads-berlin.github.io&quot;&gt;CocoaHeads Berlin&lt;/a&gt;.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Like with the other Kuchas, this meetup is in the style of &lt;a href=&quot;http://www.pechakucha.org/faq&quot;&gt;Pecha
Kucha&lt;/a&gt; where there are 8 speakers doing short
talks related to Objective-C for 6 minutes and 20 seconds. The speaker must go
though 20 slides, 20 seconds per slide. This keeps them to the point and makes
it a lot easier for people to get started.&lt;/p&gt;

&lt;p&gt;As the timeframe for the event is smaller than I normally plan, I&amp;#39;d like to open the doors to speakers. 
&lt;a href=&quot;https://github.com/CocoaPods/blog.cocoapods.org/pull/8&quot;&gt;We accept pull requests including yourself on the roster&lt;/a&gt;. Like most CocoaHead Berlin events is hosted at &lt;a href=&quot;http://www.codekollektiv.de/&quot;&gt;CodeKollektiv&lt;/a&gt; and starts at 19h. Add it to your kalendar.&lt;/p&gt;

&lt;p&gt;Currently confirmed for the 22nd:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ursachec/&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;Claudiu-Vlad Ursache&quot;&gt;&lt;/a&gt;  Claudiu-Vlad Ursache - &lt;a href=&quot;http://twitter.com/ursachec&quot;&gt;@ursachec&lt;/a&gt; - About his work on Tor on iOS.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/robb&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;Robb Böhnke&quot;&gt;&lt;/a&gt;  Robb Böhnke - &lt;a href=&quot;http://twitter.com/ceterum_censeo&quot;&gt;@ceterum_censeo&lt;/a&gt; - What&amp;#39;s coming in Mantle 2.0&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/wczekalski&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;Wojtek Czekalski&quot;&gt;&lt;/a&gt;  Wojtek Czekalski &lt;em&gt;[voy•tech check•all•ski]&lt;/em&gt; - &lt;a href=&quot;http://twitter.com/wczekalski&quot;&gt;@wczekalski&lt;/a&gt; - I have created a popular open source project. And I hate it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/floere&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;Florian Hanke&quot;&gt;&lt;/a&gt;  Florian Hanke - &lt;a href=&quot;http://twitter.com/hanke&quot;&gt;@hanke&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/neonichu&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;Boris Bügling&quot;&gt;&lt;/a&gt;  Boris Bügling - &lt;a href=&quot;https://twitter.com/NeoNacho&quot;&gt;@NeoNacho&lt;/a&gt; - Xcode plugins&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/JensRavens&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;Jens Ravens&quot;&gt;&lt;/a&gt;  Jens Ravens - &lt;a href=&quot;http://twitter.com/JensRavens&quot;&gt;@JensRavens&lt;/a&gt; - Meteor, Realtime APIs and CoreData&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/floere&quot;&gt;Florian Hanke&lt;/a&gt; is one of the CocoaPods Dev team, he is the man responsible for the search API and has been collaborating with me on all aspects on the website. I&amp;#39;m really excited to both meet him for the first time &amp;amp; see him talk.&lt;/p&gt;

&lt;p&gt;You can keep up to date by either watching my &lt;a href=&quot;https://github.com/orta/life/issues/17&quot;&gt;organization issue&lt;/a&gt;, or by keeping track on the &lt;a href=&quot;https://groups.google.com/forum/?hl=de#!topic/berlin-cocoaheads/VPxPyrCohX0&quot;&gt;CocoaHeads google&lt;/a&gt; group.&lt;/p&gt;
</description>
    <pubDate>Tue, 07 Jan 2014 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Cocoa-Kucha-3-Berlin</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Cocoa-Kucha-3-Berlin</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 0.29</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;CocoaPods 0.29 introduces the pod try subcommand, the social media URL
podspec attribute &amp;amp; complete inhibition of header warnings.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every now and then we hear about tiny yet huge feature requests for CocoaPods.
Pod try is one of these. Suggested by &lt;a href=&quot;https://twitter.com/lrz&quot;&gt;Laurent Sansonetti&lt;/a&gt;, pod try quickly
gained a spot among the features of CocoaPods that I love the most. But…
What is it?&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h2 id=&quot;pod-try&quot;&gt;Pod Try&lt;/h2&gt;

&lt;p&gt;Pod try is a new subcommand which allows you to quickly launch the demo project
of a Pod. It can be used to assess the quality of a library – very useful for
user interface elements – or to quickly get up to speed on how to use it.&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/CocoaPods-0.29/pod-try.gif &#39;&gt;&lt;img  src=&#39;/assets/blog_img/CocoaPods-0.29/pod-try.gif &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;In other words the command automates the following steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Checkout the source of the Pod in a temporary directory.&lt;/li&gt;
&lt;li&gt;Search for any project looking like a demo project using some simple heuristics.&lt;/li&gt;
&lt;li&gt;Install any CocoaPods dependencies if needed by the located project.&lt;/li&gt;
&lt;li&gt;Open the workspace/project in Xcode.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To check it out just update to the last release of CocoaPods and run:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;$ pod try FLKAutoLayout
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;It is new, so we&amp;#39;d like feedback as &lt;a href=&quot;https://github.com/cocoapods/cocoapods-try&quot;&gt;issues on the repo&lt;/a&gt; please.&lt;/p&gt;

&lt;h2 id=&quot;social-media-url&quot;&gt;Social Media URL&lt;/h2&gt;

&lt;p&gt;As you might know, the &lt;a href=&quot;https://twitter.com/CocoaPodsFeed&quot;&gt;@CocoaPodsFeed&lt;/a&gt; account posts notifications about new
Pods. We have been aware from a long time that some users replied to those
tweets and that the conversation, as the tweets are generated by an automatic
service, was unfortunately lost. When it was suggested to include the Twitter
handle of the author of the Pod in the feed we decided to take action.&lt;/p&gt;

&lt;p&gt;Identifying a solution was not easy because on the one hand we didn&amp;#39;t want to
include a DSL attribute dedicated to a proprietary platform like Twitter; on
the other hand, we recognized that Twitter was a very convenient channel for
discussing Open Source Projects. After discussing for 75 minutes we managed to
come up with a solution which was able to satisfy our requirements:
the social media URL. Instead of asking to specify a Twitter handle we opted to
ask for an URL.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;social_media_url&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;https://twitter.com/cocoapods&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;When we generate the Tweet for a new Pod we just check if the social media URL
includes the &lt;code&gt;twitter.com&lt;/code&gt; domain and in that case we include the handle in the
tweet (shortening the description of the Pod if needed). We expect this feature
to improve the visibility of Pods authors and increase the engagement with
their libraries. The result is the following:&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p&gt;[AOCUDL by &lt;a href=&quot;https://twitter.com/hypercrypt&quot;&gt;@hypercrypt&lt;/a&gt;] An alternative shorthand syntax to Dustin Bachrach&amp;#39;s OCUDL. &lt;a href=&quot;http://t.co/HURVc1080e&quot;&gt;http://t.co/HURVc1080e&lt;/a&gt;&lt;/p&gt;&amp;mdash; CocoaPods New Pods (@CocoaPodsFeed) &lt;a href=&quot;https://twitter.com/CocoaPodsFeed/statuses/409601855845851136&quot;&gt;December 8, 2013&lt;/a&gt;&lt;/blockquote&gt;

&lt;script async src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;h2 id=&quot;header-warnings&quot;&gt;Header warnings&lt;/h2&gt;

&lt;p&gt;Another great feature in this release is the ability to completely silence
header warnings.&lt;/p&gt;

&lt;p&gt;This feature was contributed by the new core team member &lt;a href=&quot;https://github.com/swizzlr&quot;&gt;swizzlr&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;bug-fixes&quot;&gt;Bug fixes&lt;/h2&gt;

&lt;p&gt;Bug fixes might not be the best argument to read about – unless they are
affecting you – but definitely are the foundation of solid software. Luckily
we got our bases covered thanks to &lt;a href=&quot;https://github.com/Kapin&quot;&gt;Joshua Kalpin&lt;/a&gt; who appears to be on a
streak!  Among the many fixes the one related to the &lt;code&gt;pod lib lint&lt;/code&gt; subcommand
deserves a quick mention.&lt;/p&gt;

&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;/h2&gt;

&lt;p&gt;To install the last release of CocoaPods you can run:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;$ [sudo] gem install cocoapods
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Until version 1.0 we strongly encourage you to keep CocoaPods up to date.&lt;/p&gt;

&lt;p&gt;For all the details, don&amp;#39;t miss the
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/blob/master/CHANGELOG.md&quot;&gt;Changelog&lt;/a&gt;.&lt;/p&gt;
</description>
    <pubDate>Tue, 24 Dec 2013 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-0.29</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-0.29</guid>
  </item>
  
  
  
  <item>
    <title>Cocoa Kucha 2 - 16 Jan 2014</title>
    <description>&lt;p&gt;Cocoa Kucha is back, this time in London on the 16th of January. I&amp;#39;m excited to
announce that &lt;a href=&quot;https://twitter.com/fabiopelosin&quot;&gt;Fabio Pelosin&lt;/a&gt; is going to
make an apperance. Fabio is the biggest contributor to CocoaPods with well
over 3000 commits across the various repositories. Along with Fabio, both
&lt;a href=&quot;https://twitter.com/orta&quot;&gt;Orta Therox&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/kylefuller&quot;&gt;myself&lt;/a&gt;
will be there. Orta has organised this event, and it&amp;#39;s kindly hosted by
&lt;a href=&quot;https://twitter.com/daniel1of1&quot;&gt;Daniel Haight&lt;/a&gt; from &lt;a href=&quot;http://www.meetup.com/NSLondon/&quot;&gt;NSLondon&lt;/a&gt;. &lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Like last time, this meetup is in the style of &lt;a href=&quot;http://www.pechakucha.org/faq&quot;&gt;Pecha
Kucha&lt;/a&gt; where there are 8 speakers doing short
talks related to Objective-C for 6 minutes and 20 seconds. The speaker must go
though 20 slides, 20 seconds per slide.&lt;/p&gt;

&lt;p&gt;There is a great line up of speakers for the upcoming Cocoa Kucha, ranging from
the author of &lt;a href=&quot;http://cocoapods.org/?q=SBJSON&quot;&gt;SBJson&lt;/a&gt;, Stig Brautaset to
Damien DeVille, a software engineer at the ever popular Realmac Software.&lt;/p&gt;

&lt;p&gt;Currently confirmed for the 16th&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/perspx/&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;perspx&quot;&gt;&lt;/a&gt;  Alex Rozanski - &lt;a href=&quot;http://twitter.com/alexrozanski&quot;&gt;@alexrozanski&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ddeville/&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;ddeville&quot;&gt;&lt;/a&gt;   Damien DeVille - &lt;a href=&quot;http://twitter.com/DamienDeVille&quot;&gt;@DamienDeVille&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/irrationalfab/&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;irrationalfab&quot;&gt;&lt;/a&gt;  Fabio Pelosin - &lt;a href=&quot;http://twitter.com/fabiopelosin&quot;&gt;@fabiopelosin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/jasarien/&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;jasarien&quot;&gt;&lt;/a&gt;  James Addyman - &lt;a href=&quot;http://twitter.com/jasarien&quot;&gt;@jasarien&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/lukabernardi/&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;lukabernardi&quot;&gt;&lt;/a&gt;  Luca Bernardi - &lt;a href=&quot;http://twitter.com/luka_bernardi&quot;&gt;@luka_bernardi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/RolandasRazma/&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;RolandasRazma&quot;&gt;&lt;/a&gt;  Rolandas Razma - &lt;a href=&quot;http://twitter.com/rolandas_razma&quot;&gt;@rolandas_razma&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/stig/&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;stig&quot;&gt;&lt;/a&gt;  Stig Brautaset -  &lt;a href=&quot;http://twitter.com/stigbra&quot;&gt;@stigbra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sally Shepard - &lt;a href=&quot;http://twitter.com/mostgood&quot;&gt;@mostgood&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can join the &lt;a href=&quot;http://www.meetup.com/NSLondon/&quot;&gt;NSLondon meetup group&lt;/a&gt; to
keep up to date, and the &lt;a href=&quot;http://www.meetup.com/NSLondon/events/155953132/&quot;&gt;event&lt;/a&gt;
will allow RSVPs 2 weeks before on the 2nd of January.&lt;/p&gt;
</description>
    <pubDate>Tue, 17 Dec 2013 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Cocoa-Kucha-2</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Cocoa-Kucha-2</guid>
  </item>
  
  
  
  <item>
    <title>Cool URIs don't change.</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;We broke some URIs but this is how we ensure people still get the info they were looking for.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To try and simplify where you can find CocoaPods documentation we deprecated &lt;a href=&quot;http://docs.cocoapods.org&quot;&gt;docs.cocoapods.org&lt;/a&gt; in favour of &lt;a href=&quot;http://guides.cocoapods.org&quot;&gt;guides.cocoapods.org&lt;/a&gt; and there will be further subsites with different focuses. To ensure a smooth transition I built a small sinatra app that might be of use to other people.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Whilst not entirely living up to the &lt;a href=&quot;http://www.w3.org/Provider/Style/URI.html&quot;&gt;W3C dream&lt;/a&gt; of the content changing but the URI not changing I felt a system of smart HTTP 302 permanent redirects would work quite elegantly for our system. Previously we had a static site that was held on github pages, this meant we had no ability to do true redirects, only HTMLs property &lt;code&gt;&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot;&amp;gt;&lt;/code&gt;. This is a sledgehammer approach to redirects and we wanted to use a smaller tool. &lt;/p&gt;

&lt;p&gt;So I brought out ruby, the language CocoaPods is built in and created a small app using &lt;a href=&quot;http://sinatrarb.com&quot;&gt;sinatra&lt;/a&gt; that can be used to make a map of URLs to redirect to. Luckily there were not that many pages in the docs and we had equivilent pages in the guides. This is then turned into a &lt;a href=&quot;https://www.heroku.com&quot;&gt;heroku&lt;/a&gt; app and made to be the new &lt;a href=&quot;http://docs.cocoapods.org&quot;&gt;docs.cocoapods.org&lt;/a&gt; silently redirecting people to the new website with the same information they were looking for.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;sinatra&amp;#39;&lt;/span&gt;

&lt;span class=&quot;no&quot;&gt;NEW_URL&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;http://guides.cocoapods.org&amp;quot;&lt;/span&gt;
&lt;span class=&quot;no&quot;&gt;ROUTES&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;/&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# References&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;/podfile.html&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/syntax/podfile.html&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;/specification.html&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/syntax/podspec.html&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;/commands.html&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/terminal/commands.html&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Guides&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;/guides/philosophy.html&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/using/faq.html&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;/guides/installing_cocoapods.html&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/using/getting-started.html&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;/guides/dependency_versioning.html&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/using/the-podfile.html&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;/guides/closed_source_pods.html&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/making/private-cocoapods.html&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;/guides/working_with_teams.html&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/making/private-cocoapods.html&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;/guides/contributing_to_the_master_repo.html&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/making/specs-and-specs-repo.html&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;/guides/creating_and_maintaining_a_pod.html&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/making/specs-and-specs-repo.html#how-do-i-update-an-existing-pod?&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;/guides/creating_your_own_repository.html&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/making/private-cocoapods.html&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Gem specifics should be handled by rubydoc &lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;/cocoapods/*&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;http://rubydoc.info/gems/cocoapods&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;/cocoapods_core/*&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;http://rubydoc.info/gems/cocoapods-core&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;/xcodeproj/*&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;http://rubydoc.info/gems/xcodeproj&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;/claide/*&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;http://rubydoc.info/gems/claide&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;/cocoapods_downloader/*&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;http://rubydoc.info/gems/cocoapods-downloader&amp;quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;no&quot;&gt;ROUTES&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;each_key&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Create a sinatra route for each key, check if it&amp;#39;s value starts with http&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# and either redirect to the new site with the same query.&lt;/span&gt;

   &lt;span class=&quot;n&quot;&gt;get&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;key&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
     &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;ROUTES&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;http&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; 
       &lt;span class=&quot;n&quot;&gt;redirect&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ROUTES&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;302&lt;/span&gt;
     &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
       &lt;span class=&quot;n&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;NEW_URL&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ROUTES&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;query_string&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;redirect&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;302&lt;/span&gt;
     &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
   &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
 &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; 

 &lt;span class=&quot;c1&quot;&gt;# If we&amp;#39;ve missed anything just go to the root of the new URL&lt;/span&gt;

 &lt;span class=&quot;n&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Sinatra&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;NotFound&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;redirect&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;NEW_URL&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;query_string&lt;/span&gt;
 &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;The repo can be found here &lt;a href=&quot;https://github.com/orta/CocoaPods-Docs-Redirector/&quot;&gt;github.com/orta/CocoaPods-Docs-Redirector/&lt;/a&gt;&lt;/p&gt;
</description>
    <pubDate>Mon, 02 Dec 2013 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Cool-URIs-Don't-Change</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Cool-URIs-Don't-Change</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods Beta</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;CocoaPods just got a facelift.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Interested in finding the CocoaPods Logo? Check out our &lt;a href=&quot;https://github.com/CocoaPods/shared_resources/tree/master/media&quot;&gt;Media Pack&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I believe design is important. CocoaPods is probably the most public facing Objective-C project. Applying design to open source projects is a sign of maturity, and of stability. Whilst we&amp;#39;re still not 1.0 yet, having a cohesive brand is a step towards that. &lt;/p&gt;

&lt;p&gt;This post documents some of the work involved in making the new CocoaPods web properties.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;The CocoaPods devs welcomed me with open arms after I started regularly contributing via the Specs repo, and encouraged by their work I started a project called &lt;a href=&quot;http://cocoadocs.org&quot;&gt;CocoaDocs&lt;/a&gt;. Once it became quite obvious that CocoaDocs was going to be an important part of the CocoaPods ecosystem I branded it with the CocoaPods styling, and it was treated as a sister project. &lt;/p&gt;

&lt;p&gt;Around the same time we were seeing issues with documentation, it was user contributed and spread out among the cocoapods website and a collection of wikis, so &lt;a href=&quot;https://twitter.com/micheletitolo&quot;&gt;Michele Titolo&lt;/a&gt; &amp;amp; I started to mock out the &lt;a href=&quot;https://github.com/CocoaPods/cocoapods.github.com/issues/14&quot;&gt;guides structure&lt;/a&gt; and Michele started collating documents and creating a single source for the markdown files.&lt;/p&gt;

&lt;p&gt;Andy and I went back and forth on logos for a few months until we came up with the version shown in the top left and in this blog post &lt;a href=&quot;/redesign/&quot;&gt;announcing the new blog&lt;/a&gt;. Andy (quite correctly) believed that we couldn&amp;#39;t just announce a logo without showing it in context, that meant re-thinking the homepage. I spent some time with &lt;a href=&quot;http://florianhanke.com&quot;&gt;Florian Hanke&lt;/a&gt; digging into the site analytics to try and get an understanding how people were using the current website. Turns out everyone is using it to search for Pods. Who&amp;#39;d have thought?&lt;/p&gt;

&lt;p&gt;So that gave us a direction for what the site should orient itself towards. We knew that search should be a high priority, and that a lot of the documentation should move into a guide leaving a lot more breathing space in the homepage. The new design was worked on in secret until we felt there was enough context around the branding. You can&amp;#39;t re-think something &lt;a href=&quot;http://marissamayr.tumblr.com/post/60336044815/geeking-out-on-the-logo&quot;&gt;this big&lt;/a&gt; in a weekend, and showing incremental work isn&amp;#39;t always the best option when you are making drastic moves. Luckily &lt;a href=&quot;https://github.com/alloy&quot;&gt;Eloy Durán&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://github.com/irrationalfab/&quot;&gt;Fabio Pelosin&lt;/a&gt; trusted that we knew what we were doing when I said that the old CocoaPod illustration will have to go.&lt;/p&gt;

&lt;p&gt;With buy-in from the rest of the team, and some helpful tips we all discussed the scope of the changes. We&amp;#39;d have to break the current website into 3 separate projects, sharing assets, design and code as much as possible. This meant we could incrementally build the sites as staticly generated content and upload it to github. It was an easy sell that we needed a blog, and it was an easy sell that we should split out the CocoaPods twitter into one specifically for new Pods. The blog meant we could wax lyrical about new releases, keep people up to date and have a sense of permenance in the CocoaPods team voice. &lt;a href=&quot;https://smileykeith.com&quot;&gt;Keith Smiley&lt;/a&gt; started building the blog the moment it had some mockups. Setting up a &lt;a href=&quot;https://github.com/CocoaPods/shared_resources&quot;&gt;shared repo&lt;/a&gt; for all our assets and &lt;a href=&quot;https://github.com/CocoaPods/shared_resources/tree/master/design&quot;&gt;design notes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Fabio &amp;amp; I announced the redesign at NSSpain. We had stickers. It went well.&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/beta/cocoapods-stickers.jpg &#39;&gt;&lt;img  src=&#39;/assets/blog_img/beta/cocoapods-stickers.jpg &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;Building this blog gave us chance to start dealing with some of the navigation issues that just aren&amp;#39;t obvious during design stage. Andy &amp;amp; I iterated quickly on design and implementation. We used Bootstrap 3 to build the sites and I&amp;#39;m definitely a fan of the system. Everyone on the CocoaPods team took an OSS break for iOS7. Our developers chat room was a desert for a while. Once that hurdle had been jumped a few of us got started thinking about full fleshing the guides out.&lt;/p&gt;

&lt;p&gt;The guides were an interesting navigation problem, we knew roughly the overall structure and a lot of the problems came in dealing with heirarchy and ensuring consistency in the documentation. It took one sentence from Artsy&amp;#39;s head designer &lt;a href=&quot;http://robertlenne.com&quot;&gt;Robert Lenne&lt;/a&gt; and the index page was figured out. &lt;/p&gt;

&lt;p&gt;During this period Florian started work on the API changes required for the new site, as it was to be a static site meaning we can dogfood our now &lt;a href=&quot;http://florianhanke.com/blog/2012/03/01/cocoapods-search-design.html&quot;&gt;2 year old API&lt;/a&gt;. We&amp;#39;ve started work on splitting the API out into it&amp;#39;s own project to accomodate the ideas Andy &amp;amp; I wanted for the search experience. Florian has done an amazing job on the feel of the search interface, and it is &lt;em&gt;super&lt;/em&gt; fast. We just worked off and on over the course of a few weeks together on the &lt;a href=&quot;http://cocoapods.org&quot;&gt;cocoapods.org&lt;/a&gt; domain until it felt right.&lt;/p&gt;

&lt;p&gt;There&amp;#39;s still a bunch of work to be done, like the about page, and some more work on mobile, design tweaks, but overall the experience is definitely a step forwards. We&amp;#39;ve had a lot of help from everyone in the core team, and people who have taken the time to discuss ideas with me and the rest of the team. This is one step of many, and it will probably be a while before we remove that beta in the top corner. In true open source style we take both pull requests and issues, and as much of the content has a button to go directly to the source to submit changes.&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;https://ortastuff.s3.amazonaws.com/gifs/cheers-boxing.gif &#39;&gt;&lt;img  src=&#39;https://ortastuff.s3.amazonaws.com/gifs/cheers-boxing.gif &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;Let us know what you think either on twitter (&lt;a href=&quot;http://twitter.com/CocoaPods&quot;&gt;@CocoaPods&lt;/a&gt;) or if your idea is too big for 140 characters, &lt;a href=&quot;https://github.com/cocoapods/cocoapods.org/issues&quot;&gt;write us an issue&lt;/a&gt;. This was a team effort, and I&amp;#39;m super proud to have been a part of it. !m!&lt;/p&gt;
</description>
    <pubDate>Sun, 24 Nov 2013 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Beta</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Beta</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 0.28</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;CocoaPods 0.28 introduces support for plugins.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Fighting feature creep in CocoaPods is not easy. We hear about a lot of great
ideas and many of them don&amp;#39;t make the cut as they would not be useful for at
least 80% of our users. The ideal solution would be support for third-party
plugins and, luckily, an elegant and lean patch from &lt;a href=&quot;http://blog.leshill.org&quot;&gt;Les Hill&lt;/a&gt; has introduced
it.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Plugin support allows one to tweak the internals of CocoaPods and to insert
additional commands. As a matter of fact, two new commands are available right
from the start:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/leshill/open_pod_bay&quot;&gt;cocoapods-open&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/CocoaPods/cocoapods-docs&quot;&gt;cocoapods-docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The discoverability of plugins is another important topic that we considered.
Our solution is to adopt a non-enforced convention: plugins should be named
after the &lt;code&gt;cocoapods-PLUGIN_NAME&lt;/code&gt; format. In this way, to check for the
available plugins, you can just use this handy &lt;a href=&quot;http://rubygems.org/search?utf8=%E2%9C%93&amp;query=cocoapods-&quot;&gt;RubyGems search&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This release also includes a galore of bug fixes, mostly related to the
handling of xcassets resources.&lt;/p&gt;

&lt;h2 id=&quot;creating-plugins&quot;&gt;Creating plugins&lt;/h2&gt;

&lt;p&gt;A CocoaPods plugin is a gem which includes a file named &lt;code&gt;cocoapods_plugin.rb&lt;/code&gt;.
CocoaPods will load this file for any installed gem that includes it. The file
will be loaded before running any command, but &lt;em&gt;after&lt;/em&gt; CocoaPods’ files (and
those of its dependencies) have been loaded. The convention is to use this
file to require the actual implementation of the plugin.&lt;/p&gt;

&lt;p&gt;For example &lt;a href=&quot;https://github.com/leshill/open_pod_bay/blob/master/lib/cocoapods_plugin.rb&quot;&gt;cocoapods-open&lt;/a&gt;
has the following &lt;code&gt;cocoapods_plugin.rb&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;pod/command/open&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;To create a new gem you can use &lt;a href=&quot;http://bundler.io&quot;&gt;bundler&lt;/a&gt; which provides a convenient command:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;$ bundle gem NAME
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h3 id=&quot;adding-subcommands&quot;&gt;Adding subcommands&lt;/h3&gt;

&lt;p&gt;Adding new subcommands is very easy. You just need to create a subclass of the
command that will be used as the namespace. Subsequently, it is necessary to
provide the metadata of the new command and its logic. For more information you
can check the documentation of the &lt;a href=&quot;https://github.com/CocoaPods/CLAide&quot;&gt;CLAide&lt;/a&gt; gem and the &lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/tree/master/lib/cocoapods/command&quot;&gt;source code&lt;/a&gt; of the
CocoaPods commands.&lt;/p&gt;

&lt;p&gt;If this sounds complicated, don’t be scared; we love simplicity! Actually the
implementation of those steps is simpler than their description. Following you
can find the &lt;strong&gt;complete&lt;/strong&gt; implementation of the &lt;code&gt;pod spec doc&lt;/code&gt; command.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;c1&quot;&gt;# lib/pod/command/spec/doc.rb&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;module&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Pod&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Command&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Spec&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Doc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Spec&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;summary&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Opens the web documentation of a Pod.&amp;quot;&lt;/span&gt;

        &lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;description&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;-&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;DESC&lt;/span&gt;
&lt;span class=&quot;sh&quot;&gt;          Opens the web documentation of the Pod with the given NAME.&lt;/span&gt;
&lt;span class=&quot;no&quot;&gt;        DESC&lt;/span&gt;

        &lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arguments&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;NAME&amp;#39;&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;vi&quot;&gt;@name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shift_argument&lt;/span&gt;
          &lt;span class=&quot;k&quot;&gt;super&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;validate!&lt;/span&gt;
          &lt;span class=&quot;k&quot;&gt;super&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;help!&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;A Pod name is required.&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;unless&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@name&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;run&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_path_of_spec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Specification&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;no&quot;&gt;UI&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Opening &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; documentation&amp;quot;&lt;/span&gt;
          &lt;span class=&quot;sb&quot;&gt;`open &amp;quot;http://cocoadocs.org/docsets/&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;&amp;quot;`&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h3 id=&quot;apis&quot;&gt;APIs&lt;/h3&gt;

&lt;p&gt;As of yet, an explicit API to access CocoaPods logic has not be defined. So try
to fail as gracefully as possible in case a future version of CocoaPods breaks
your usage. Also please let us know about your needs, so we can take them into
account to finalize APIs.&lt;/p&gt;

&lt;h3 id=&quot;checklist&quot;&gt;Checklist&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Name the plugin after the &lt;code&gt;cocoapods-PLUGIN_NAME&lt;/code&gt; convention.&lt;/li&gt;
&lt;li&gt;Include a &lt;code&gt;cocoapods_plugin.rb&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Use the &lt;code&gt;cocoapods_plugin.rb&lt;/code&gt; file to load the actual implementation.&lt;/li&gt;
&lt;li&gt;Fail gracefully when relying on CocoaPods methods.&lt;/li&gt;
&lt;li&gt;Let us know if you make something cool!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;/h2&gt;

&lt;p&gt;To install the last release of CocoaPods you can run:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;$ [sudo] gem install cocoapods
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Until version 1.0 we strongly encourage you to keep CocoaPods up to date.&lt;/p&gt;

&lt;p&gt;For all the details, don&amp;#39;t miss the
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/blob/master/CHANGELOG.md&quot;&gt;Changelog&lt;/a&gt;.&lt;/p&gt;
</description>
    <pubDate>Thu, 14 Nov 2013 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-0.28</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-0.28</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods → CocoaPodsFeed</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;New library notifications have moved from the &lt;a href=&quot;http://twitter.com/CocoaPods&quot;&gt;@CocoaPods&lt;/a&gt; twitter to the &lt;a href=&quot;http://twitter.com/CocoaPodsFeed&quot;&gt;@CocoaPodsFeed&lt;/a&gt; twitter account&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you want to follow the new libraries on CocoaPods, &lt;a href=&quot;https://twitter.com/CocoaPodsFeed&quot; class=&quot;twitter-follow-button&quot; data-show-count=&quot;false&quot; data-lang=&quot;en&quot;&gt;Follow @CocoaPodsFeed&lt;/a&gt;&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;In thinking about ways that CocoaPods can communicate news, updates and ideas one of the first things that came out in discussion was &lt;em&gt;&amp;quot;Let&amp;#39;s make the Twitter more relevant.&amp;quot;&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Right now if you want to keep up to date with CocoaPods you also end up keeping up to date with every new library on the platform. This can be too much sometimes, especially for people who don&amp;#39;t follow hundreds of people.&lt;/p&gt;

&lt;p&gt;To deal with this effectively we&amp;#39;ve moved out notifications on to a separate twitter account allowing the CocoaPods twitter feed to become a relatively low-chaff high information yield source for those interested in keeping up on Objective-C Open Source.&lt;/p&gt;
</description>
    <pubDate>Thu, 07 Nov 2013 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPodsFeed</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPodsFeed</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 0.27 and improved installation UX</title>
    <description>&lt;p&gt;TL;DR: &lt;em&gt;Compilation as part of the CocoaPods gem install process is dead. Long
live precompiled gems!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The CocoaPods gems will now be installable &lt;em&gt;without&lt;/em&gt;
the need for installing the Xcode Command Line Tools and fixing the Ruby
headers location on OS X (Mountain Lion &lt;em&gt;and&lt;/em&gt; Mavericks).&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;&lt;center&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.github.com/CocoaPods/blog.cocoapods.org/master/assets/blog_img/CocoaPods-0.27/cocoapods-0-27-install.gif&quot; alt=&quot;Cocoapods 0 27 Install&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;/center&gt;&lt;/p&gt;

&lt;h2 id=&quot;history-on-the-underlying-problem&quot;&gt;History on the underlying problem&lt;/h2&gt;

&lt;p&gt;While CocoaPods and most of its dependencies are implemented in pure Ruby there
is one dependency that requires a bit of C code, or –in Ruby parlance– a
‘Ruby C extension’.&lt;/p&gt;

&lt;p&gt;Typically, a ‘Ruby C extension’ will be compiled on the user’s machine during
installation of the gem it belongs to. While this leads to better portability,
it &lt;em&gt;does&lt;/em&gt; add the requirement of having a compiler and the Ruby C headers, both
of which are &lt;strong&gt;not&lt;/strong&gt; available on OS X by default.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;To be fair, Mavericks does come with the Command Line Tools pre-installed, and
thus with a compiler, but it does not place the Ruby C headers in the right
location and &lt;a href=&quot;https://gist.github.com/goshakkk/5763489&quot;&gt;manual intervention&lt;/a&gt; is
required.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The dependency with a C extension that we have is
&lt;a href=&quot;https://github.com/CocoaPods/Xcodeproj&quot;&gt;Xcodeproj&lt;/a&gt;, the library that powers
our Xcode project parsing and generation. It does this by utilising the OS X
Core Foundation API called &lt;a href=&quot;http://bit.ly/1a9irJT&quot;&gt;CFPropertyList&lt;/a&gt;. This API
allows us to read &lt;em&gt;any type&lt;/em&gt; of PList, including the deprecated ASCII format
that Xcode still uses, and generate a PList readable by Xcode. While there were
–at the time of implementing Xcodeproj– some pure Ruby libraries to read or
write one of the PList formats, there was none that implemented them all to our
satisfaction. Finally, as a Xcode project is an undocumented format, we did not
want to spend a lot of time on implementing and possibly having to replace it
in the future if Apple would ever decide to change the format.&lt;/p&gt;

&lt;h2 id=&quot;ux-perspective&quot;&gt;UX Perspective&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;You can skip to ‘The solution’ if you’re not interested in a discussion on the
ramifications of how to get things done with Ruby and the status quo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These sorts of issues make the out-of-the-box UX for pure Ruby &lt;strong&gt;users&lt;/strong&gt; really
bad. CocoaPods is such a tool that has many more users whom are &lt;strong&gt;not&lt;/strong&gt; Ruby
developers. I.e. Ruby is somewhat of an implementation detail. This
understandably leads to frustrated users.&lt;/p&gt;

&lt;p&gt;To add insult to injury, such users –in their willingness to give CocoaPods a
second chance– will usually google for a solution leading them into, what I
call, the ‘developer bubble’ of Ruby developers.&lt;/p&gt;

&lt;p&gt;In this ‘developer bubble’ there is &lt;strong&gt;no sane&lt;/strong&gt; Ruby environment &lt;em&gt;unless&lt;/em&gt; you
&lt;em&gt;at least&lt;/em&gt; build your own Ruby, but &lt;em&gt;preferably&lt;/em&gt; including one or more of the
following tools: &lt;a href=&quot;http://brew.sh&quot;&gt;homebrew&lt;/a&gt;, &lt;a href=&quot;https://rvm.io&quot;&gt;RVM&lt;/a&gt;,
&lt;a href=&quot;http://rbenv.org&quot;&gt;rbenv&lt;/a&gt;, and many other alternatives.&lt;/p&gt;

&lt;p&gt;Here’s &lt;a href=&quot;http://bit.ly/14B38md&quot;&gt;a recent blog post&lt;/a&gt; that gives this illusion and
here’s a typical tweet that illustrates how this suggestion leads a pure Ruby
user astray:&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p&gt;Soooo... I need to install homebrew for rvm, ruby-install, and rbenv, and then will be able to `gem install cocoa pods`? &lt;a href=&quot;https://twitter.com/search?q=%23shitshow&amp;amp;src=hash&quot;&gt;#shitshow&lt;/a&gt;&lt;/p&gt;&amp;mdash; ¡ɜɿoɾɪɹℲ (@frijole) &lt;a href=&quot;https://twitter.com/frijole/statuses/392339577232703488&quot;&gt;October 21, 2013&lt;/a&gt;&lt;/blockquote&gt;

&lt;script async src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;Shitshow indeed.&lt;/p&gt;

&lt;p&gt;The sad part is, it isn’t even necessary. Not if you &lt;em&gt;are&lt;/em&gt; a Ruby developer,
let alone if you are a pure user. We in the Ruby community need to fix this
perspective and look at the mess we’ve gotten ourselves in &lt;em&gt;from the outside&lt;/em&gt;
and better frame our suggestions in context. But I digress, for now.&lt;/p&gt;

&lt;h2 id=&quot;solution&quot;&gt;Solution&lt;/h2&gt;

&lt;p&gt;The solution is simple and, in our case, two-fold:&lt;/p&gt;

&lt;h3 id=&quot;recommend-the-use-of-the-ruby-version-that-comes-with-os-x&quot;&gt;&lt;em&gt;Recommend the use of the Ruby version that comes with OS X.&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;The only remaining –but very valid– concern is that, by default, you will
  have to use &lt;code&gt;sudo&lt;/code&gt; when installing gems. (This is only an issue for the
  duration of the gem installation, though.)&lt;/p&gt;

&lt;p&gt;If you do &lt;strong&gt;not&lt;/strong&gt; want to grant RubyGems admin privileges for this process,
  you can tell RubyGems to install into your user directory by passing either
  the &lt;code&gt;--user-install&lt;/code&gt; flag to &lt;code&gt;gem install&lt;/code&gt; or by configuring the RubyGems
  environment. The latter is in our opinion the best solution. To do this,
  edit the &lt;code&gt;.profile&lt;/code&gt; file in your home directory and add or amend it to
  include these lines:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;sh language-sh&quot; data-lang=&quot;sh&quot;&gt;  &lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;GEM_HOME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/gems
  &lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$GEM_HOME&lt;/span&gt;/bin:&lt;span class=&quot;nv&quot;&gt;$PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Note that if you choose to use the &lt;code&gt;--user-install&lt;/code&gt; option, you will still
  have to configure your &lt;code&gt;.profile&lt;/code&gt; file to set the &lt;code&gt;PATH&lt;/code&gt; or use the command
  prepended by the full path. You can find out where a gem is installed with
  &lt;code&gt;gem which cocoapods&lt;/code&gt;. E.g.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;sh language-sh&quot; data-lang=&quot;sh&quot;&gt;  &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;gem install cocoapods --user-install
  &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;gem which cocoapods
  /Users/eloy/.gem/ruby/1.8/gems/cocoapods-0.27.0/lib/cocoapods.rb
  &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;/Users/eloy/.gem/ruby/1.8/gems/cocoapods-0.27.0/bin/pod install
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h3 id=&quot;provide-prebuilt-binaries-for-the-ruby-versions-that-come-with-os-x&quot;&gt;&lt;em&gt;Provide prebuilt binaries for the Ruby versions that come with OS X.&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;In our case this means a prebuilt version of the C extension for Ruby 1.8.7
  on OS X 10.8.x and for Ruby 2.0.0 on OS X 10.9.x. On these versions, the
  user does &lt;strong&gt;not&lt;/strong&gt; have to install the Xcode Command Line Tools, nor fix the
  Ruby C headers.&lt;/p&gt;

&lt;p&gt;If you are using a custom Ruby version, however, regardless of it being the
  exact same Ruby version for which we provide prebuilt binaries, you &lt;em&gt;will&lt;/em&gt;
  have to compile the C extension and thus need the Xcode Command Line Tools.&lt;/p&gt;

&lt;p&gt;This all works transparently, so you don’t need to think about it much. If,
  however, for whatever reason you wish to control this then you can use the
  &lt;code&gt;XCODEPROJ_BUILD&lt;/code&gt; environment variable. Set it to &lt;code&gt;1&lt;/code&gt; to &lt;em&gt;always&lt;/em&gt; compile or
  to &lt;code&gt;0&lt;/code&gt; to &lt;em&gt;never&lt;/em&gt; compile.&lt;/p&gt;

&lt;p&gt;Note that you can recognize that you’re using the prebuilt binary by the
  following sentence in the &lt;code&gt;gem install&lt;/code&gt; output:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;[!] You are using the prebuilt binary version of the xcodeproj gem.
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h2 id=&quot;notes-for-rubygems-developers&quot;&gt;Notes for RubyGems developers&lt;/h2&gt;

&lt;p&gt;Over the course of figuring out the best way to cater to our users, I came to
the following insights:&lt;/p&gt;

&lt;h3 id=&quot;rubygems-built-in-prebuilt-binaries-support&quot;&gt;&lt;em&gt;RubyGems built-in prebuilt binaries support.&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;RubyGems automagically installs a CPU-architecture + OS-version specific
  version of your gem if one exists with the following filename:
  &lt;code&gt;[NAME]-[VERSION]-[ARCH]-[PLATFORM].gem&lt;/code&gt;.
  E.g.: &lt;code&gt;xcodeproj-0.14.0-universal.x86_64-darwin13.gem&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;While this allows you to prebuilt for specific architectures and OS versions,
  it doesn’t allow for control over which Ruby version you have. This means it
  is not an option for us, as we have to check if the Ruby you are using is in
  fact a pre-installed OS X Ruby version. (In case there &lt;em&gt;is&lt;/em&gt; a modifier to
  control the Ruby version, please let me know and I will update this section.)&lt;/p&gt;

&lt;h3 id=&quot;rubygems-installation-without-the-need-for-make&quot;&gt;&lt;em&gt;RubyGems installation without the need for &lt;code&gt;make&lt;/code&gt;.&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;Because we have to check if the Ruby version you are using is a version that
  comes pre-installed with OS X, we have to perform these checks at the time
  that the gem is being installed. Typically, RubyGems authors ‘abuse’ their
  &lt;code&gt;extconf.rb&lt;/code&gt; to generate a no-op &lt;code&gt;Makefile&lt;/code&gt; in the case that no compilation
  is required. This, however, means that the user will still need to have
  &lt;code&gt;make&lt;/code&gt; installed, which is not the case on OS X 10.8.&lt;/p&gt;

&lt;p&gt;Luckily &lt;a href=&quot;https://twitter.com/drbrain&quot;&gt;Eric Hodel&lt;/a&gt;, one of the RubyGems
  maintainers, pointed me to an undocumented feature. Instead of specifying the
  extension like so:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extensions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;ext/xcodeproj/extconf.rb&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;You can alternatively specify a &lt;code&gt;Rakefile&lt;/code&gt;, in which case RubyGems will leave
  running &lt;code&gt;make&lt;/code&gt;, or whatever you need to run, up to your rake task:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;  &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extensions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;ext/xcodeproj/Rakefile&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;h3 id=&quot;prebuilt-binary-packaging-helpers&quot;&gt;&lt;em&gt;Prebuilt binary packaging helpers.&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;The &lt;a href=&quot;https://github.com/luislavena/rake-compiler&quot;&gt;rake-compiler&lt;/a&gt; library is
  very helpful in prebuilding extensions and understanding how RubyGems handles
  these gem filename formats. However, if you are going to target very specific
  Ruby versions which are the same regardless of user/machine –like we do– then
  it’s much simpler to just vendor the result of your &lt;code&gt;extconf.rb&lt;/code&gt; (i.e. the
  &lt;code&gt;Makefile&lt;/code&gt; and possibly &lt;code&gt;extconf.h&lt;/code&gt;) and use those to build your extensions.
  Here’s &lt;a href=&quot;http://bit.ly/1a9tp25&quot;&gt;our final solution&lt;/a&gt;.&lt;/p&gt;
</description>
    <pubDate>Thu, 24 Oct 2013 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-0.27-and-improved-installation-UX</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-0.27-and-improved-installation-UX</guid>
  </item>
  
  
  
  <item>
    <title>Cocoa Kucha - 20 Nov 2013</title>
    <description>&lt;p&gt;CocoaPods is more than just a tool, CocoaPods is a community of over a thousand &lt;a href=&quot;https://github.com/CocoaPods/Specs/graphs/contributors&quot;&gt;commiters&lt;/a&gt;, six thousand Podspecs and hundreds of thousands of &lt;a href=&quot;http://rubygems.org/gems/cocoapods&quot;&gt;users&lt;/a&gt;. To say the community is growing is a mild &lt;a href=&quot;https://github.com/CocoaPods/Specs/graphs/code-frequency&quot;&gt;understatement&lt;/a&gt;. One of the cool things about a big community is that there&amp;#39;s the chance that people will get clumped enough together to make meeting up and sharing ideas a possible. I&amp;#39;d like to announce our first attempt at trying to bring people together, starting in New York City this November.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Cocoa Kucha is a meetup in the style of &lt;a href=&quot;http://www.pechakucha.org/faq&quot;&gt;Pecha Kucha&lt;/a&gt;. The idea is we get 8 people to talk about a topic related to Objective-C for 6 minutes and 20 seconds. 20 slides at 20 seconds. Mix that with some drinks and conversation and I think we&amp;#39;ve got a nice evening.&lt;/p&gt;

&lt;p&gt;The format of a Pecha Kuchas makes it a great way to start experimenting with public speaking. The first time I spoke publicy was at a Pecha Kucha on &lt;a href=&quot;https://github.com/orta/pechakucha/tree/1b92dd66d13654b7aa3024ced2ec6d052bfe6b1d&quot;&gt;folk dancing&lt;/a&gt; in the UK, and then later on the history of the game &lt;a href=&quot;http://orta.github.io/pechakucha/&quot;&gt;monopoly&lt;/a&gt;. At this point I&amp;#39;d like to open invites for people to talk, currently all of the slots are open and I will edit this post when all the slots are closed. &lt;/p&gt;

&lt;p&gt;You can join our &lt;a href=&quot;http://www.meetup.com/CocoaPods-NYC/&quot;&gt;NYC meetup group&lt;/a&gt; to keep up to date, and the event will allow RSVPs 2 weeks before on the 6th Nov. Thanks to &lt;a href=&quot;http://twitter.com/W5mith&quot;&gt;@W5mith&lt;/a&gt; &amp;amp; &lt;a href=&quot;http://meetup.com&quot;&gt;meetup.com&lt;/a&gt; for hosting us this time.&lt;/p&gt;

&lt;p&gt;Currently confirmed for the 20th&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/adamhowardprice/&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;adamhowardprice&quot;&gt;&lt;/a&gt;  Blake Watters -  &lt;a href=&quot;http://twitter.com/adamhowardprice&quot;&gt;@adamhowardprice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nilsou/&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;nilsou&quot;&gt;&lt;/a&gt;  Nils Hayat - &lt;a href=&quot;http://twitter.com/nilsou&quot;&gt;@nilsou&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/danielamitay/&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;danielamitay&quot;&gt;&lt;/a&gt;   Daniel Amitay - &lt;a href=&quot;http://twitter.com/danielamitay&quot;&gt;@danielamitay&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dstnbrkr/&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;dstnbrkr&quot;&gt;&lt;/a&gt;  Dustin Barker - &lt;a href=&quot;http://twitter.com/dstnbrkr&quot;&gt;@dstnbrkr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/irace/&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;irace&quot;&gt;&lt;/a&gt;  Bryan Irace - &lt;a href=&quot;http://twitter.com/irace&quot;&gt;@irace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/klaaspieter/&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;klaaspieter&quot;&gt;&lt;/a&gt;  Klaas Pieter - &lt;a href=&quot;http://twitter.com/klaaspieter&quot;&gt;@klaaspieter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/billymeltdown/&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;billymeltdown&quot;&gt;&lt;/a&gt;  Billy Gray - &lt;a href=&quot;http://twitter.com/billymeltdown&quot;&gt;@billymeltdown&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/jflinter/&quot;&gt;&lt;img src=&quot;/assets/blog_img/github_octokitty.png&quot; alt=&quot;jflinter&quot;&gt;&lt;/a&gt;  Jack Flintermann - &lt;a href=&quot;http://twitter.com/jflinter&quot;&gt;@jflinter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    <pubDate>Sun, 13 Oct 2013 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Cocoa-Kucha</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Cocoa-Kucha</guid>
  </item>
  
  
  
  <item>
    <title>CocoaPods 0.26</title>
    <description>&lt;p&gt;Today we are releasing CocoaPods 0.26.&lt;/p&gt;

&lt;p&gt;The most visible change is that CocoaPods now hides the schemes of the Pod
targets. If this doesn&amp;#39;t ring a bell the following image should.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/blog_img/CocoaPods-0.26/schemes-comparison.png&quot; style=&quot;display:block;margin-left:auto;margin-right:auto;&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Don&amp;#39;t fear though, the schemes are still there and if you need to check that a
CocoaPods generated target is behaving correctly you can easily make its
scheme visible.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/blog_img/CocoaPods-0.26/schemes-show.png&quot; style=&quot;border:2px solid white;display:block;margin-left:auto;margin-right:auto;&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Other improvements include the restoration of the compatibility with Xcode 4
which was creating issues in our linting process and the reorganization of the
Pods project.&lt;/p&gt;

&lt;p&gt;This release also features a contribution from the latest entry to our core
team: &lt;a href=&quot;https://twitter.com/kylefuller&quot;&gt;Kyle Fuller&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To install the last release of CocoaPods you can run:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;text language-text&quot; data-lang=&quot;text&quot;&gt;$ [sudo] gem install cocoapods
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Until version 1.0 we strongly encourage you to keep CocoaPods up to date.&lt;/p&gt;

&lt;p&gt;For all the details, don&amp;#39;t miss the
&lt;a href=&quot;https://github.com/CocoaPods/CocoaPods/blob/master/CHANGELOG.md&quot;&gt;Changelog&lt;/a&gt;.&lt;/p&gt;
</description>
    <pubDate>Tue, 08 Oct 2013 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/CocoaPods-0.26</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/CocoaPods-0.26</guid>
  </item>
  
  
  
  <item>
    <title>On Design</title>
    <description>&lt;p&gt;Interested in finding the CocoaPods Logo? Check out our &lt;a href=&quot;https://github.com/CocoaPods/shared_resources/tree/master/media&quot;&gt;Media Pack&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;CocoaPods is arguably one of the most important open source project in the Objective-C community. It&amp;#39;s used in thousands of applications and has hundreds of thousands of downloads.&lt;/p&gt;

&lt;p&gt;Building the tool, the community and the ecosystem around the project has happened organically with a mix of people coming and helping out to get us to a position where CocoaPods is essential to any project. &lt;/p&gt;

&lt;p&gt;Starting from May 2013, I&amp;#39;ve been working with &lt;a href=&quot;http://andy-myers.co.uk&quot;&gt;Andy Myers&lt;/a&gt; to try and re-think the systems around CocoaPods, ranging from how we do documentation to the branding. This blog post is to open up our process a bit and to explain how we came to some of these ideas.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;The first and most obvious change is the logo. Here it is in mono-colour.&lt;/p&gt;

&lt;p&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div style=&quot;background-color:white;&quot;&gt;
&lt;section class=&quot;container&quot;&gt;&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-10 col-md-offset-1&quot;&gt;&lt;center&gt;
&lt;a href=&#39;/assets/blog_img/design/logo.png &#39;&gt;&lt;img  src=&#39;/assets/blog_img/design/logo.png &#39;&gt;&lt;/a&gt;&lt;/center&gt;&lt;/article&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;section class=&quot;container&quot;&gt;
&lt;div class=&quot;row&quot;&gt;&lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;&lt;/p&gt;

&lt;p&gt;We took ideas from the Objective-C import directives, OS metaphors for text selection and colours from the Cocoa Pods themselves to create a new modern logo.&lt;/p&gt;

&lt;p&gt;CocoaPods itself is a collection of projects like the multiple gems that create the terminal tool, the search engine, CocoaDocs and more. We needed to find a way that we can provide a similar identity between all the different sub-projects that are public facing. In my opinion the &lt;a href=&quot;http://jquery.com&quot;&gt;jQuery&lt;/a&gt; foundation did a great job at this. By having the logo neatly split along the selected and unselected edge we can easily extend the logo depending on our needs.&lt;/p&gt;

&lt;p&gt;Once we had the logo down the visual identity was starting to appear, we spent some time looking at the analytics for cocoapods.org and tried to get a feel for how the website is used. Turns out most of the outgoing links are based on search queries. So we priorised the initial screen to give precedence for searching and then to go straight into learning for people who have just heard of the project.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/CocoaPods/shared_resources/tree/master/design/cocoapods.org&quot;&gt;&lt;img src=&quot;/assets/blog_img/design/desktop-website.png&quot; style=&quot;width:100%;background-color:#380200;border:2px solid white;&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Whilst looking at the analytics we were surprised to find that the percentage of mobile browsers wasn&amp;#39;t what we hoped it to be. So the designs were done in parallel for mobile and for desktop. &lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/CocoaPods/shared_resources/tree/master/design/cocoapods.org&quot;&gt;&lt;img src=&quot;/assets/blog_img/design/mobile-website.png&quot; style=&quot;width:100%;background-color:#380200;border:2px solid white;&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The work on the CocoaPods design is on-going and has just started; there&amp;#39;s a lot of focus now on the blog so that we can be sure of the foundations before moving on to the new user documentation. But that is a blog post for another time.&lt;/p&gt;
</description>
    <pubDate>Thu, 03 Oct 2013 01:20:16 +0000</pubDate>
    <link>https://blog.cocoapods.org/redesign</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/redesign</guid>
  </item>
  
  
  
  <item>
    <title>Why we don't accept donations</title>
    <description>&lt;p&gt;TL;DR: While we very much appreciate the sentiment, the project (as an entity) does not accept financial donations. &lt;/p&gt;

&lt;!-- more --&gt;

&lt;ol&gt;
&lt;li&gt;We are passionate about sharing. This means that we &lt;em&gt;will&lt;/em&gt; spend time on CocoaPods in our spare-time, even when that is not of immediate financial benefit to us (as described in point 2), but we &lt;em&gt;do&lt;/em&gt; get pleasure from working on something that can improve our small piece of the universe, without expecting any financial gains.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It is important to note, though, that the reason we have the opportunity to enjoy this form of spiritual fulfilment is only possible because we’re in well enough financial positions to be able to do this for free. We’re very much aware that some people are in much less fortunate positions and OSS donations are a real source of income.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In principle, we use CocoaPods for our paid work and as such spend time on improving it during work hours. Normally you should still invoice a client for setting up a project, so if that time is usually diminished, the times where we &lt;em&gt;do&lt;/em&gt; have to spend some time on CocoaPods for a specific project is balanced out and usually tilts in favour of the client.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CocoaPods, and OSS in general, &lt;em&gt;is&lt;/em&gt; our LinkedIn. We get to meet a lot of people around the world, which often leads to great opportunities for our careers in the future. This might not always be obvious to people, but it should not be underestimated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Financial donations &lt;em&gt;do&lt;/em&gt; add a feeling of responsibility, for some, &lt;em&gt;without&lt;/em&gt; the financial compensation we would normally offset that with. I.e. our hourly rates for contracting work would be much higher than a typical donation. The reason we do not want to add such feelings of responsibility is that it’s important for us, in the globally connected, fast-paced world we live in, to be able to say “not now, I feel like doing something completely different”. Burnout is something that can hit prolific open-source people pretty fast and we need to actively counteract that.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;so-what-can-you-do&quot;&gt;So what &lt;em&gt;can&lt;/em&gt; you do?&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Helping out with CocoaPods comes in many forms. For those that are not able to help out with (Ruby) code issues, there are still ways to do so. Writing documentation and triaging tickets before they get to us are probably the most helpful in the sense of relieving us from financial ‘losses’, as they save us a whole lot of time.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Also, by providing the tools for a vibrant community to do their magic, we benefit from the great Objective-C libraries that you all write and so we all do our part in the grand scheme of things.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;As a company, you can contract people of the core team for CocoaPods related work on your project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a company you can ‘sponsor’ by contracting people of the core team to implement specific features your company needs in CocoaPods (as this is real paid work, as opposed to donations, the tickets you sponsor &lt;em&gt;will&lt;/em&gt; be prioritised over others), or implement general CocoaPods improvements, which serve the community as a whole.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Other ways of sponsoring includes wide ranging topics, such as, legal consultancy, t-shirts, stickers, etc.&lt;/p&gt;

&lt;p&gt;Note that we do recognise companies for the work described in this section as ‘sponsors’, of which we keep a list in the README.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Finally, as said before, individual people might be in a less fortunate financial position and as such it’s perfectly ok to send donations through means like &lt;a href=&quot;https://www.patreon.com&quot;&gt;Patreon&lt;/a&gt;, if that individual accepts that. These are &lt;strong&gt;not&lt;/strong&gt; considered to be specific for the CocoaPods project, though.&lt;/li&gt;
&lt;/ol&gt;
</description>
    <pubDate>Mon, 23 Sep 2013 01:20:16 +0000</pubDate>
    <link>https://blog.cocoapods.org/Why-we-dont-accept-donations</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Why-we-dont-accept-donations</guid>
  </item>
  
  
  
  <item>
    <title>Using Acknowledgements</title>
    <description>&lt;p&gt;CocoaPods will generate two &amp;#39;Acknowledgements&amp;#39; files for each target specified in your Podfile. If the pods are coming from the master repo, then they must include one. Private pods don&amp;#39;t require one. These contain the License details for each Pod and for most of the part having them in your acknowledgements will be enough to conform to the license.&lt;/p&gt;

&lt;p&gt;CocoaPods generates a markdown file for general consumption, as well as a property list file that can be added to a settings bundle for an iOS application. You don&amp;#39;t need to do anything for this to happen, it will just work. If you&amp;#39;d like to know more about extra things you can do with this, read on.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h2 id=&quot;customization&quot;&gt;Customization&lt;/h2&gt;

&lt;p&gt;If you&amp;#39;re not happy with the default boilerplate text generated for the title, header
and footnotes in the files, it&amp;#39;s possible to customise these by overriding the methods
that generate the text in your &lt;code&gt;Podfile&lt;/code&gt; like this:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Pod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Generator&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Acknowledgements&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;header_text&lt;/span&gt;
    &lt;span class=&quot;s2&quot;&gt;&amp;quot;My custom header text&amp;quot;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;You can even go one step further and customise the text on a per target basis by checking against the target name, like this:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Pod&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Generator&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Acknowledgements&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;header_text&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@target_definition&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end_with?&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;MyTargetName&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;s2&quot;&gt;&amp;quot;Custom header text for MyTargetName&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
      &lt;span class=&quot;s2&quot;&gt;&amp;quot;Custom header text for other targets&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;These are the available methods to override: &lt;code&gt;header_title&lt;/code&gt;, &lt;code&gt;header_text&lt;/code&gt;, &lt;code&gt;footnote_title&lt;/code&gt; &amp;amp; &lt;code&gt;footnote_text&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;ios-settings-bundle&quot;&gt;iOS Settings Bundle&lt;/h2&gt;

&lt;p&gt;If you are using the generated &lt;code&gt;plist&lt;/code&gt; in your settings bundle you might want to update the file every time that you update your pods. This can be accomplished by adding to your &lt;code&gt;Podfile&lt;/code&gt; the following &lt;code&gt;post_install&lt;/code&gt; hook.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;ruby language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;post_install&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;installer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;fileutils&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;no&quot;&gt;FileUtils&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cp_r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;Pods/Pods-Acknowledgements.plist&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;Resources/Settings.bundle/Acknowledgements.plist&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:remove_destination&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;To access this from your Setting Bundle&amp;#39;s Root.plist replace your Root.plist with this:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      
      &lt;div style=&quot;background-color:white;&quot;&gt;
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;pre class=&#39;highlight&#39;&gt;&lt;code class=&quot;xml language-xml&quot; data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;&amp;lt;!DOCTYPE plist PUBLIC &amp;quot;-//Apple//DTD PLIST 1.0//EN&amp;quot; &amp;quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;plist&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;version=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;StringsTable&lt;span class=&quot;nt&quot;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Root&lt;span class=&quot;nt&quot;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;PreferenceSpecifiers&lt;span class=&quot;nt&quot;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;array&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Type&lt;span class=&quot;nt&quot;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;PSChildPaneSpecifier&lt;span class=&quot;nt&quot;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Title&lt;span class=&quot;nt&quot;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Acknowledgements&lt;span class=&quot;nt&quot;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;File&lt;span class=&quot;nt&quot;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Acknowledgements&lt;span class=&quot;nt&quot;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/plist&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;      &lt;/article&gt;
      &lt;/article&gt;
      &lt;/section&gt;
      &lt;/div&gt;
      
      &lt;section class=&quot;container&quot;&gt;
      &lt;article class=&quot;row&quot;&gt;
      &lt;article class=&quot;content col-md-8 col-md-offset-2&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Further details can be found in &lt;a href=&quot;http://martinhicks.net/2012/04/how-to-create-license-section-in-ios-settings-app&quot;&gt;Martin Hicks&amp;#39;s blog&lt;/a&gt;&lt;/p&gt;
</description>
    <pubDate>Sat, 10 Aug 2013 00:00:00 +0000</pubDate>
    <link>https://blog.cocoapods.org/Acknowledgements</link>
    <guid isPermaLink="true">https://blog.cocoapods.org/Acknowledgements</guid>
  </item>
  
  
</channel>
</rss>