<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Yunus Koçyiğit on Medium]]></title>
        <description><![CDATA[Stories by Yunus Koçyiğit on Medium]]></description>
        <link>https://medium.com/@kocyigityunus?source=rss-65881dbca53b------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*F-hMqLssdsvsYikX.</url>
            <title>Stories by Yunus Koçyiğit on Medium</title>
            <link>https://medium.com/@kocyigityunus?source=rss-65881dbca53b------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 24 Apr 2026 05:45:39 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@kocyigityunus/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[How to configure Xcode projects for different environments?]]></title>
            <link>https://kocyigityunus.medium.com/how-to-configure-xcode-projects-for-different-environments-30b23ed44ee6?source=rss-65881dbca53b------2</link>
            <guid isPermaLink="false">https://medium.com/p/30b23ed44ee6</guid>
            <category><![CDATA[xcode]]></category>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[ios]]></category>
            <dc:creator><![CDATA[Yunus Koçyiğit]]></dc:creator>
            <pubDate>Mon, 07 Dec 2020 19:42:14 GMT</pubDate>
            <atom:updated>2020-12-07T19:59:15.425Z</atom:updated>
            <content:encoded><![CDATA[<p>Today, I want to share different configuration techniques for Xcode projects with you for different environments like; development, beta, QA, pilot, production, etc.</p><p>First of all, ❗️ <strong>do not use targets for environmental configuration purposes.</strong></p><p>Let’s start with creating a new <strong>Debug</strong> and <strong>Release</strong> configuration for each of our environments. Like; Development Debug, Test Release, QA Release, Test Debug, Production Release, etc.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EHsU1xdwQWjAos3m2q5qhQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Z_2Cdc6c4Mwfb4BWOeF-2Q.png" /></figure><p>Also for CocoaPods, we should update .Podfile for newly created configurations.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OzH2Hz2gIknoIrFNQi1jvQ.png" /></figure><p>Let’s create schemes for each configuration sets. Development, Test, QA, Production, etc. Make sure that we’re <strong>sharing those schemes</strong> and <strong>selected the right Build Configurations.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6YD7EBLqUwYMYIobiD0Y6A.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OTGiPiD96BCZcAxyg2lORg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JGiXjQRcLXGvz0GXJ-yroA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kpSW08ZNKs5cfAiVKl3CpA.png" /></figure><p>So, how to set different values for different configurations? App Name, Bundle Identifier, API URL, .framework file?</p><p>First things first.</p><p>Let’s start with basics like App Name, Bundle Identifier, Icon Set Name, etc. Every configuration set has to have a different name, bundle identifier, and maybe icon for <strong>easier recognization</strong>.</p><pre>| Bundle Identifier    | App Name    | Icon Set Name               |<br>| -------------------- | ----------- | --------------------------- |<br>| com.mycomp.myapp     | MyApp       | Original Icon               |<br>| com.mycomp.myapp.dev | Dev - MyApp | Development Icon            |<br>| com.mycomp.myapp.qa  | QA - MyApp  | Photo of one of the testers |</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6RffuZc4hnBS0ECrpBBHkA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Rp6U4WpTu8D56ZF0ZcQMwA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dRLJbvRPugnXJsxWhCSnBw.png" /></figure><p>We also need to create our own properties for other purposes. API URL, API Key, maybe another Info.plist, .so, or another framework?</p><p>There are 5 ways of achieving this. User-Defined settings, <strong>Xcode configuration files</strong>, multiple Info.plists, <strong>preprocessor macros</strong>, and <strong>custom script phases.</strong></p><ol><li><strong>User-Defined Settings</strong></li></ol><p>✅ Easy</p><p>⛔️ Not readable, especially on conflicts at .xcodeproj file</p><p>⛔ ️Have to pass data to Info.plist</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tvUMWckA6Whk0nYFCJSa8g.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_dhOKaiwPK8RFf8KjRJYUA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uBZ1BbNnwpSB54R-mIvnDg.png" /></figure><p>Additional tip before the second option.</p><p>❗️Always log your build settings and environment variables. Also, keep your build logs with your .xarchives.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uKXZsDEG3mhU7KlwDOiGqg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EGP1VGQLH0yQzBOQlD7a2A.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fa7Z82vGq3W8eXQtsHIH-A.png" /></figure><p>2. <strong>Xcode configuration files</strong></p><p>✅ Easily readable</p><p>✅ Easy to see changes in git</p><p>✅ Supports conditional properties</p><p>⛔ Have to escape manually</p><p>⛔ Have to pass data to Info.plist</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GSe3Tw_OVAwNw7mYKnkJIA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3e8BK22YcAwRwighnvz9DA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UlFaPadf-CEtH8zhTZSMlg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*MIokqozPGygBc0VcslaHow.png" /></figure><p>3. <strong>Using different Info.plists</strong></p><p>✅ Semi Readable</p><p>✅ Easy to see changes in git</p><p>⛔ If you make a change on the project that interests Info.plist. You have to copy change into all of Info.plists.</p><p>⛔ Sometimes doesn’t feel right.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lkfnuFlriQ63x0C66wjD8g.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Y_EGmI8lqJ3fvMlLDhmpJQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FPbSzWGUq7XnWR7WmsDiTA.png" /></figure><p>4. <strong>Preprocessor macros</strong></p><p>✅ Most readable choice</p><p>✅ Best for quick, non-vital configurations. Like; changing log type for a framework.</p><p>✅ Can use the same macro for different configurations and combine them.</p><p>⛔ Can be broken with .xcodeproj file merges, changes.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*k0o_c3LYE2xjmOuQLpsANA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SSWdo2Z-hERgs3_EJDqALw.png" /></figure><p>5. <strong>Script Phases</strong></p><p>✅ Best for changing frameworks, libraries, whole files, etc.</p><p>Easier to understand with a Firebase, GoogleService-Info.plist example.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iFuhTA9vWmuDGMUV-g1ZcA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*y7AZWDjyb6HReZLij6uanw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IvoaJE5NkrVpmxYe0rPWtQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5yFuknkrgXN64a5FxgsMow.png" /></figure><p>Thank you for reading. If you have any thoughts please feel free to share them in the comments.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=30b23ed44ee6" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[CharacterSet’s and How to Use Them in Swift?]]></title>
            <link>https://kocyigityunus.medium.com/charactersets-and-how-to-use-them-in-swift-eabacd9879e7?source=rss-65881dbca53b------2</link>
            <guid isPermaLink="false">https://medium.com/p/eabacd9879e7</guid>
            <category><![CDATA[objective-c]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[ios]]></category>
            <dc:creator><![CDATA[Yunus Koçyiğit]]></dc:creator>
            <pubDate>Mon, 19 Aug 2019 14:40:12 GMT</pubDate>
            <atom:updated>2019-08-19T14:40:12.141Z</atom:updated>
            <content:encoded><![CDATA[<h4>What Is a CharacterSet?</h4><p>a CharacterSet is a struct defined in Foundation Framework. It represents certain character arrays like;</p><ul><li>decimal digits (CharacterSet.decimalDigits)</li><li>white space characters (CharactersSet.whitespaces),</li><li>lowercase letters (CharacterSet.lowercaseLetters)</li><li>illegal characters (CharacterSet.illegalCharacters)</li><li>punctuation characters (CharacterSet.punctuationCharacters)</li><li>and <a href="https://developer.apple.com/documentation/foundation/characterset">many more</a>.</li></ul><h4>How To Know What’s Inside a CharacterSet?</h4><p>Unfortunately, the CharacterSet struct doesn’t have a method or property to get characters by default, but fortunately, we can extend ChracterSet struct to get characters from it.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/3bd4fb2a0fcfb5401439bc78fae5ebd5/href">https://medium.com/media/3bd4fb2a0fcfb5401439bc78fae5ebd5/href</a></iframe><p>Let’s look at what’s inside a sample CharacterSet.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/101838cd4334bc4802e733b1a6471b03/href">https://medium.com/media/101838cd4334bc4802e733b1a6471b03/href</a></iframe><p>As you can see, CharacterSet.decimalDigits CharacterSet includes decimal digit characters from many different languages, also in emoji form.</p><p>You can look at the <a href="https://developer.apple.com/documentation/foundation/characterset">documentation</a> for the list of predefined CharacterSets.</p><h4>Why And How To Use a CharacterSet?</h4><ul><li>Trimming unwanted characters from a String (removing from start and end)</li><li>Filtering unwanted characters from a String (removing from anywhere in String)</li><li>Validating a String</li><li>Representing certain characters to allow in a String (like percentEncoding)</li></ul><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/c79d69f17213ff706c0c375cd3595001/href">https://medium.com/media/c79d69f17213ff706c0c375cd3595001/href</a></iframe><p>As on the Swift code example, we can extend String struct to add CharacterSet helpers.</p><h4>Extending CharacterSet</h4><p>We can extend CharacterSet struct to add our own CharacterSets.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/932/1*EVPoslN8Q5Mrf6ZUpmZjKg.png" /></figure><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/7fcb26777718d6f6561708ff121113ba/href">https://medium.com/media/7fcb26777718d6f6561708ff121113ba/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=eabacd9879e7" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to create a ListView in React Native with Section Headers]]></title>
            <link>https://kocyigityunus.medium.com/how-to-create-a-listview-in-react-native-with-section-headers-6526143dd5a6?source=rss-65881dbca53b------2</link>
            <guid isPermaLink="false">https://medium.com/p/6526143dd5a6</guid>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Yunus Koçyiğit]]></dc:creator>
            <pubDate>Sat, 13 Aug 2016 19:49:41 GMT</pubDate>
            <atom:updated>2019-08-19T10:02:17.419Z</atom:updated>
            <content:encoded><![CDATA[<p>Let&#39;s create a ListView with section headers in React Native.</p><p>First, we need a suitable data to show with sections and rows. I copied this data from a pizza restaurant menu.</p><pre>var menuData = {<br>  menu : [<br>    {<br>      menuSectionId : 1,<br>      menuSectionName : &#39;Classic Pizzas&#39;,<br>      items : [<br>        {<br>          itemId : 1,<br>          itemName : &#39;Margharita&#39;,<br>          itemDescription  : &#39;Cheese &amp; tomato&#39;,<br>          itemPrice :  3.95<br>        },<br>        {<br>          itemId : 2,<br>          itemName : &#39;Mediterranean&#39;,<br>          itemDescription  : &#39;Mushrooms, green peppers, red onion &amp; garlic&#39;,<br>          itemPrice :  4.95<br>        },<br>        {<br>          itemId : 3,<br>          itemName : &#39;Pepperoni Passion&#39;,<br>          itemDescription  : &#39;Heaps of pepperoni&#39;,<br>          itemPrice :  4.95<br>        },<br>        {<br>          itemId : 4,<br>          itemName : &#39;Chicken Feast&#39;,<br>          itemDescription  : &#39;Chicken, mushrooms &amp; sweetcorn&#39;,<br>          itemPrice :  4.95<br>        },<br>      ]<br>    },<br>    {<br>      menuSectionId : 2,<br>      menuSectionName : &#39;Favourite Pizzas&#39;,<br>      items : [<br>        {<br>          itemId : 5,<br>          itemName : &#39;Hot &amp; Spicy&#39;,<br>          itemDescription  : &#39;Onions, spicy mince, jalapenos &amp; mixed peppers&#39;,<br>          itemPrice :  5.95<br>        },<br>        {<br>          itemId : 6,<br>          itemName : &#39;Tandoori Sizzler&#39;,<br>          itemDescription  : &#39;Tandoori chicken, onions, mushrooms, green peppers &amp; jalapenos&#39;,<br>          itemPrice :  6.95<br>        },<br>        {<br>          itemId : 7,<br>          itemName : &#39;Vegetarian Supreme&#39;,<br>          itemDescription  : &#39;Onions, green peppers, sweetcorn, mushrooms &amp; tomatoes&#39;,<br>          itemPrice :  5.95<br>        },<br>        {<br>          itemId : 8,<br>          itemName : &#39;Meatilicious&#39;,<br>          itemDescription  : &#39;Spicy mince, pepperoni &amp; chicken tikka&#39;,<br>          itemPrice :  6.95<br>        },<br>        {<br>          itemId : 9,<br>          itemName : &#39;Mexican&#39;,<br>          itemDescription  : &#39;Spicy mince, pepperoni &amp; red onions&#39;,<br>          itemPrice :  5.95<br>        },<br>        {<br>          itemId : 10,<br>          itemName : &#39;Prestige&#39;,<br>          itemDescription  : &#39;Pepperoni, chicken tikka, spicy mince, red onions, green peppers &amp; mushrooms&#39;,<br>          itemPrice :  6.95<br>        },<br>      ]<br>    },<br>    {<br>      menuSectionId : 3,<br>      menuSectionName : &#39;Sides&#39;,<br>      items : [<br>        {<br>          itemId : 11,<br>          itemName : &#39;Potato Wedges&#39;,<br>          itemDescription  : null,<br>          itemPrice :  1.55<br>        },<br>        {<br>          itemId : 12,<br>          itemName : &#39;Fries&#39;,<br>          itemDescription  : null,<br>          itemPrice :  1.55<br>        },<br>        {<br>          itemId : 13,<br>          itemName : &#39;Vegetable Pakora&#39;,<br>          itemDescription  : null,<br>          itemPrice :  1.95<br>        },<br>        {<br>          itemId : 14,<br>          itemName : &#39;Chicken Pakora&#39;,<br>          itemDescription  : null,<br>          itemPrice :  2.95<br>        },<br>        {<br>          itemId : 15,<br>          itemName : &#39;Mushroom Pakora&#39;,<br>          itemDescription  : null,<br>          itemPrice :  1.95<br>        },<br>        {<br>          itemId : 16,<br>          itemName : &#39;Chicken Wings (6 pcs)&#39;,<br>          itemDescription  : null,<br>          itemPrice :  3.95<br>        },<br>        {<br>          itemId : 17,<br>          itemName : &#39;Plain Nan&#39;,<br>          itemDescription  : null,<br>          itemPrice :  1.95<br>        },<br>        {<br>          itemId : 18,<br>          itemName : &#39;Garlic Nan&#39;,<br>          itemDescription  : null,<br>          itemPrice :  2.25<br>        },<br>      ]<br>    },<br>  ]<br>};</pre><p>To show this data as list view we need to restructure this data as list view wants. List view wants 3 things.</p><ol><li>data blob, which is an object</li><li>sections ids, which is an array of strings</li><li>row ids, which is an array of array of strings [[‘s1’, ‘s2’], [‘s3’], [‘s4’]]</li></ol><p>You can look the code piece’s comments for more explanation.</p><pre>_getStructuredData(data){</pre><pre>/* sample of data will return<br>    dataBlob must be an object<br>    sectionIds must be an array of strings<br>    rowIds must be an array of array of strings<br>    var dataBlob = {<br>      &#39;s1&#39; : {<br>        &#39;sample&#39; : &#39;sample1&#39;,<br>        &#39;blabla&#39; : &#39;blablabla1&#39;,<br>        &#39;s1r1&#39; : { a : 1, b : 1 },<br>        &#39;s1r2&#39; : { a : 2, b : 2 },<br>      },<br>      &#39;s2&#39; : {<br>        &#39;sample&#39; : &#39;sample2&#39;,<br>        &#39;blabla&#39; : &#39;blablabla2&#39;,<br>        &#39;s2r1&#39; : { a : 3, b : 3 },<br>        &#39;s2r2&#39; : { a : 4, b : 4 },<br>      }<br>    };<br>    var sectionIds = [&#39;s1&#39;,&#39;s2&#39;];<br>    var rowIds = [ [&#39;s1r1&#39;,&#39;s1r2&#39;], [&#39;s2r1&#39;, &#39;s2r2&#39;] ];<br>    */</pre><pre>var dataBlob = {};<br>    var sectionIds = [];<br>    var rowIds = [];</pre><pre>data.menu.forEach(function(menuSection){<br>      var section = menuSection;<br>      var menuSectionId = &#39;s&#39; + section.menuSectionId; // section id will be a string<br>      var rIds = [];</pre><pre>menuSection.items.forEach(function(item){<br>        var itemId = menuSectionId + &#39;i&#39; + item.itemId;<br>        section[itemId] = item;<br>        rIds.push(itemId);<br>      });</pre><pre>dataBlob[menuSectionId] = section;<br>      sectionIds.push(menuSectionId);<br>      rowIds.push(rIds);<br>    });</pre><pre>console.log(&#39; dataBlob :&#39;, dataBlob );<br>    console.log(&#39; sectionIds :&#39;, sectionIds );<br>    console.log(&#39; rowIds :&#39;, rowIds );</pre><pre>return {<br>      dataBlob : dataBlob,<br>      sectionIds : sectionIds,<br>      rowIds : rowIds<br>    };</pre><pre>}</pre><p>Section headers sticks to the top of list view as default on ios. But android doesn’t have this feature now as react native 0.31.</p><p>You can find full code at <a href="https://rnplay.org/apps/Byto6A"><strong>https://rnplay.org/apps/Byto6A</strong></a> . also you can try it from that link.</p><p>Here’s a picture of how it looks:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/686/1*eTnPL242OUbmKL5ePIrU7g.png" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6526143dd5a6" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>