<?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 Alfian Losari on Medium]]></title>
        <description><![CDATA[Stories by Alfian Losari on Medium]]></description>
        <link>https://medium.com/@alfianlosari?source=rss-192bb381a5de------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/2*sF4GXkUthJ-1swTR5awZ2g.jpeg</url>
            <title>Stories by Alfian Losari on Medium</title>
            <link>https://medium.com/@alfianlosari?source=rss-192bb381a5de------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 15 Apr 2026 18:53:38 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@alfianlosari/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[Courier For Flutter Is Here!]]></title>
            <link>https://medium.com/gojekengineering/courier-for-flutter-is-here-3f7d7f7553bf?source=rss-192bb381a5de------2</link>
            <guid isPermaLink="false">https://medium.com/p/3f7d7f7553bf</guid>
            <category><![CDATA[tech]]></category>
            <category><![CDATA[flutter]]></category>
            <category><![CDATA[gojek]]></category>
            <category><![CDATA[courier]]></category>
            <category><![CDATA[mqtt]]></category>
            <dc:creator><![CDATA[Alfian Losari]]></dc:creator>
            <pubDate>Fri, 14 Oct 2022 06:30:36 GMT</pubDate>
            <atom:updated>2022-10-14T06:30:36.848Z</atom:updated>
            <content:encoded><![CDATA[<h4><strong>Add Courier, the information superhighway, to your cross-platform Mobile Apps!</strong></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aPiyDCcnLlNeUQ0NTWmv9Q.jpeg" /></figure><p>Courier is the information superhighway for making persistent connection between client and server. Since we <a href="https://bit.ly/3yQmgUG">open sourced</a> Courier Client Libraries for Android &amp; iOS, we’ve been focusing on adding Flutter support using both libraries as foundation.</p><blockquote>Courier is our solution to provide a real-time, lightweight, and highly efficient messaging highway between mobile apps and servers using MQTT.</blockquote><h4>Why Flutter, you ask?</h4><p>Flutter is a very popular framework for building mobile apps with nearly half a million apps released. Considering that staggering number of apps, we also want to contribute to the Flutter Community by releasing the official Dart Library so Courier can also be used in building Flutter Apps.</p><ul><li><a href="https://github.com/gojek/courier-flutter">GitHub - gojek/courier-flutter: Dart port of our popular courier library</a></li><li><a href="https://pub.dev/packages/courier_dart_sdk">courier_dart_sdk | Flutter Package</a></li></ul><p>With Courier Dart library, one can create a long-running persistent connection to any MQTT broker targeting Android and iOS platforms. Under the hood, we call platform-specific native APIs that depends on Courier library:</p><ol><li>Kotlin/Java on Android: <a href="https://github.com/gojek/courier-android">courier-android</a></li><li>Swift/Objective-C on iOS: <a href="http://courier-ios/">courier-iOS</a></li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/641/1*Qxdko7xoyneYe9oZkOq7Dw.jpeg" /><figcaption>Courier Flutter Dart Method Channel</figcaption></figure><h3><strong>Features</strong></h3><h4><strong>Quality of Service</strong></h4><p>All Courier libraries support three QoS levels for reliable message delivery: 0 (at most once), 1 (at least once) and 2(exactly once).</p><h4><strong>Automatic Reconnect</strong></h4><p>All Courier libraries are able to reconnect automatically whenever there are network or other unexpected failures using a connection retry policy.</p><h4><strong>Clean &amp; easy to understand APIs</strong></h4><p>All Courier libraries provide clean APIs for connect/disconnect, subscribe/unsubscribe and publish/receivefunctionalities. The APIs are simple and easy to understand.</p><h4><strong>Observability</strong></h4><p>Courier libraries also provide events for tracking end-to-end message delivery and connection lifecycle.</p><h4><strong>Disk Persistence</strong></h4><p>Courier provides QoS 1 &amp; QoS 2 messages in case the user is offline when sending those messages</p><h4><strong>Event Provider</strong></h4><p>The client can optionally listen to system events such as connection success, failure, connection lost, message received and many more for analytics tracking.</p><h4><strong>Documentation</strong></h4><p>All Courier Libraries are well-documented with examples. We host the documentation in GitHub Pages.</p><p>You can read more about Courier from our GitHub pages . We have also covered <a href="https://medium.com/gojekengineering/courier-library-for-gojeks-information-superhighway-368dc5f052fa">Android</a> &amp; <a href="https://medium.com/gojekengineering/courier-a-realtime-lightweight-messaging-highway-in-ios-with-mqtt-1dc7dffa951a">iOS</a> libraries in detail in our blog posts.</p><p><a href="https://gojek.github.io/courier/">Courier · Information Superhighway</a></p><p>We have also written a five-part series covering Courier background and usage in Gojek for your weekend tech reading!</p><p><a href="https://bit.ly/3jCOARH">Introducing Courier - The Information Superhighway Between Mobile &amp; Server - 5 min read</a></p><p>Thanks for reading and we look forward to your feedback. Contributions to the library are welcome!</p><h4><strong>How to reach out?</strong></h4><p>You can join our <a href="https://discord.gg/C823qK4AK7">discord server</a> to connect with the team behind this amazing project.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IPWwoozDxeKoXMtXEyrtLw.png" /></figure><p>Find more stories from our vault, <a href="https://www.gojek.io/blog">here</a>.<br>Check out open job positions by clicking below:</p><figure><a href="https://bit.ly/gojekjobsblogs2022"><img alt="" src="https://cdn-images-1.medium.com/max/700/1*c2_eIvR2WDUWnP6YmzcGpQ.jpeg" /></a></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3f7d7f7553bf" width="1" height="1" alt=""><hr><p><a href="https://medium.com/gojekengineering/courier-for-flutter-is-here-3f7d7f7553bf">Courier For Flutter Is Here!</a> was originally published in <a href="https://medium.com/gojekengineering">Gojek Product + Tech</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Courier — A Realtime Lightweight Messaging Highway in iOS with MQTT]]></title>
            <link>https://medium.com/gojekengineering/courier-a-realtime-lightweight-messaging-highway-in-ios-with-mqtt-1dc7dffa951a?source=rss-192bb381a5de------2</link>
            <guid isPermaLink="false">https://medium.com/p/1dc7dffa951a</guid>
            <category><![CDATA[tech]]></category>
            <category><![CDATA[gojek]]></category>
            <category><![CDATA[mqtt]]></category>
            <category><![CDATA[ios]]></category>
            <dc:creator><![CDATA[Alfian Losari]]></dc:creator>
            <pubDate>Tue, 26 Oct 2021 05:27:33 GMT</pubDate>
            <atom:updated>2021-10-26T05:27:33.859Z</atom:updated>
            <content:encoded><![CDATA[<h3>Building A Messaging Highway For Our iOS Apps</h3><h4>How we built a Courier library for iOS with MQTT.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cBhHBqbBhBp3bZmVi0jEnA.jpeg" /></figure><p>Here is a summary of the previous posts so far in the series:</p><ul><li><a href="https://bit.ly/3jCOARH">Introduction of Courier</a> — An information superhighway between Mobile and Server.</li><li><a href="https://bit.ly/2XCwjwp">Courier Message Broker </a>— Benchmark of various brokers and reasoning behind choosing VerneMQ.</li><li><a href="https://bit.ly/3kVLERW">Courier Android Library</a> — Discussed challenges in Android and background to provide clean API, multi message adapters support, adaptive keep alive, and many more!</li></ul><p>We’ve already rolled out Courier for our Android Merchant app to send order updates with high reliability and efficiency. We also intend to utilise Courier in the Gojek consumer app to improve user experience.</p><h3>Introduction</h3><p>Every time an order is made on GoFood, customers see an Active Order Screen, which looks like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5quppzgL4F099e40spdwRQ.png" /><figcaption>GoFood Active Order Screen</figcaption></figure><p>The screen shows information such as driver location on the map, a timeline update of the order status, etc. The timeline starts from restaurant order acceptance until the food is delivered by the driver to the customer’s location.</p><p>We believe this is the best starting point for us to utilise Courier in Gojek consumer app as we were using HTTP pooling to get the latest food order status update. This was not efficient in terms of power and data consumption. We’re passionate about delivering the best experience, while also ensuring our app’s energy and data consumption is as efficient as possible.</p><p>As we started rolling out Courier to Gojek consumer App, we also needed to build the Courier library for iOS which provided the same set of features and API to the equivalent Courier Android library.</p><h3>Background of Courier iOS Library</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*xdh_U5ynHxlPePJuMVp3fw.png" /><figcaption>Courier iOS High Level Architecture</figcaption></figure><p>The Courier iOS library high level architecture is designed with several goals in minds:</p><ol><li>Provide an abstract and simple interface for the client to subscribe to topics, receive stream of messages based on the topics subscribed, and publish messages to topics with any QoS.</li><li>The communication protocol should be agnostic and hidden from the client. With this, we should be able to switch to any communication protocol without much change from the client. (MQTT, WebSocket, etc).</li><li>The library used should be agnostic, so we can switch to any library without much effort (CocoaMQTT, MQTTClientFramework, etc).</li></ol><p>With these goals in mind, we decided to build Courier iOS library instead of just using a MQTT library directly.</p><h3>MQTT Libraries on iOS</h3><p>There are 2 most used open source libraries that we can use to integrate MQTT:</p><ol><li><a href="https://github.com/novastone-media/MQTT-Client-Framework">MQTT-Client-Framework</a> is a native Objective-C iOS library. It uses CFNetwork for networking and CoreData for persistence. It is a complete implementation of MQTT 3.1.1 and supports TLS.</li><li><a href="https://github.com/emqx/CocoaMQTT">CocoaMQTT</a> is a MQTT v3.1.1 client library for iOS written with Swift 5. It uses CocoaAsyncSocket for networking and currently has no disk persistence support as of v1.2.5.</li></ol><p>We have explored both libraries and created the comparative analysis table for both libraries below.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lOIxQA_T4-0W11DB7IYeuA.png" /><figcaption>CocoaMQTT &amp; MQTTClientFramework Comparison</figcaption></figure><p>On our initial experiment, we decided to use <strong>CocoaMQTT </strong>on Courier; since it is written on Swift, most of the APIs seems pretty modern and <em>Swifty</em> compared to <strong>MQTTClientFramework </strong>which uses native Objective-C.</p><p>It served us pretty well without any issues for receiving messages from broker. But, as our future use cases will require the app to also publish message to broker, the requirement to support <strong>disk persistence</strong> and <strong>offline message buffering</strong> became super important. This will ensure us to persist message sent while the user has poor or no internet connection and send it when the user is reconnected.</p><p>As of version <strong>1.25</strong>, <strong>CocoaMQTT</strong> doesn’t have this feature, so instead of reinventing the wheel and wasting resources, we decided to switch to use <strong>MQTTClientFramework</strong> which provide full QoS 1 &amp; 2 disk persistence and offline message buffering. Based on our testing, it worked really well for both publishing and receiving messages.</p><h3>Courier iOS Library Features</h3><p>Courier is not just a simple wrapper on top of <strong>MQTTClientFramework</strong>. It also provides several main features to increase robustness and reliability for the iOS client app to communicate with the broker. Let me walk you through of all the main features of iOS Courier library.</p><h4>Clean and Reactive API</h4><p>Courier provides clean and simple API to connect, subscribe, and receive stream of messages from subscribed topic. With the nature of persistent realtime long run connection that process messages asynchronously, we designed Courier API to be reactive using Combine Publisher and Subscriber pattern.</p><pre>// Method to get publisher for a subscribed topic<strong><br>func</strong> messagePublisher&lt;D&gt;(topic: String) -&gt; AnyPublisher&lt;D, Never&gt;</pre><pre>// Usage (type of model is generic using type inference)<br>courier.subscribe(topic: topic, qos: qos)<br>courier.messagePublisher(topic: topic)<br>.sink { [<strong>weak</strong> <strong>self</strong>] (message: Message) <strong>in<br>   self?</strong>.handleMessageReceiveEvent(.success(message))<br>}<br>.store(in: &amp;cancellables)</pre><h4>Multi Message Adapter Support</h4><p>Courier provides multi message adapters that supports various serialisation formats such as JSON, Protobuf, XML, or anything else that can be serialised into data and deserialised into model.</p><p>User of Courier can also implement their own custom message adapter by implementing <strong>MessageAdapter</strong> protocol (example of <strong>ProtobufMessageAdapter</strong>).</p><pre><strong>import SwiftProtobuf</strong></pre><pre><strong>class</strong> ProtobufMessageAdapter: MessageAdapter {<br>   </pre><pre>    <strong>func</strong> fromMessage&lt;T&gt;(<strong>_</strong> message: Data) <strong>throws</strong> -&gt; T {<br>        // Deserialize to Protobuf Message<br>    }</pre><pre><strong>    func</strong> toMessage&lt;T&gt;(data: T) <strong>throws</strong> -&gt; Data {<br>        //Serialize Protobuf Message to Data<br>    }<br>}</pre><h4>Subscription Store</h4><p>Courier provides subscription store to manage currently subscribed topics and pending unsubscribe topics. This is super useful to avoid <strong>stale subscriptions</strong> in broker when the user connects with <strong>clean session flag</strong> set to <strong>false</strong>.</p><h4>Fallback Policies</h4><p>Courier provides several built in fallback policies for various Courier lifecycle system events (connection lost, connection failure, subscribe failure, and many more). User can react and provide their fallback logic in case of failure (for example fallback to HTTP polling). The user can also implements their own custom fallback policy and react to various Courier system events accordingly.</p><h4>Database Persistence and Offline Message Buffer</h4><p><strong>MQTTClientFramework</strong> provides this feature to persist QoS 1 and QoS 2 messages in case the user is offline when sending those messages. It will retry to send the messages maintaining the order when the internet connection is back.</p><h4>Automatic Reconnect</h4><p>Courier provides the reconnect mechanism to handle the case where the internet connection is lost and whether it should retry to connect when the internet connection is reachable.</p><h4>Custom Authentication Provider</h4><p>In case, the user needs to be authenticated when connecting to the broker using username and password. Courier provides API to delegate the authentication handling from the user side. The user should be able to implement their own custom authentication to get the username and password used for making connection to the broker.</p><h4>Event Provider</h4><p>The user can optionally listen to Courier system events such as connection success, connection lost, message received from a topic, and many more). This is pretty useful in case they want to add analytics and metrics for their use case.</p><h3>Conclusion</h3><p>Courier is our solution to provide a realtime, lightweight, and high efficient messaging highway between mobile apps and server using MQTT.</p><p>With Courier at Gojek, we have just scratching the surface of many possible future use cases that we are planning to implement such as:</p><ol><li>Chatting.</li><li>Realtime app metrics &amp; analytics.</li><li>Any realtime bi-directional data sharing (e.g collaborative cart sharing, etc)</li></ol><p>Thanks for reading and stay tuned for our upcoming articles!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IPWwoozDxeKoXMtXEyrtLw.png" /></figure><p>Click <a href="https://www.gojek.io/blog">here</a> to read more stories about how we do what we do.</p><p>And we’re hiring! Check out the link below:</p><figure><a href="https://bit.ly/gojekjobsblogs2021"><img alt="" src="https://cdn-images-1.medium.com/max/700/1*c2_eIvR2WDUWnP6YmzcGpQ.jpeg" /></a></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1dc7dffa951a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/gojekengineering/courier-a-realtime-lightweight-messaging-highway-in-ios-with-mqtt-1dc7dffa951a">Courier — A Realtime Lightweight Messaging Highway in iOS with MQTT</a> was originally published in <a href="https://medium.com/gojekengineering">Gojek Product + Tech</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Using Swift 5.5 Async Await to Fetch REST API]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://alfianlosari.medium.com/using-swift-5-5-async-await-to-fetch-rest-api-cb1e4043b55c?source=rss-192bb381a5de------2"><img src="https://cdn-images-1.medium.com/max/1920/1*-JjBPZ4rjislLPw6I81Oow.png" width="1920"></a></p><p class="medium-feed-snippet">As an iOS developer, most probably you already have lot of experiences to fetch REST API from multiple endpoints. In some instances, the&#x2026;</p><p class="medium-feed-link"><a href="https://alfianlosari.medium.com/using-swift-5-5-async-await-to-fetch-rest-api-cb1e4043b55c?source=rss-192bb381a5de------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://alfianlosari.medium.com/using-swift-5-5-async-await-to-fetch-rest-api-cb1e4043b55c?source=rss-192bb381a5de------2</link>
            <guid isPermaLink="false">https://medium.com/p/cb1e4043b55c</guid>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[async-functions]]></category>
            <category><![CDATA[asyncawait]]></category>
            <category><![CDATA[swift-programming]]></category>
            <category><![CDATA[concurrency]]></category>
            <dc:creator><![CDATA[Alfian Losari]]></dc:creator>
            <pubDate>Mon, 31 May 2021 07:55:30 GMT</pubDate>
            <atom:updated>2021-05-31T07:57:24.736Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Building Expandable List with OutlineGroup & DisclosureGroup in SwiftUI 2.0]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://alfianlosari.medium.com/building-expandable-list-with-outlinegroup-disclosuregroup-in-swiftui-2-0-aa9dda14bbab?source=rss-192bb381a5de------2"><img src="https://cdn-images-1.medium.com/max/2600/1*V2Evnd0wDEmAhmWKA49ztg@2x.png" width="3826"></a></p><p class="medium-feed-snippet">we&#x2019;re going to explore about OutlineGroup and DisclosureGroup, and how we can use them in practice to build expandable list with nested&#x2026;</p><p class="medium-feed-link"><a href="https://alfianlosari.medium.com/building-expandable-list-with-outlinegroup-disclosuregroup-in-swiftui-2-0-aa9dda14bbab?source=rss-192bb381a5de------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://alfianlosari.medium.com/building-expandable-list-with-outlinegroup-disclosuregroup-in-swiftui-2-0-aa9dda14bbab?source=rss-192bb381a5de------2</link>
            <guid isPermaLink="false">https://medium.com/p/aa9dda14bbab</guid>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[swift-programming]]></category>
            <category><![CDATA[ui]]></category>
            <category><![CDATA[swiftui]]></category>
            <dc:creator><![CDATA[Alfian Losari]]></dc:creator>
            <pubDate>Wed, 22 Jul 2020 04:05:42 GMT</pubDate>
            <atom:updated>2020-07-31T13:11:32.806Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Building Swift Serverless REST API with AWS Lambda & DynamoDB]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://alfianlosari.medium.com/building-swift-serverless-rest-api-with-aws-lambda-dynamodb-58db2302895f?source=rss-192bb381a5de------2"><img src="https://cdn-images-1.medium.com/max/2600/1*81K0DFYgaPqpF_Xeba8NwQ@2x.png" width="3826"></a></p><p class="medium-feed-snippet">In this tutorial, we&#x2019;ll build a simple Swift Serverless REST API endpoints to create, update, delete, and retrieve list of todo items</p><p class="medium-feed-link"><a href="https://alfianlosari.medium.com/building-swift-serverless-rest-api-with-aws-lambda-dynamodb-58db2302895f?source=rss-192bb381a5de------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://alfianlosari.medium.com/building-swift-serverless-rest-api-with-aws-lambda-dynamodb-58db2302895f?source=rss-192bb381a5de------2</link>
            <guid isPermaLink="false">https://medium.com/p/58db2302895f</guid>
            <category><![CDATA[dynamodb]]></category>
            <category><![CDATA[swift-programming]]></category>
            <category><![CDATA[aws-lambda]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[serverless]]></category>
            <dc:creator><![CDATA[Alfian Losari]]></dc:creator>
            <pubDate>Sun, 12 Jul 2020 13:26:54 GMT</pubDate>
            <atom:updated>2020-07-12T13:27:52.263Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Building Image Filter macOS app with SwiftUI]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/swlh/building-image-filter-macos-app-with-swiftui-24808bcd8d39?source=rss-192bb381a5de------2"><img src="https://cdn-images-1.medium.com/max/2304/1*vP9S6LzsR3hMCJ4nUPs8_A.jpeg" width="2304"></a></p><p class="medium-feed-snippet">SwiftUI enables developers to use unified tools and API for building full native applications across Apple platforms. We can target&#x2026;</p><p class="medium-feed-link"><a href="https://medium.com/swlh/building-image-filter-macos-app-with-swiftui-24808bcd8d39?source=rss-192bb381a5de------2">Continue reading on The Startup »</a></p></div>]]></description>
            <link>https://medium.com/swlh/building-image-filter-macos-app-with-swiftui-24808bcd8d39?source=rss-192bb381a5de------2</link>
            <guid isPermaLink="false">https://medium.com/p/24808bcd8d39</guid>
            <category><![CDATA[image-processing]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[macos]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[swiftui]]></category>
            <dc:creator><![CDATA[Alfian Losari]]></dc:creator>
            <pubDate>Thu, 14 May 2020 13:15:41 GMT</pubDate>
            <atom:updated>2020-05-15T11:18:15.695Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Build Custom Interactive Remote Push Notifications in iOS]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/better-programming/building-custom-interactive-remote-push-notification-in-ios-4ffdba0b5281?source=rss-192bb381a5de------2"><img src="https://cdn-images-1.medium.com/max/2600/1*m7N0rZe-gttuqxoT11540w.jpeg" width="5120"></a></p><p class="medium-feed-snippet">Create an interactive custom push notification UI to display a video preview with buttons to add and favorite</p><p class="medium-feed-link"><a href="https://medium.com/better-programming/building-custom-interactive-remote-push-notification-in-ios-4ffdba0b5281?source=rss-192bb381a5de------2">Continue reading on Better Programming »</a></p></div>]]></description>
            <link>https://medium.com/better-programming/building-custom-interactive-remote-push-notification-in-ios-4ffdba0b5281?source=rss-192bb381a5de------2</link>
            <guid isPermaLink="false">https://medium.com/p/4ffdba0b5281</guid>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[push-notification]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Alfian Losari]]></dc:creator>
            <pubDate>Mon, 17 Feb 2020 14:09:57 GMT</pubDate>
            <atom:updated>2020-02-20T00:01:50.995Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Using Diffable Data Source iOS 13 API in UITableView]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://alfianlosari.medium.com/using-diffable-data-source-ios-13-api-in-uitableview-47343c2332be?source=rss-192bb381a5de------2"><img src="https://cdn-images-1.medium.com/max/1913/1*M4VLS24gzQjg57HqRkAdfQ.png" width="1913"></a></p><p class="medium-feed-snippet">Since the beginning of iOS SDK, UITableViewDataSource is the protocol that had the responsibility to drive the data and provide the cells&#x2026;</p><p class="medium-feed-link"><a href="https://alfianlosari.medium.com/using-diffable-data-source-ios-13-api-in-uitableview-47343c2332be?source=rss-192bb381a5de------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://alfianlosari.medium.com/using-diffable-data-source-ios-13-api-in-uitableview-47343c2332be?source=rss-192bb381a5de------2</link>
            <guid isPermaLink="false">https://medium.com/p/47343c2332be</guid>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[uitableview]]></category>
            <dc:creator><![CDATA[Alfian Losari]]></dc:creator>
            <pubDate>Fri, 31 Jan 2020 03:44:37 GMT</pubDate>
            <atom:updated>2020-02-14T10:20:37.465Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Understanding Property Wrappers in Swift By Examples]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/swlh/understanding-property-wrappers-in-swift-by-examples-604206022b5c?source=rss-192bb381a5de------2"><img src="https://cdn-images-1.medium.com/max/2048/1*fyjaOG4Z58m1Qo2_Brhifg@2x.png" width="2048"></a></p><p class="medium-feed-snippet">Alongside many new feature that come with the Swift 5.1, one of the most interesting feature is Property wrappers. Basically, it&#x2019;s a&#x2026;</p><p class="medium-feed-link"><a href="https://medium.com/swlh/understanding-property-wrappers-in-swift-by-examples-604206022b5c?source=rss-192bb381a5de------2">Continue reading on The Startup »</a></p></div>]]></description>
            <link>https://medium.com/swlh/understanding-property-wrappers-in-swift-by-examples-604206022b5c?source=rss-192bb381a5de------2</link>
            <guid isPermaLink="false">https://medium.com/p/604206022b5c</guid>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[swiftui]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[swift-programming]]></category>
            <category><![CDATA[swift]]></category>
            <dc:creator><![CDATA[Alfian Losari]]></dc:creator>
            <pubDate>Mon, 11 Nov 2019 00:56:17 GMT</pubDate>
            <atom:updated>2020-02-14T10:22:23.694Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Fetching Remote Async API with Apple Combine Framework]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://alfianlosari.medium.com/fetching-remote-async-api-with-apple-combine-framework-f7c067c7bb3?source=rss-192bb381a5de------2"><img src="https://cdn-images-1.medium.com/max/2600/1*FLVu17BA33SSJ2o2BvMo6A.png" width="3612"></a></p><p class="medium-feed-snippet">Combine is a framework that has just been recently released for all Apple platforms and it is included in Xcode 11. By using combine, it&#x2019;s&#x2026;</p><p class="medium-feed-link"><a href="https://alfianlosari.medium.com/fetching-remote-async-api-with-apple-combine-framework-f7c067c7bb3?source=rss-192bb381a5de------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://alfianlosari.medium.com/fetching-remote-async-api-with-apple-combine-framework-f7c067c7bb3?source=rss-192bb381a5de------2</link>
            <guid isPermaLink="false">https://medium.com/p/f7c067c7bb3</guid>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[swift-programming]]></category>
            <category><![CDATA[combine]]></category>
            <category><![CDATA[swift]]></category>
            <dc:creator><![CDATA[Alfian Losari]]></dc:creator>
            <pubDate>Sun, 22 Sep 2019 20:43:37 GMT</pubDate>
            <atom:updated>2020-02-14T10:23:27.818Z</atom:updated>
        </item>
    </channel>
</rss>