<?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 Reva Yoga Pradana on Medium]]></title>
        <description><![CDATA[Stories by Reva Yoga Pradana on Medium]]></description>
        <link>https://medium.com/@revoreva?source=rss-a7645444f16d------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*hNobOwGvkhA88x4Og8XZ6A@2x.jpeg</url>
            <title>Stories by Reva Yoga Pradana on Medium</title>
            <link>https://medium.com/@revoreva?source=rss-a7645444f16d------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 27 May 2026 23:34:57 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@revoreva/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[Some Notes when Upgrading into Xcode 13]]></title>
            <link>https://revoreva.medium.com/some-notes-when-upgrading-into-xcode-13-b7fbdf9f1dc4?source=rss-a7645444f16d------2</link>
            <guid isPermaLink="false">https://medium.com/p/b7fbdf9f1dc4</guid>
            <category><![CDATA[xcode13]]></category>
            <category><![CDATA[xcode]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[uitableview]]></category>
            <dc:creator><![CDATA[Reva Yoga Pradana]]></dc:creator>
            <pubDate>Wed, 13 Apr 2022 06:12:19 GMT</pubDate>
            <atom:updated>2022-04-13T06:20:49.187Z</atom:updated>
            <content:encoded><![CDATA[<p>In iOS 15, there is a new property called sectionHeaderTopPadding, for defining padding above each section header. Suggestion to make it same like previous condition, use code below (source: <a href="https://stackoverflow.com/a/69298784/4392909">https://stackoverflow.com/a/69298784/4392909</a>):</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ce206ec6edc89f5d501c26d06db2965e/href">https://medium.com/media/ce206ec6edc89f5d501c26d06db2965e/href</a></iframe><p>New altool recently (or at least start from Xcode 13.x) is intermittently resulting timeout 1001, ref: <a href="https://developer.apple.com/forums/thread/699749">https://developer.apple.com/forums/thread/699749</a>.</p><p>Solution may be:</p><ul><li>using altool from lower version (e.g: 12.5.1), or</li><li>retry the process until got succeed.</li></ul><p>&lt;Soon will re-update if any other problem occurs&gt;</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b7fbdf9f1dc4" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Some essential parts when making an App]]></title>
            <link>https://revoreva.medium.com/some-essential-parts-when-making-an-app-a9dca53e2511?source=rss-a7645444f16d------2</link>
            <guid isPermaLink="false">https://medium.com/p/a9dca53e2511</guid>
            <category><![CDATA[app-fundamental]]></category>
            <category><![CDATA[app-development]]></category>
            <dc:creator><![CDATA[Reva Yoga Pradana]]></dc:creator>
            <pubDate>Thu, 15 Jul 2021 01:48:00 GMT</pubDate>
            <atom:updated>2021-07-15T07:50:52.083Z</atom:updated>
            <content:encoded><![CDATA[<p>In my experiences, I’m figuring out some essential parts, that need to be developed from the beginning of the App. At least, in the first version of the App (e.g: 1.0.0), all of these features need to be ready.</p><p><strong>1. Feature Flag / Remote Config</strong></p><p>This is a system where we can control the appearance of our features. The best practices (in my opinion) is, we need to add flagging system into each of our features. Usually, it will be handled from their entry point.</p><blockquote>So for example, there is button that shown in our homepage. This button, when clicked, it will redirecting user into feature A.</blockquote><blockquote>We can give flagging for the appearance of this button. Or also, we can always showing the button, but when it clicked, and if the flag is currently OFF, we can show an alert, something like “sorry, this feature is currently disabled”.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/768/1*vokBaJmvtC4AGnaJNzCGig@2x.jpeg" /><figcaption>Sample Dashboard.</figcaption></figure><p>Usually, we’re flagging a feature, and remotely control it appearance, to handle some cases, like:</p><ul><li>When the feature accidentally having a problems, we can turn it OFF</li><li>When the feature is ready on the App side, but the Backend / APIs is not yet ready, so we can turn it OFF, and then when the backend is ready, we can turn it ON.</li><li>When both App and Backend side was ready, but it still waiting for the legal / compliance things, like waiting the agreement to be ready, or the feature is still pending verification by the government. After the compliance is done, we can turn it ON.</li></ul><p>There are many tools to supporting this system. The most popular ones (afaik) is Firebase Remote Config. It is free (afaik), and we can handle the flag to be having other values rather than Boolean. Also, we can filter the flag, to be ready on specific build number / version, only for specific platform, or only for some specific device. But, it lack of filtering based on user ID / segments (CMIIW).</p><p>Other tools that supporting based on user ID / segments is Leanplum, using service Leanplum Variables.</p><p>Or, we can have our system, end to end, from Back End to Front End. And we can customize it based on our need.</p><p><strong>2. Handling force update</strong></p><p>Force update means, stopping the user journey, when they use certain version. It’s important to handle this things. Usually, we need to do this when some specific versions are too old, or it contains major bugs that can’t be solved by backward compatibility from Back End side. Another reasons may be, we need to do stability on Back End or Front End side, and we need to have minimum versions for our users (so their journey will not blocked).</p><p>Usually, force update handled by, Back End checking the app version that used by the user. When it includes in list of App that need to be updated, they will returning status code 410 from many APIs. Then, when the App got that in any APIs, they will show popup or alert to users for updating their App.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/333/1*Rcorq8r77d-yXFUvRFljYQ@2x.jpeg" /><figcaption>Sample Alert when getting Force Update</figcaption></figure><p><strong>3. Handling Force Logout</strong></p><p>Sometimes, we need to force user to logout, when uncertain conditions is happen, like token expired for unknown reason, or uncertain bug occurred. It’s not a good journey for them, but better to prepare it on our App, as soon as possible.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/322/1*SdYOxpWR7ajiI0PjdoIC9A@2x.jpeg" /><figcaption>Sample Alert when getting Force Logout</figcaption></figure><p>Usually, when we want to force user to be logout, in a certain conditions (that already set in our system), Back End will return status code 401 in all APIs, and then App detecting that, and user will be logged off.</p><p><strong>4. Giving many fundamental values on the request headers of the request APIs</strong></p><p>There are some attributes that need to be sent from App, to identifying current session in user. Some of them are:</p><ul><li>OS Name: for collecting Data, to determine / analyze some patterns</li><li>OS Version: for collecting Data, to determine / analyze some patterns</li><li>Device Model / Type: for collecting Data, to determine / analyze some patterns</li><li>App Version: for collecting Data, to determine / analyze some patterns. Also usually used by parameters of force update</li><li>Authorization: for the credential of the users</li></ul><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/754326c114bd5b31e84eb553862ab006/href">https://medium.com/media/754326c114bd5b31e84eb553862ab006/href</a></iframe><p><strong>5. Monitoring Request Logger</strong></p><p>Usually it can be handled by Back End side. So the flow will be, whether Back End returning or receiving API response from App, they will record it into some tools, example: Kibana, Datadog.</p><p>But sometimes, Front End can manually record it. So basically, the process would be, when App sending request or receiving response from Back End, they will record it into some tools, like tools above.</p><p>Then we can creating dashboard or just querying it, for analysis many things, like uncertain response from Back End, or uncertain parameters values from Front End (combine with some Data that already sent by the App, e.g: OS Version and Device Model).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/672/1*H221OmFY_h3QbP2U7kJ5-Q@2x.jpeg" /><figcaption>Sample Dashboard for Monitoring Request Logger</figcaption></figure><p>In my opinion, better to handled it by Backend side, so we can easily customize it sometimes, and it always be backward compatible.</p><p><strong>6. Monitoring Crash Performance</strong></p><p>Many tools are supporting this. The most popular one (I think?) is Firebase Crashlytics. The purpose is quite simple and obvious, to determine whether a crash is happen on our App, and then we can know what part that triggering it. Usually it also come with many useful data, like OS version, app version, user ID, file and line of the code that triggering the crash, and report time.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/437/1*4i1K-RtMllh8Rh1CZgvu2A@2x.jpeg" /><figcaption>Sample Report when a Crash occured</figcaption></figure><p>I think that’s all that I can tell. There’s still many things that I think every App need to have, like Tracker Event (for analyzing user journey), having design system, and many more. But I think that it can comes in the middle of App Release journey / doesn’t need to be developed from the beginning.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a9dca53e2511" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Impact of iOS 14.5]]></title>
            <link>https://revoreva.medium.com/impact-of-ios-14-5-16a536c65910?source=rss-a7645444f16d------2</link>
            <guid isPermaLink="false">https://medium.com/p/16a536c65910</guid>
            <category><![CDATA[uialertcontroller]]></category>
            <dc:creator><![CDATA[Reva Yoga Pradana]]></dc:creator>
            <pubDate>Sat, 03 Jul 2021 01:05:52 GMT</pubDate>
            <atom:updated>2021-07-03T01:08:26.747Z</atom:updated>
            <content:encoded><![CDATA[<p>When iOS 14.5 released, all of us (iOS Engineers) may already know about update of <strong><em>App Tracking Transparency</em></strong>. Yes, from next time, all of app that tracking their users, may need to implement that consent, if not, the App may got rejected.</p><p>But, on iOS 14.5, our team also facing an UI Bug that only happened on iOS 14.5. The bug is like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/237/1*ld8UVSisQ7WIazssOMJ4Tg@2x.jpeg" /></figure><p>So basically on this page, we were creating a custom <strong><em>UIAlertController</em></strong>, then we modify the <strong><em>constraint</em></strong> that on it’s child <strong><em>view</em></strong>. The parent <strong><em>view</em></strong> will be adjusted too.</p><p>And then in iOS 14.5, looks like there is an update that <strong><em>UIAlertController</em></strong> has different hierarchy of the <strong><em>view</em></strong>.</p><p>Not sure also if we previously doing it wrong tho. But after we consider that, and fix the <strong><em>constraint</em></strong>, the UI now works as expected, not only on iOS 14.5, but also on lower version of OS.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/228/1*FNlu6yapL5hxOdfQDj99gA@2x.jpeg" /></figure><p>Our fixing is something like, remove the parent’s <strong><em>view</em></strong> <strong><em>width</em></strong> <strong><em>constraint</em></strong>, remake the new <strong><em>width</em></strong> <strong><em>constraint</em></strong>, and then applying it both on parent and child <strong><em>view</em></strong>s. Also, we adjust the <strong><em>leading</em></strong> <strong><em>anchor</em></strong> <strong><em>constraint</em></strong> on child <strong><em>view</em></strong> based on it’s parent’s <strong><em>view</em></strong>.</p><p>Hope it help everyone who may facing it!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=16a536c65910" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Some notes when upgrading into XCode 12]]></title>
            <link>https://revoreva.medium.com/some-notes-when-upgrading-into-xcode-12-1db2885282a4?source=rss-a7645444f16d------2</link>
            <guid isPermaLink="false">https://medium.com/p/1db2885282a4</guid>
            <category><![CDATA[xcode11]]></category>
            <category><![CDATA[uidatepicker]]></category>
            <category><![CDATA[xcode-12]]></category>
            <dc:creator><![CDATA[Reva Yoga Pradana]]></dc:creator>
            <pubDate>Fri, 18 Jun 2021 11:24:16 GMT</pubDate>
            <atom:updated>2021-06-18T11:24:16.687Z</atom:updated>
            <content:encoded><![CDATA[<p>On the end of 2020, our iOS Team were migrating, from XCode 11.4.1 into XCode 12.3. Some things that we’ve found previously are like these:</p><ul><li>iOS 14.3 simulator with a yellow navigation bar color.<br>Ref: <a href="https://developer.apple.com/forums/thread/669459">https://developer.apple.com/forums/thread/669459</a>.</li><li><strong><em>UIDatePicker</em></strong> have new behaviour, now it have property <strong><em>datePickerStyle</em></strong> and <strong><em>preferredDatePickerStyle</em></strong>, with some types like <strong><em>.automatic</em></strong>, <strong><em>.compact</em></strong>, <strong><em>.inline</em></strong>, and .<strong><em>wheels</em></strong>. default is <strong><em>.automatic</em></strong>.<br>Ref: <a href="https://www.swiftpal.io/articles/new-uidatepicker-in-ios-14">https://www.andyibanez.com/posts/new-uidatepicker-ios14/</a> .</li><li><strong><em>UITableViewCell</em></strong> new behaviour: Need to add the <strong><em>view</em></strong> into <strong><em>contentView</em></strong> of <strong><em>UITableViewCell</em></strong>, not directly into <strong><em>UITableViewCell</em></strong> itself.<br>Ref: <a href="https://stackoverflow.com/questions/63932279/an-extra-uitableviewcellcontentview-overlay-appears-in-a-tableview-on-ios-14-pre/65193579#65193579">https://stackoverflow.com/a/63951794</a>.</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1db2885282a4" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[SSL Pinning with Alamofire, most essential part]]></title>
            <link>https://revoreva.medium.com/ssl-pinning-with-alamofire-most-essential-part-f70e29a88c72?source=rss-a7645444f16d------2</link>
            <guid isPermaLink="false">https://medium.com/p/f70e29a88c72</guid>
            <category><![CDATA[alamofire]]></category>
            <category><![CDATA[ssl-pinning]]></category>
            <dc:creator><![CDATA[Reva Yoga Pradana]]></dc:creator>
            <pubDate>Fri, 18 Jun 2021 09:39:34 GMT</pubDate>
            <atom:updated>2021-06-18T09:39:34.241Z</atom:updated>
            <content:encoded><![CDATA[<p>I don’t want to write much in here, cause already so many articles discussing this.</p><p>But, I want to highlight the most important, basic, and essential part regarding this problem. Thanks for <a href="https://devgenes.com/posts/ssl-pinning-with-alamofire">https://devgenes.com/posts/ssl-pinning-with-alamofire</a> for highlighting this, I don’t look any other references / authors (yet) whose highlighting this “most and basic essential part” regarding to implementing SSL Pinning with Alamofire.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jOz6Zol7L0qN8YtcA0zO8A.png" /><figcaption>yes, this is the most essential part</figcaption></figure><p>So yeah, in SessionManager, you need to add the base domain, not including the https://. If you not do this, than the SSL pinning for your App will not works.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OUZkpFNPHeHKvBynLBPu7g.jpeg" /><figcaption>before</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JBUuqcUeYf0ZrzQuDpBOuA.jpeg" /><figcaption>after</figcaption></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f70e29a88c72" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Different UUID from IDFA and IDFV]]></title>
            <link>https://revoreva.medium.com/different-uuid-from-idfa-and-idfv-68be9feb8e9b?source=rss-a7645444f16d------2</link>
            <guid isPermaLink="false">https://medium.com/p/68be9feb8e9b</guid>
            <category><![CDATA[uuid]]></category>
            <category><![CDATA[ios-device-id]]></category>
            <category><![CDATA[idfv]]></category>
            <category><![CDATA[idfa]]></category>
            <dc:creator><![CDATA[Reva Yoga Pradana]]></dc:creator>
            <pubDate>Fri, 18 Jun 2021 09:39:08 GMT</pubDate>
            <atom:updated>2021-06-18T09:39:08.469Z</atom:updated>
            <content:encoded><![CDATA[<p>So I just read from the <a href="https://docs.leanplum.com/docs/which-device-id-format-should-i-use">Leanplum’s document</a>, that UUID can come from 2 sources, they are IDFA (<a href="https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier">advertisingIdentifier</a>) and IDFV (<a href="https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor">identifierForVendor</a>).</p><p>Basically, from what I read on <a href="https://gist.github.com/hujunfeng/6265995">https://gist.github.com/hujunfeng/6265995</a> (thanks <a href="https://github.com/hujunfeng">hujunfeng</a>!),</p><ul><li>UUID from IDFA (ASIdentifierManager.shared().advertisingIdentifier.uuidString) will remain same for all apps in a device. The value will only changed when user does full reset on the device, or manually reset the advertising idenfifier.</li><li>UUID from IDFV (UIDevice.current.identifierForVendor?.uuidString) will be different for (almost) all apps in a device. I say &quot;almost&quot;, because some apps that comes from &quot;same prefix&quot; of Bundle ID (e.g: com.calculator.apps, and com.calculator.apps2) will be have the same UUID IDFV. The value will changed when all of that &quot;same prefix&quot; Bundle ID apps are deleted / uninstalled and then reinstalled.</li></ul><p>So that’s it. Now We know which the best for us for defining the “Device ID” of our users.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=68be9feb8e9b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Using Plist to store secret values in iOS App, and ignore it in Version Control (Git)]]></title>
            <link>https://revoreva.medium.com/using-plist-to-store-secret-values-in-ios-app-and-ignore-it-in-version-control-git-3deda4e4837a?source=rss-a7645444f16d------2</link>
            <guid isPermaLink="false">https://medium.com/p/3deda4e4837a</guid>
            <category><![CDATA[ios-development]]></category>
            <category><![CDATA[ios-secret-value]]></category>
            <category><![CDATA[plist]]></category>
            <dc:creator><![CDATA[Reva Yoga Pradana]]></dc:creator>
            <pubDate>Wed, 16 Jun 2021 11:08:00 GMT</pubDate>
            <atom:updated>2021-06-16T11:08:00.385Z</atom:updated>
            <content:encoded><![CDATA[<p>Previously, we have some secret values hardcoded in our App, and it’s separated in many files (not have exact place to store both of them). Also, it’s tracked on our Version Control (Git in this case). We know that it’s not secure, right?</p><p>So, we decide to find other workarounds to solve this. First, we found that we can use Environment Variables in XCode, because we can set it in our project using a script, and then the script will put the secret values based on values in environment variables that we already set in our OS (In our laptop, or in CI).</p><p>But, it turns out that it will not works as we expect, because we just realized that environment variables, is only available in our Laptop and CI, not available in our user, in their device, right? <a href="https://stackoverflow.com/questions/14214741/xcode-environment-variables-not-present-during-archive">https://stackoverflow.com/questions/14214741/xcode-environment-variables-not-present-during-archive</a></p><p>So, we tried to found another ways, to keep it secrets. Then, we found a trick! We store our values in Plist, we ignore it in our Git, and then ditributed it manually into our team.</p><p>Then, what about in our CI? We use a hacky ways, we create a script, that will generate the Plist, based on values in Environment Variables in CI, and then run that script only in our CI, so our CI will also have that Plist!</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/3b86e2f9f85e6e73bf9397f5d63c868d/href">https://medium.com/media/3b86e2f9f85e6e73bf9397f5d63c868d/href</a></iframe><figure><img alt="" src="https://cdn-images-1.medium.com/max/976/1*7Ssj0j0R9i4EAFjQ3PYWmQ.png" /><figcaption>Environment Variable for KEY monitoring_token</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*hSjK9eGKW-G0QG7SWVO-Lw.png" /><figcaption>Environment Variable for KEY third_party_key</figcaption></figure><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/195632e7c97dbd82c9f0e75449fbddef/href">https://medium.com/media/195632e7c97dbd82c9f0e75449fbddef/href</a></iframe><p>In our CI, we generate first the Plists, using shell script ruby generate_keys.rb, and then run script for building our XCode Projects.</p><p>So, both environment (in our Laptop and in our CI) will have that Plist file, and then the building can works successfully! :)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3deda4e4837a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[didRegisterForRemoteNotificationsWithDeviceToken not Called]]></title>
            <link>https://revoreva.medium.com/didregisterforremotenotificationswithdevicetoken-not-called-69e2b90b268b?source=rss-a7645444f16d------2</link>
            <guid isPermaLink="false">https://medium.com/p/69e2b90b268b</guid>
            <category><![CDATA[apn]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[push-notification]]></category>
            <dc:creator><![CDATA[Reva Yoga Pradana]]></dc:creator>
            <pubDate>Wed, 16 Jun 2021 10:48:45 GMT</pubDate>
            <atom:updated>2021-06-16T10:48:45.537Z</atom:updated>
            <content:encoded><![CDATA[<p>In our iOS App, we often found a condition when user are not getting push token from APNS. When we researching this, it’s because of:</p><blockquote><em>neither the </em><strong>application:didRegisterForRemoteNotificationsWithDeviceToken:</strong><em> method nor the </em><strong>application:didFailToRegisterForRemoteNotificationsWithError:</strong><em> method is called.</em></blockquote><p>When we do some next research, we also found that</p><blockquote><em>on some connections, especially Wi-Fi connection, the port of APNS (5223) may got blocked.</em></blockquote><blockquote><a href="https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/HandlingRemoteNotifications.html#//apple_ref/doc/uid/TP40008194-CH6-SW3"><em>https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/HandlingRemoteNotifications.html#//apple_ref/doc/uid/TP40008194-CH6-SW3</em></a></blockquote><p>Because of “impossible case to handle” like that, this case may got more attention into our development process. For example, we should exclude the “mandatory push token” into our vital flow, e.g: Login Flow, or educating the users to (maybe) “Switch the internet operator for a while” when getting this condition.</p><p>To decreasing the occuring of that condition, we can do some enhancement in our code, related to registering remote push notifications. After discussing with Apple and reading the Leanplum’s documentation, we found out that we can call <strong><em>registerForRemoteNotifications()</em></strong> whenever users are accept or denying the push notifications. Although we register the remote notifications, Apple will still exclude the push notifications into our users, when they rejecting the push notification, so it’s safe to still calling this function. The example code will be like this:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/8e7f64114d66e0e72b7df48d7e2cfe99/href">https://medium.com/media/8e7f64114d66e0e72b7df48d7e2cfe99/href</a></iframe><p>So, just it. Thank you guys for reading this!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=69e2b90b268b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Remove build phase script “[CP] Check Pods Manifest.lock”]]></title>
            <link>https://revoreva.medium.com/remove-build-phase-script-cp-check-pods-manifest-lock-f479895754b2?source=rss-a7645444f16d------2</link>
            <guid isPermaLink="false">https://medium.com/p/f479895754b2</guid>
            <category><![CDATA[fastlane]]></category>
            <category><![CDATA[pods-manifest-lock]]></category>
            <category><![CDATA[ci-cd-pipeline]]></category>
            <category><![CDATA[cocoapods]]></category>
            <category><![CDATA[xcode-project]]></category>
            <dc:creator><![CDATA[Reva Yoga Pradana]]></dc:creator>
            <pubDate>Wed, 16 Jun 2021 09:44:33 GMT</pubDate>
            <atom:updated>2021-06-16T13:50:53.441Z</atom:updated>
            <content:encoded><![CDATA[<p>In our company, sometimes we found a problem that our build phase script &quot;[CP] Check Pods Manifest.lock&quot; got timeout in CircleCI, without clear reason.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cEG9ReY_KiVsBGqYyrYURg.png" /><figcaption>Timeout on running script &quot;[CP] Check Pods Manifest.lock&quot;</figcaption></figure><p>Then, we decide to “remove” that script from our xcodeproject, because we think that we don&#39;t need that &quot;extra step&quot; to make sure our installed pods is the correct ones. We thought our current setup of Cocoapodsis already good.</p><p>Btw, this are our setup of Cocoapods, in our iOS App:</p><ol><li>Commit Podfile with declare exact version for it&#39;s library</li><li>Git ignore the Podfile.lock</li><li>Git ignore the folder Pods</li><li>Always do pod install in the beginning (before compiling the app)</li></ol><blockquote>I think we’ll need that script if we’re not doing step 2 and 3.</blockquote><p>Then, how we do it (removing the build phase script)? We do that by this script, that called in Fastlane.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f3aa9e35af38bf916df275a37385a8cb/href">https://medium.com/media/f3aa9e35af38bf916df275a37385a8cb/href</a></iframe><p>You can also remove it by using Podfile, in step post_integrate, like this:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/65778b060a37afd383c7e410100a575e/href">https://medium.com/media/65778b060a37afd383c7e410100a575e/href</a></iframe><p>Why we need to do it via script? Because:</p><ul><li>if we do it manually, the script will always appear again after pod install</li><li>we don’t commit the xcodeproject</li></ul><p>And this is the result:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*y2twW4j2f2Ioqjl83BAnng.png" /><figcaption>before script removed in xcodeproject</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vFlI5hIUMFcPwhKZvZxtbA.png" /><figcaption>after script removed in xcodeproject</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IhnSZ1BjNzi_G_1Xqjvw1A.png" /><figcaption>Our log that indicating the script was removed</figcaption></figure><p>Our build success compiled. Since this is still an experiment, I’ll updating this post whenever something unnecessary happened.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f479895754b2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Error “transporter” when uploading into Appstore]]></title>
            <link>https://revoreva.medium.com/error-transporter-when-uploading-into-appstore-c7546e848f1f?source=rss-a7645444f16d------2</link>
            <guid isPermaLink="false">https://medium.com/p/c7546e848f1f</guid>
            <category><![CDATA[ios-publish]]></category>
            <category><![CDATA[xcode]]></category>
            <category><![CDATA[transporter]]></category>
            <dc:creator><![CDATA[Reva Yoga Pradana]]></dc:creator>
            <pubDate>Thu, 06 May 2021 14:09:36 GMT</pubDate>
            <atom:updated>2021-07-17T12:10:06.607Z</atom:updated>
            <content:encoded><![CDATA[<p>I got this problem, when uploading my App into Appstore, through Transporter and XCode.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*C_5z_0CXCCdFRR2r" /></figure><p>This error is caused by renaming the username in Laptop, and the old path is not changed (based on new username). The path still pointing into</p><blockquote><strong>“/Users/{OLD_USERNAME}/Library/Caches/com.apple.amp.itmstransporter/obr/2.1.0/com.fasterxml.jackson.module.jackson-module-jaxb-annotations-2.9.8.jar”</strong><em>,</em></blockquote><p>while the new path should be</p><blockquote><strong>“/Users/{NEW_USERNAME}/Library/Caches/com.apple.amp.itmstransporter/obr/2.1.0/com.fasterxml.jackson.module.jackson-module-jaxb-annotations-2.9.8.jar”</strong><em>.</em></blockquote><p>To solve this, we just need to remove <strong><em>/Users/{OLD_USERNAME}/Library/Caches/com.apple.amp.itmstransporter</em></strong> entirely. And then just try to re-archive and re-upload into Appstore. Then it will trigger creating the new transporter in the right path, and automatically pointed into the new one.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*6p5htDcrvuYwC4t5" /></figure><p>PS: Thank <a href="https://developer.apple.com/forums/thread/129378?answerId=419847022#419847022">cleardemon</a>, for posting this info in developer apple forum!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c7546e848f1f" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>