<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4858171838588273694</id><updated>2024-12-14T03:25:06.548-08:00</updated><category term="cross-platform"/><category term="top-post"/><category term="cloud"/><category term="team-building"/><category term="server-driven UI"/><category term="pattern"/><category term="figures"/><category term="testing"/><category term="iOS"/><category term="security"/><title type='text'>iOS &amp;amp; Android Development</title><subtitle type='html'>Tools, Apps, Tips &amp;amp; Tricks</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>916</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-8351639754728453252</id><published>2022-09-05T01:00:00.000-07:00</published><updated>2022-09-05T01:00:00.156-07:00</updated><title type='text'>The Trimodal Nature of Software Engineering Salaries</title><content type='html'>&lt;p&gt;The software engineering compensation market becoming trimodal - split into three distinct groups that &quot;spike&quot; and that have little overlaps.&amp;nbsp; Most engineers are not aware of this third, Big Tech pillar and the compensation ranges it introduces, assuming compensation can not go beyond what is offered at the second pillar:&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blog.pragmaticengineer.com/content/images/size/w1000/2021/07/Screenshot-2021-07-10-at-04.45.19.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;513&quot; data-original-width=&quot;800&quot; height=&quot;513&quot; src=&quot;https://blog.pragmaticengineer.com/content/images/size/w1000/2021/07/Screenshot-2021-07-10-at-04.45.19.png&quot; width=&quot;800&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Read more about salary tier strategies and competable compensations:&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://blog.pragmaticengineer.com/content/images/size/w1000/2021/07/Screenshot-2021-07-10-at-04.45.19.png&quot; target=&quot;_blank&quot;&gt;The Pragmatic Engineer&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/8351639754728453252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2022/09/the-trimodal-nature-of-software.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/8351639754728453252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/8351639754728453252'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2022/09/the-trimodal-nature-of-software.html' title='The Trimodal Nature of Software Engineering Salaries'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-2145467321610704999</id><published>2022-09-05T00:54:00.002-07:00</published><updated>2022-09-05T00:54:25.928-07:00</updated><title type='text'>The Pragmatic Engineer: Netflix’s historic introduction of levels for software engineering</title><content type='html'>&lt;p&gt;&quot;Netflix is considering the following leveling system&quot;&lt;/p&gt;- Engineer 1&lt;br /&gt;- Engineer 2&lt;br /&gt;- Senior&lt;br /&gt;- Staff&lt;br /&gt;- Principal&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The details of the system are still being worked out, and a proposal has been circulated within engineering. The proposal, understandably, has resulted in lots of questions, especially around whether existing engineers will be getting Staff or Principal titles. The original proposal made it seem that everyone would stay Senior, and with promotions, they could get to the next levels.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Read more about the history and background:&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/the-scoop-netflixs-historic-introduction&quot; target=&quot;_blank&quot;&gt;The Pragmatic Engineer&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/2145467321610704999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2022/09/the-pragmatic-engineer-netflixs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/2145467321610704999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/2145467321610704999'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2022/09/the-pragmatic-engineer-netflixs.html' title='The Pragmatic Engineer: Netflix’s historic introduction of levels for software engineering'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-7126949943854302997</id><published>2022-09-01T01:37:00.000-07:00</published><updated>2022-09-01T01:37:40.152-07:00</updated><title type='text'>Optimize App Retention with the Hooked Model</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://miro.medium.com/max/500/1*rFDxItJqVzG0QkELjfFAZA.jpeg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;755&quot; data-original-width=&quot;500&quot; height=&quot;320&quot; src=&quot;https://miro.medium.com/max/500/1*rFDxItJqVzG0QkELjfFAZA.jpeg&quot; width=&quot;212&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Nir Eyal explores how applying the Hooked Model drives customer retention and engagement by fostering good habits&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Trigger. An event that encourages someone to act, which is either an:&lt;/li&gt;&lt;ol&gt;&lt;li&gt;External trigger: something in the environment — a ping, a ding, or a ring — that alerts a person to do something.&lt;/li&gt;&lt;li&gt;Internal trigger: the desire to escape from an uncomfortable emotional state.&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Action. A behavior that anticipates a reward — opening an app, scrolling a feed, checking a dashboard, or playing a video. The simpler the behavior is to accomplish, the more likely the user is to do it.&lt;/li&gt;&lt;li&gt;Reward. The user gets what they came for.&lt;/li&gt;&lt;li&gt;Investment. The user puts something back into the product that makes it better the next time they use it.&lt;/li&gt;&lt;/ol&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/iw1x0zos8Jo&quot; width=&quot;320&quot; youtube-src-id=&quot;iw1x0zos8Jo&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a href=&quot;https://www.amazon.de/Hooked-How-Build-Habit-Forming-Products/dp/0241184835&quot;&gt;https://www.amazon.de/Hooked-How-Build-Habit-Forming-Products/dp/0241184835&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/7126949943854302997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2021/02/optimize-app-retention-with-hooked-model.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/7126949943854302997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/7126949943854302997'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2021/02/optimize-app-retention-with-hooked-model.html' title='Optimize App Retention with the Hooked Model'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/iw1x0zos8Jo/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-7356442922926485760</id><published>2022-08-21T23:56:00.002-07:00</published><updated>2022-09-05T01:01:59.380-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="security"/><title type='text'>iOS In-App Browser JavaScript injections to spy on user behaviour on 3rd party websites</title><content type='html'>&lt;p&gt;&amp;nbsp;iOS Privacy: Instagram and Facebook can track anything you do on any website in their in-app browser&lt;/p&gt;&lt;p&gt;The iOS Instagram and Facebook app render all third party links and ads within their app using a custom in-app browser. This causes various risks for the user, with the host app being able to track every single interaction with external websites, from all form inputs like passwords and addresses, to every single tap.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://krausefx.com/blog/announcing-inappbrowsercom-see-what-javascript-commands-get-executed-in-an-in-app-browser&quot; target=&quot;_blank&quot;&gt;KrauseFX&lt;/a&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/7356442922926485760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2022/08/ios-in-app-browser-javascript.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/7356442922926485760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/7356442922926485760'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2022/08/ios-in-app-browser-javascript.html' title='iOS In-App Browser JavaScript injections to spy on user behaviour on 3rd party websites'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-1400634414137764779</id><published>2022-06-29T00:43:00.008-07:00</published><updated>2022-06-29T00:45:22.066-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="server-driven UI"/><title type='text'>Judo App - Server Driven UI out of the box</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFVfskBq-cW0GfdzdyYlQ08kxr0rO-kWLBF1VUcr2dJJyBoHfx8EIkPy3bPB91bgRW_owuVCUtdwlv_gL-w-__9Xf6iwwPIXYfHMfkcaVMLw0MJUeGuaBmimb9ozkNQa2iFt7QLi4YXXEbeZrZtqf4PM7h_WuIfN3CWecLvsqeSGjvawjtxy8I21qU/s1189/Bildschirmfoto%202022-06-29%20um%2009.44.40.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;337&quot; data-original-width=&quot;1189&quot; height=&quot;114&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFVfskBq-cW0GfdzdyYlQ08kxr0rO-kWLBF1VUcr2dJJyBoHfx8EIkPy3bPB91bgRW_owuVCUtdwlv_gL-w-__9Xf6iwwPIXYfHMfkcaVMLw0MJUeGuaBmimb9ozkNQa2iFt7QLi4YXXEbeZrZtqf4PM7h_WuIfN3CWecLvsqeSGjvawjtxy8I21qU/w400-h114/Bildschirmfoto%202022-06-29%20um%2009.44.40.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Judo App&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Judo brings server-driven UI to your iOS and Android apps. Build user interfaces visually in a fraction of time and publish them instantly without submitting to the app store.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Build Experiences - With No Code&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The Judo app for macOS, available through the App Store, is built for design professionals with common keyboard shortcuts and familiar concepts like canvas, layers and inspector panel. Workflow is streamlined with the ability to drag and drop media files directly into your experiences and manage your own Judo files in Finder.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Manage Creative Execution&lt;/b&gt;&lt;/p&gt;&lt;p&gt;A Judo experience is interactive and can include text, images, video and buttons. An experience may be part of a screen, a single screen, or more typically multiple linked screens. Judo supports screen transitions, carousels, horizontal scrolling and modals. Clients can add custom fonts and define global colors and these are updates applied universally.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Effortlessly Deploy&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Judo Cloud syncs your experiences with your iOS and Android apps making them instantly available to your users. Open-source lightweight SDKs on iOS and Android handle rendering. Experiences are pre-loaded and cached before your users see them to avoid loading indicators.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Add API-Derived Content Using Real Data&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Judo experiences can be personalized and dynamic. Judo experiences can connect to an existing CMS or third-party APIs to display live data. Judo handles all the tricky bits like loading state and populating lists. Dynamic content can take many forms such as images incorporating personalized text, merchandise recommendations, and point of interest data.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.judo.app&quot; target=&quot;_blank&quot;&gt;Judo App&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/1400634414137764779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2022/06/judo-app-server-driven-ui-out-of-box.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/1400634414137764779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/1400634414137764779'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2022/06/judo-app-server-driven-ui-out-of-box.html' title='Judo App - Server Driven UI out of the box'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFVfskBq-cW0GfdzdyYlQ08kxr0rO-kWLBF1VUcr2dJJyBoHfx8EIkPy3bPB91bgRW_owuVCUtdwlv_gL-w-__9Xf6iwwPIXYfHMfkcaVMLw0MJUeGuaBmimb9ozkNQa2iFt7QLi4YXXEbeZrZtqf4PM7h_WuIfN3CWecLvsqeSGjvawjtxy8I21qU/s72-w400-h114-c/Bildschirmfoto%202022-06-29%20um%2009.44.40.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-6384533430371360690</id><published>2022-06-14T05:39:00.003-07:00</published><updated>2022-06-14T05:39:22.306-07:00</updated><title type='text'>Bundeskartellamt prüft Apples Tracking-Regelungen für Dritt-Apps (ATT, App Tracking Transparency Framework)</title><content type='html'>&lt;p&gt;Das Bundeskartellamt hat gegen das Technologieunternehmen Apple ein Verfahren zur kartellrechtlichen Prüfung seiner Tracking-Regelungen sowie des App Tracking Transparency Framework eingeleitet. Das Bundeskartellamt geht dabei insbesondere dem Anfangsverdacht nach, dass diese Regelungen Apples eigene Angebote bevorzugt behandeln und/oder andere Unternehmen behindern könnten.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.bundeskartellamt.de/SharedDocs/Meldung/DE/Pressemitteilungen/2022/14_06_2022_Apple.html;jsessionid=D3AFC45303F993C5B0D2A2D07BA00896.1_cid381?nn=3591568&quot; target=&quot;_blank&quot;&gt;14.06.2022 Pressemeldung Bundeskartellamt&lt;/a&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/6384533430371360690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2022/06/bundeskartellamt-pruft-apples-tracking.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/6384533430371360690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/6384533430371360690'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2022/06/bundeskartellamt-pruft-apples-tracking.html' title='Bundeskartellamt prüft Apples Tracking-Regelungen für Dritt-Apps (ATT, App Tracking Transparency Framework)'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-2898066040819061206</id><published>2022-05-13T04:17:00.000-07:00</published><updated>2022-05-13T04:17:02.169-07:00</updated><title type='text'>Now in Android - a new, open source, real-world sample app</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjBGstuW-1UoXpV3ULE8tAVflRxUvFT3cD0rfMUC2TTpw_WFQ4cYy_GfzrZ2Df7cIjZXvEzmI-_r5a7J8UeOR30pxvV9RzTBV_1f2b4NASydEUrFCKRBydPZb872gEteZFAc9U89egfDRbUmHEe86X2XMgwJ1FV_s6_hSRGrWO65APrjjzc80dMhOXr&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;781&quot; data-original-width=&quot;1600&quot; height=&quot;156&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjBGstuW-1UoXpV3ULE8tAVflRxUvFT3cD0rfMUC2TTpw_WFQ4cYy_GfzrZ2Df7cIjZXvEzmI-_r5a7J8UeOR30pxvV9RzTBV_1f2b4NASydEUrFCKRBydPZb872gEteZFAc9U89egfDRbUmHEe86X2XMgwJ1FV_s6_hSRGrWO65APrjjzc80dMhOXr&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;For this first alpha release, the Now in Android app includes:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;UI built using Jetpack Compose&lt;/li&gt;&lt;li&gt;Theme components with Material3&lt;/li&gt;&lt;li&gt;Adaptive layouts for different screen sizes&lt;/li&gt;&lt;li&gt;Architecture that follows our official guidance&lt;/li&gt;&lt;li&gt;A reactive programming model with unidirectional data flow, implemented using Kotlin Flows&lt;/li&gt;&lt;li&gt;Room and Proto DataStore for local data storage, offline first&lt;/li&gt;&lt;li&gt;Remote/local data synchronization scheduled using WorkManager with exponential backoff&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://android-developers.googleblog.com/2022/05/now-in-android-sample-app-alpha.html&quot; target=&quot;_blank&quot;&gt;Android Developers&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/2898066040819061206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2022/05/now-in-android-new-open-source-real.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/2898066040819061206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/2898066040819061206'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2022/05/now-in-android-new-open-source-real.html' title='Now in Android - a new, open source, real-world sample app'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEjBGstuW-1UoXpV3ULE8tAVflRxUvFT3cD0rfMUC2TTpw_WFQ4cYy_GfzrZ2Df7cIjZXvEzmI-_r5a7J8UeOR30pxvV9RzTBV_1f2b4NASydEUrFCKRBydPZb872gEteZFAc9U89egfDRbUmHEe86X2XMgwJ1FV_s6_hSRGrWO65APrjjzc80dMhOXr=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-3821475559477764952</id><published>2022-04-19T00:47:00.002-07:00</published><updated>2022-04-19T00:47:14.778-07:00</updated><title type='text'>Simple made Easy: Rich Hickey</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&amp;nbsp;Design system as simple as possible to solve the business problem&lt;/li&gt;&lt;li&gt;Simple system are much easier to scale and extend than complex systems&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/kGlVcSMgtV4&quot; width=&quot;320&quot; youtube-src-id=&quot;kGlVcSMgtV4&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/3821475559477764952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2022/04/simple-made-easy-rich-hickey.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/3821475559477764952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/3821475559477764952'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2022/04/simple-made-easy-rich-hickey.html' title='Simple made Easy: Rich Hickey'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/kGlVcSMgtV4/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-1686904301815290859</id><published>2022-02-18T00:00:00.001-08:00</published><updated>2022-02-18T00:20:14.315-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="team-building"/><title type='text'>GitLab and Dropbox: Engineering Career Frameworks, plus collection of tools!</title><content type='html'>&lt;p&gt;&lt;b&gt;GitLab&lt;/b&gt;&lt;/p&gt;&lt;p&gt;These are the expected behaviours of Engineers at GitLab. Most engineers at GitLab are Intermediate or Senior, so the priority is to address these levels first.&lt;/p&gt;&lt;p&gt;Moving between levels, you should see that as engineers advance in their careers, their duties should encompass a higher degree of complexity, the scope of their influence should expand, and their contributions should become more impactful.&lt;/p&gt;&lt;p&gt;These behaviors should not be considered as a checklist for promotion. Excellent Engineers may struggle with one or two aspects of their job and their strengths in certain areas should make up for deficits in others. However, it is important to show a significant number of strengths to be considered for promotion.&lt;/p&gt;&lt;p&gt;Each of these behaviors should be achievable inside of normal working hours. If you feel that you need to work additional hours to be successful in your role you should talk to your manager.&lt;/p&gt;&lt;p&gt;Junior engineers are still included on this framework even though we are not actively hiring at this level. Further discussion about junior engineers can be found on the career development page.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Value Alignments&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Collaboration&lt;/li&gt;&lt;li&gt;Results&lt;/li&gt;&lt;li&gt;Efficiency&lt;/li&gt;&lt;li&gt;Diversity, Inclusion &amp;amp; Belonging&lt;/li&gt;&lt;li&gt;Iteration&lt;/li&gt;&lt;li&gt;Transparency&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;Technical Competencies&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Quality&lt;/li&gt;&lt;li&gt;Complexity&lt;/li&gt;&lt;li&gt;Security&lt;/li&gt;&lt;li&gt;Technical Stewardship&lt;/li&gt;&lt;li&gt;Performance&lt;/li&gt;&lt;li&gt;Open Source&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;Leadership Competencies&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Growing Others&lt;/li&gt;&lt;li&gt;Communication&lt;/li&gt;&lt;li&gt;Ambiguity&lt;/li&gt;&lt;li&gt;Business Acumen&lt;/li&gt;&lt;li&gt;Process&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://about.gitlab.com/handbook/engineering/career-development/career-matrix.html&quot; target=&quot;_blank&quot;&gt;GitLab&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Dropbox&lt;/b&gt;&lt;/p&gt;&lt;p&gt;What’s a Career Framework?&lt;/p&gt;&lt;p&gt;The Engineering Career Framework is your source for how to achieve impact for your role and team and how to grow in your engineering career. For managers, it can help you set expectations with your teams and hold them accountable for their work.&lt;/p&gt;&lt;p&gt;What the Career Framework is not&lt;/p&gt;&lt;p&gt;This framework is not a promotion checklist for your role; rather, it’s designed to help you figure out what your impact could look like at the next level.&lt;/p&gt;&lt;p&gt;&amp;nbsp;This framework is not an exhaustive list of examples and behaviors; each responsibility includes three to four key behaviors that serve as guide for how to think about your work. Consequently, you’ll need to meet with your manager to define your impact goals and align on the expectations for your role.&amp;nbsp;&lt;/p&gt;&lt;p&gt;What’s in a Career Framework?&lt;/p&gt;&lt;p&gt;This framework is broken down into two components:&lt;/p&gt;&lt;p&gt;Level Expectations define the scope, collaborative reach, and levers for impact at every level; these expectations are the what that determines the difference between an IC3 and IC4, for example&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Core and Craft Responsibilities define the key behaviors specific to your role and team; these behaviors help you identify how you work to deliver impact based on your level expectations.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://dropbox.github.io/dbx-career-framework/overview.html&quot; target=&quot;_blank&quot;&gt;Dropbox&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Collection of tools&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.progression.fyi&quot; target=&quot;_blank&quot;&gt;Collection of progression frameworks and career ladders&lt;/a&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/1686904301815290859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2020/08/gitlab-engineering-career-framework.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/1686904301815290859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/1686904301815290859'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2020/08/gitlab-engineering-career-framework.html' title='GitLab and Dropbox: Engineering Career Frameworks, plus collection of tools!'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-8520967460285920906</id><published>2022-01-26T02:26:00.003-08:00</published><updated>2022-01-26T02:26:21.253-08:00</updated><title type='text'>Writing High-Performance Swift Code</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Enabling Optimizations&lt;/li&gt;&lt;li&gt;Whole Module Optimizations (WMO)&lt;/li&gt;&lt;li&gt;Reducing Dynamic Dispatch&lt;/li&gt;&lt;li&gt;Dynamic Dispatch&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Advice: Use &#39;final&#39; when you know the declaration does not need to be overridden&lt;/li&gt;&lt;li&gt;Advice: Use &#39;private&#39; and &#39;fileprivate&#39; when declaration does not need to be accessed outside of file&lt;/li&gt;&lt;li&gt;Advice: If WMO is enabled, use &#39;internal&#39; when a declaration does not need to be accessed outside of module&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Using Container Types Efficiently&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Advice: Use value types in Array&lt;/li&gt;&lt;li&gt;Advice: Use ContiguousArray with reference types when NSArray bridging is unnecessary&lt;/li&gt;&lt;li&gt;Advice: Use inplace mutation instead of object-reassignment&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Wrapping operations&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Advice: Use wrapping integer arithmetic when you can prove that overflow cannot occur&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Generics&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Advice: Put generic declarations in the same module where they are used&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;The cost of large Swift values&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Advice: Use copy-on-write semantics for large values&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Unsafe code&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Advice: Use unmanaged references to avoid reference counting overhead&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Protocols&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Advice: Mark protocols that are only satisfied by classes as class-protocols&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;The Cost of Let/Var when Captured by Escaping Closures&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Advice: Pass var as an inout if closure not actually escaping&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Unsupported Optimization Attributes&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;a href=&quot;https://github.com/apple/swift/blob/main/docs/OptimizationTips.rst&quot; target=&quot;_blank&quot;&gt;GitHub Apple&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/8520967460285920906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2022/01/writing-high-performance-swift-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/8520967460285920906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/8520967460285920906'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2022/01/writing-high-performance-swift-code.html' title='Writing High-Performance Swift Code'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-2870141741763554879</id><published>2021-11-19T02:37:00.008-08:00</published><updated>2021-11-19T02:45:59.336-08:00</updated><title type='text'>20 things learned in 20 years of software development</title><content type='html'>&lt;p&gt;Some good points:&lt;/p&gt;&lt;p&gt;4. Best code is no code - less code to maintain&lt;/p&gt;&lt;p&gt;6. Sometimes you just have to get started&lt;/p&gt;&lt;p&gt;&lt;b&gt;9. Nobody asks enough about “Why”&lt;/b&gt;&lt;/p&gt;&lt;p&gt;11. One of the biggest differences between junior and senior devs is the latter have a well founded, dedicated opionen about tools, with the skill to come to an agreement with others what to use in which context&lt;/p&gt;&lt;p&gt;17. Keep processes as lean as possible&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.simplethread.com/20-things-ive-learned-in-my-20-years-as-a-software-engineer/&quot; target=&quot;_blank&quot;&gt;20 Things I’ve Learned in my 20 Years as a Software Engineer&lt;/a&gt;&amp;nbsp;(Simple Thread)&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.golem.de/news/software-20-dinge-die-ich-in-20-jahren-als-entwickler-gelernt-habe-2111-161015.html&quot; target=&quot;_blank&quot;&gt;20 Dinge, die ich in 20 Jahren als Entwickler gelernt habe&lt;/a&gt;&amp;nbsp;(Golem)&lt;/p&gt;&lt;p&gt;PS. I would add: Having a vision helps to at least roughly steer all activities in the right direction. It needs to be accepted that the vision might change and steering will be adopted!&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/2870141741763554879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2021/11/20-things-learned-in-20-years-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/2870141741763554879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/2870141741763554879'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2021/11/20-things-learned-in-20-years-of.html' title='20 things learned in 20 years of software development'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-1396189716723296169</id><published>2021-11-16T01:10:00.000-08:00</published><updated>2021-11-16T01:10:03.554-08:00</updated><title type='text'>Software Engineering Salaries at Google: A Guide</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Google Engineer Levels&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Software Engineer II (L3 | 0-1 year of experience)&lt;/li&gt;&lt;li&gt;Software Engineer III (L4 | 2+ years of experience)&lt;/li&gt;&lt;li&gt;Senior Software Engineer (L5 | Manager I equivalent)&lt;/li&gt;&lt;li&gt;Staff Software Engineer (L6 | Manager II equivalent)&lt;/li&gt;&lt;li&gt;Senior Staff Software Engineer (L7 | Senior Manager)&lt;/li&gt;&lt;li&gt;Principal Engineer (L8 | Director)&lt;/li&gt;&lt;li&gt;Distinguished Engineer (L9 | Senior Director)&lt;/li&gt;&lt;li&gt;Google Fellow (L10 | Vice President)&lt;/li&gt;&lt;li&gt;Senior Google Fellow (L11 | Senior Vice President)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Google Software Engineer Salary&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Base compensation&lt;/li&gt;&lt;li&gt;Bonuses&lt;/li&gt;&lt;li&gt;Stock&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Google Software Engineer Stock Options&lt;/li&gt;&lt;li&gt;Benefits of Working at Google&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Insurance &amp;amp; Wellness&lt;/li&gt;&lt;li&gt;Transportation&lt;/li&gt;&lt;li&gt;Home, Financial, other&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Google vs Other Technology Companies&lt;/li&gt;&lt;ul&gt;&lt;li&gt;vs Microsoft and Amazon avg&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;&lt;a href=&quot;https://careerkarma.com/blog/software-engineering-salary-google/&quot;&gt;https://careerkarma.com/blog/software-engineering-salary-google/&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/1396189716723296169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2021/11/software-engineering-salaries-at-google.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/1396189716723296169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/1396189716723296169'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2021/11/software-engineering-salaries-at-google.html' title='Software Engineering Salaries at Google: A Guide'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-1974807775377635492</id><published>2021-11-15T05:54:00.002-08:00</published><updated>2021-11-16T04:09:48.337-08:00</updated><title type='text'>Different takes on A/B testing with native apps in Google Play and App Store</title><content type='html'>&lt;p&gt;&amp;nbsp;A short summary of options:&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Synthetic_control_method&quot; target=&quot;_blank&quot;&gt;&lt;b&gt;Synthetic Control Method&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Find a good prediction model on current data - and compare the real data after the change with the predicted data&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Phased Release/Staged Rollouts&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Phased release of new version and compare versus old version via tracking analytics&lt;/li&gt;&lt;li&gt;You can then compare the same content with different app versions on same OS&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Implement feature for one OS only - and compare&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Release for one OS only and compare versus other OS via tracking analytics&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Feature Toggles&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Feature toggle via remote config and switch feature on/off defining one or more explicit success criteria via Firebase A/B Testing&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Feature toggle and config options&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Feature toggle PLUS config via firebase remote config to not only switch on/off but do more experiments with different settings (color, number of items, sizes) via Firebase A/B Testing&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Server-driven UI and dynamic endpoints&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Using server driven UI, you can provide different endpoints and serve different endpoint URLs to the clients via remote config&lt;/li&gt;&lt;li&gt;You can pitch completely different UIs without manually adopting or releasing apps!&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;Some links:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://firebase.google.com/docs/remote-config&quot;&gt;https://firebase.google.com/docs/remote-config&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://firebase.google.com/docs/ab-testing&quot;&gt;https://firebase.google.com/docs/ab-testing&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/1974807775377635492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2021/11/different-takes-on-ab-testing-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/1974807775377635492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/1974807775377635492'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2021/11/different-takes-on-ab-testing-with.html' title='Different takes on A/B testing with native apps in Google Play and App Store'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-7103653698284064118</id><published>2021-11-04T07:33:00.006-07:00</published><updated>2021-11-04T07:33:55.878-07:00</updated><title type='text'>Staff Engineer: Leadership beyond the management track</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;img alt=&quot;StaffEng Banner&quot; src=&quot;https://staffeng.com/banner.png&quot; /&gt;&lt;/p&gt;&lt;p&gt;Nice blog post about staff (or engineering manager) archetypes:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;Staff Engineer: Leadership beyond the management track&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;The &lt;b&gt;Tech Lead&lt;/b&gt; guides the approach and execution of a particular team. They partner closely with a single manager, but sometimes they partner with two or three managers within a focused area. Some companies also have a Tech Lead Manager role, which is similar to the Tech Lead archetype but exists on the engineering manager ladder and includes people management responsibilities.&lt;/li&gt;&lt;li&gt;The &lt;b&gt;Architect&lt;/b&gt; is responsible for the direction, quality, and approach within a critical area. They combine in-depth knowledge of technical constraints, user needs, and organization level leadership.&lt;/li&gt;&lt;li&gt;The &lt;b&gt;Solver&lt;/b&gt; digs deep into arbitrarily complex problems and finds an appropriate path forward. Some focus on a given area for long periods. Others bounce from hotspot to hotspot as guided by organizational leadership.&lt;/li&gt;&lt;li&gt;The &lt;b&gt;Right Hand&lt;/b&gt; extends an executive&#39;s attention, borrowing their scope and authority to operate particularly complex organizations. They provide additional leadership bandwidth to leaders of large-scale organizations.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;This blog also has a nice cal overview to visualize the different working approaches for each archetype:&lt;/div&gt;&lt;div&gt;&lt;img alt=&quot;Example calendar for a Tech Lead archetype&quot; height=&quot;200&quot; src=&quot;https://staffeng.com/archetypes//TechLeadCalendar.png&quot; width=&quot;320&quot; /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://staffeng.com/guides/staff-archetypes&quot; target=&quot;_blank&quot;&gt;StaffEng&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you want to read about this, checkout the book &lt;a href=&quot;https://www.amazon.de/Staff-Engineer-Leadership-beyond-management/dp/1736417916/ref=sr_1_1?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;amp;crid=TTTY4JKDWJ80&amp;amp;keywords=staff+engineer+archetypes&amp;amp;qid=1636036137&amp;amp;sprefix=jordan+cp3.12%2Caps%2C60&amp;amp;sr=8-1&quot; target=&quot;_blank&quot;&gt;Staff Engineer: Leadership beyond the management track&lt;/a&gt;!&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/7103653698284064118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2021/11/staff-engineer-leadership-beyond.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/7103653698284064118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/7103653698284064118'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2021/11/staff-engineer-leadership-beyond.html' title='Staff Engineer: Leadership beyond the management track'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-5139448969125516558</id><published>2021-08-03T06:28:00.003-07:00</published><updated>2021-08-03T06:28:24.108-07:00</updated><title type='text'>Unidirectional Data Flow with iOS: RxFeedback and CombineFeedback</title><content type='html'>&lt;p&gt;Unidirectional Reactive Architecture. This is a RxSwift implemetation.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/shoheiyokoyama/RxFeedback&quot;&gt;https://github.com/shoheiyokoyama/RxFeedback&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Unidirectional Reactive Architecture. This is a Combine implemetation of ReactiveFeedback and RxFeedback&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/sergdort/CombineFeedback&quot;&gt;https://github.com/sergdort/CombineFeedback&lt;/a&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/5139448969125516558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2021/08/unidirectional-data-flow-with-ios.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/5139448969125516558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/5139448969125516558'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2021/08/unidirectional-data-flow-with-ios.html' title='Unidirectional Data Flow with iOS: RxFeedback and CombineFeedback'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-505637887523968066</id><published>2021-08-03T05:03:00.002-07:00</published><updated>2021-08-03T05:03:58.129-07:00</updated><title type='text'>Point Free: Composable Architecture</title><content type='html'>&lt;p&gt;Architecture is a tough problem and there’s no shortage of articles, videos and open source projects attempting to solve the problem once and for all. In this collection we systematically develop an architecture from first principles, with an eye on building something that is composable, modular, testable, and more.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.pointfree.co/collections/composable-architecture&quot; target=&quot;_blank&quot;&gt;Composable Architecture - Point Free&lt;/a&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/505637887523968066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2021/08/point-free-composable-architecture.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/505637887523968066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/505637887523968066'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2021/08/point-free-composable-architecture.html' title='Point Free: Composable Architecture'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-8921914806117488076</id><published>2021-06-02T01:28:00.003-07:00</published><updated>2021-06-02T01:28:35.669-07:00</updated><title type='text'>Firebase Remote Config now supports automatic personalization!</title><content type='html'>&lt;p&gt;Firebase Remote Config is a great tool to enable dynamic config, feature toggles or even A/B testing with your native apps.&lt;/p&gt;&lt;p&gt;Only thing you need to keep in mind that default update rate is 12h, but there is an official workaround for that for emergency use cases, trying avoid to exceed the quota (&lt;a href=&quot;https://firebase.google.com/docs/remote-config/propagate-updates-realtime&quot; target=&quot;_blank&quot;&gt;Propagate Remote Config updates in real time&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;Now Google took it a step further, allowing automatic personalization via Firebase Remote Config!&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Last but not least, we’re putting the finishing touches on a new feature of Remote Config, called personalization. Personalization will give you the ability to automatically optimize individual user experiences to maximize the objectives you care about - such as revenue or engagement - through the power of machine learning. After a simple setup, personalization will continuously find and apply the right app configuration for each user to produce the best outcome, taking the load off of you. If you want an early look at this feature and to try it out for yourself, join our Alpha program.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://firebase.googleblog.com/2021/05/whats-new-from-firebase-at-google-io.html#Firebase&quot; target=&quot;_blank&quot;&gt;Firebase Google Blog&lt;/a&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/8921914806117488076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2021/06/firebase-remote-config-now-supports.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/8921914806117488076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/8921914806117488076'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2021/06/firebase-remote-config-now-supports.html' title='Firebase Remote Config now supports automatic personalization!'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-8934239599205929782</id><published>2021-05-27T01:20:00.000-07:00</published><updated>2021-05-27T01:20:06.888-07:00</updated><title type='text'>Lean prioritization matrix</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;img height=&quot;435&quot; src=&quot;https://3lsqjy1sj7i027fcn749gutj-wpengine.netdna-ssl.com/wp-content/uploads/2017/07/Picture1.png&quot; width=&quot;668&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;We are sorting the stream of stakeholder request and product ideas in a KPI-weighted table.&lt;/p&gt;&lt;p&gt;&lt;b&gt;The Matrix&lt;/b&gt;&lt;/p&gt;&lt;p&gt;This 2x2 matrix&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;low effort vs. high effort&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;high value vs. low value&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;is a nice and easy consumable visualization model.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The Weights&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Suggested weights are&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;Reach&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;How many customers does the feature impact?&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Customers&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;New/existing target groups&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Revenue&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Will it drive revenue either direct or via extended CLV?&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Acquisition&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Will the feature help drive new customers?&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Efficiency&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Does the feature help drive efficiency in customers’ lives – be that internal customers (colleagues), or external (paying) customers?&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Brand&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Does the feature enhance your brand awareness?&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The classification/quadrants&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Top left to bottom right&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;Q1&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Do it now!&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Q2&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Break it down and put in prio sequence&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Q3&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Gap filler&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Q4&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Forget about it... for now.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://www.mindtheproduct.com/enter-matrix-lean-prioritisation/&quot; target=&quot;_blank&quot;&gt;Andy Wicks - Mind the product&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/8934239599205929782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2021/05/lean-prioritization-matrix.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/8934239599205929782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/8934239599205929782'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2021/05/lean-prioritization-matrix.html' title='Lean prioritization matrix'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-5154263856924014993</id><published>2021-04-21T04:22:00.000-07:00</published><updated>2021-04-21T04:22:49.731-07:00</updated><title type='text'>Xcodes.app - The easiest way to install and switch between Xcode versions</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://github.com/RobotsAndPencils/XcodesApp/raw/main/screenshot.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;541&quot; data-original-width=&quot;800&quot; height=&quot;271&quot; src=&quot;https://github.com/RobotsAndPencils/XcodesApp/raw/main/screenshot.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;The easiest way to install and switch between multiple versions of Xcode.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;If you&#39;re looking for a command-line version of Xcodes.app, try &lt;span style=&quot;font-family: courier;&quot;&gt;xcodes&lt;/span&gt;.&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/RobotsAndPencils/XcodesApp&quot; target=&quot;_blank&quot;&gt;GitHub.com RobotsAndPencils&lt;/a&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/5154263856924014993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2021/04/xcodesapp-easiest-way-to-install-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/5154263856924014993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/5154263856924014993'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2021/04/xcodesapp-easiest-way-to-install-and.html' title='Xcodes.app - The easiest way to install and switch between Xcode versions'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-2630984755382835471</id><published>2021-04-08T01:18:00.002-07:00</published><updated>2021-04-08T01:18:45.755-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="iOS"/><title type='text'>iOS and iPadOS Usage</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqPERFtV3xKBuXZFCrPPS9HdkYqc0iVLsgOcVy-_5TvpoCrIEVtOAHaqmC60ISpvyVbEicch50RI2PYlsz_wadQJ55KOfq-v7YVHStE4UGVE1l33VyJzBh-EHVJiGmB54efJxCLHdRoEc/s999/Bildschirmfoto+2021-04-08+um+09.59.47.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;999&quot; data-original-width=&quot;331&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqPERFtV3xKBuXZFCrPPS9HdkYqc0iVLsgOcVy-_5TvpoCrIEVtOAHaqmC60ISpvyVbEicch50RI2PYlsz_wadQJ55KOfq-v7YVHStE4UGVE1l33VyJzBh-EHVJiGmB54efJxCLHdRoEc/s320/Bildschirmfoto+2021-04-08+um+09.59.47.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Please find here the official Apple stats of the iOS and iPadOS update rate - of the device sold the last four years (sic!).&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://developer.apple.com/support/app-store/&quot; target=&quot;_blank&quot;&gt;Apple Developer&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/2630984755382835471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2021/04/ios-and-ipados-usage.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/2630984755382835471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/2630984755382835471'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2021/04/ios-and-ipados-usage.html' title='iOS and iPadOS Usage'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqPERFtV3xKBuXZFCrPPS9HdkYqc0iVLsgOcVy-_5TvpoCrIEVtOAHaqmC60ISpvyVbEicch50RI2PYlsz_wadQJ55KOfq-v7YVHStE4UGVE1l33VyJzBh-EHVJiGmB54efJxCLHdRoEc/s72-c/Bildschirmfoto+2021-04-08+um+09.59.47.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-3277025601948621329</id><published>2021-04-08T00:30:00.001-07:00</published><updated>2021-08-09T04:59:16.365-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="iOS"/><title type='text'>How to make your iOS (and Android) app secure</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;b&gt;Checks&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;No Non-SSL connections (http only)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Black-box check with proxy, e.g. &lt;a href=&quot;https://www.charlesproxy.com&quot; target=&quot;_blank&quot;&gt;Charles Proxy&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Enable &lt;a href=&quot;https://developer.apple.com/documentation/security/preventing_insecure_network_connections&quot; target=&quot;_blank&quot;&gt;Apple Transport Security&lt;/a&gt; (ATS) to enforce SSL&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Make sure all used backend services use TLS v1.2+ and &lt;b&gt;do not allow&lt;/b&gt; TLS v1.0 or v1.1 any more&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.venafi.com/blog/why-its-dangerous-use-outdated-tls-security-protocols&quot; target=&quot;_blank&quot;&gt;Deprecation of TLS 1.0 and TLS 1.1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Make sure to use secure Cipher-Suites (see &lt;a href=&quot;https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR02102/BSI-TR-02102-2.pdf;jsessionid=0F7F148D5D5D850847963B8F81231DA6.internet082?__blob=publicationFile&amp;amp;v=2&quot; target=&quot;_blank&quot;&gt;BSI recommendations&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Make sure servers do not support SSLv3 protocol any more!&lt;/li&gt;&lt;li&gt;Make sure your &lt;a href=&quot;https://de.wikipedia.org/wiki/Datenschutz-Grundverordnung&quot; target=&quot;_blank&quot;&gt;ePrivacy&lt;/a&gt;/&lt;a href=&quot;https://www.google.com/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=&amp;amp;cad=rja&amp;amp;uact=8&amp;amp;ved=2ahUKEwif9s6wkO7vAhUz_rsIHfBNClsQFjAAegQICxAD&amp;amp;url=https%3A%2F%2Fgdpr.eu%2F&amp;amp;usg=AOvVaw1_B7ShEjuXC6XxQwesHq7A&quot; target=&quot;_blank&quot;&gt;GDPR&lt;/a&gt; and Apple Tracking Transparency (&lt;a href=&quot;https://developer.apple.com/documentation/apptrackingtransparency&quot; target=&quot;_blank&quot;&gt;ATT&lt;/a&gt;) implementation reacts correctly on opt-outs of tracking&lt;/li&gt;&lt;li&gt;Consider public &lt;a href=&quot;https://medium.com/supercharges-mobile-product-guide/public-key-hash-pinning-on-ios-703ca255cb11&quot; target=&quot;_blank&quot;&gt;key pinning&lt;/a&gt;/&lt;a href=&quot;https://www.raywenderlich.com/1484288-preventing-man-in-the-middle-attacks-in-ios-with-ssl-pinning&quot; target=&quot;_blank&quot;&gt;certificate pinning&lt;/a&gt; for additional security vs. man in the middle attacks&lt;/li&gt;&lt;li&gt;Make sure all used libs have the latest patches/versions - and are still maintained&lt;/li&gt;&lt;li&gt;Make sure to request required permissions only!&lt;/li&gt;&lt;li&gt;Make sure no hard-coded client secrets are present&lt;/li&gt;&lt;ul&gt;&lt;li&gt;See also&amp;nbsp;&lt;a href=&quot;https://nshipster.com/secrets/&quot; target=&quot;_blank&quot;&gt;Secret Management on iOS&lt;/a&gt;, Tim Dolenko &lt;a href=&quot;https://github.com/timdolenko/swift-secrets&quot; target=&quot;_blank&quot;&gt;swift-secrets&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Use &lt;a href=&quot;https://developer.apple.com/documentation/security/certificate_key_and_trust_services/keys/storing_keys_in_the_keychain&quot; target=&quot;_blank&quot;&gt;KeyChain&lt;/a&gt; for storing data securely and check &lt;a href=&quot;https://support.apple.com/de-de/guide/security/secf6276da8a/web&quot; target=&quot;_blank&quot;&gt;File Data Protection&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://betterprogramming.pub/how-to-prevent-screen-capture-at-ios-14-1f01173c31c0&quot; target=&quot;_blank&quot;&gt;Avoid screen recording and capturing in production app&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Make sure to &lt;a href=&quot;https://www.netguru.com/codestories/ios-logging-practices&quot; target=&quot;_blank&quot;&gt;disable compromising logs in production&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.shashankthakur.dev/2020/09/how-to-detect-jailbroken-ios-device.html&quot; target=&quot;_blank&quot;&gt;Check for Jailbreak&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Make sure WebViews do not set isHTTPOnly = false or isSecure = false cookies&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Third party WebView content is hard to check - especially dynamic content&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Additional Checks&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You think iOS apps are sandboxed and need to pass the Apple review and therefore you are on the safe side? Think again...&lt;/div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Enable ATS in mobile apps&lt;/li&gt;&lt;li&gt;SSL Cert Pinning&lt;/li&gt;&lt;li&gt;Storing info in KeyChain rather than NSUserDefaults&lt;/li&gt;&lt;li&gt;Avoiding confidential info as part of code repository&lt;/li&gt;&lt;li&gt;Jailbreak Detection&lt;/li&gt;&lt;li&gt;Debug Logs Only&lt;/li&gt;&lt;li&gt;Third Party Library Usage&lt;/li&gt;&lt;li&gt;File Data Protection&lt;/li&gt;&lt;li&gt;Screen Recording &amp;amp; Capturing&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Details from Shashank Thakur@&lt;a href=&quot;https://medium.com/swlh/how-to-make-an-ios-app-secure-831e310c79e2&quot;&gt;Medium.com&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Tools&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://portswigger.net/burp/&quot; target=&quot;_blank&quot;&gt;BurpSuite&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.frida.re/&quot; target=&quot;_blank&quot;&gt;FRIDA&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/dpnishant/appmon&quot; target=&quot;_blank&quot;&gt;AppMon&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/ajinabraham/Mobile-Security-Framework-MobSF/ &quot; target=&quot;_blank&quot;&gt;MobSF&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/sensepost/objection/ &quot; target=&quot;_blank&quot;&gt;objection&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://testssl.sh/&quot; target=&quot;_blank&quot;&gt;TestSSL&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.wireshark.org/&quot; target=&quot;_blank&quot;&gt;Wireshark&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.charlesproxy.com&quot; target=&quot;_blank&quot;&gt;CharlesProxy&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/3277025601948621329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2021/04/how-to-make-your-ios-app-secure.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/3277025601948621329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/3277025601948621329'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2021/04/how-to-make-your-ios-app-secure.html' title='How to make your iOS (and Android) app secure'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-3324741811419252775</id><published>2021-03-18T06:45:00.000-07:00</published><updated>2021-03-18T06:45:02.329-07:00</updated><title type='text'>Getting Started with Swift on Android</title><content type='html'>&lt;p&gt;The Swift stdlib can be compiled for Android armv7, x86_64, and aarch64 targets, which makes it possible to execute Swift code on a mobile device running Android or an emulator. This guide explains:&lt;/p&gt;&lt;p&gt;How to run a simple &quot;Hello, world&quot; program on your Android device.&lt;/p&gt;&lt;p&gt;How to run the Swift test suite on an Android device.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/apple/swift/blob/main/docs/Android.md&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/3324741811419252775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2021/03/getting-started-with-swift-on-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/3324741811419252775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/3324741811419252775'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2021/03/getting-started-with-swift-on-android.html' title='Getting Started with Swift on Android'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-272767104670784073</id><published>2021-03-11T03:58:00.005-08:00</published><updated>2021-03-11T04:09:59.059-08:00</updated><title type='text'>AppMon/MobSF  - Automated framework for monitoring and tampering system API calls macOS, iOS and Android</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;img alt=&quot;&quot; src=&quot;https://raw.githubusercontent.com/dpnishant/appmon/master/resources/logo.png&quot; style=&quot;max-width: 100%;&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;AppMon is an automated framework for monitoring and tampering system API calls of native macOS, iOS and android apps. It is based on &lt;a href=&quot;https://frida.re/&quot; target=&quot;_blank&quot;&gt;Frida&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;It consists of the following components:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;AppMon Sniffer - Intercept API calls to figure out interesting operations performed by an App&lt;/li&gt;&lt;li&gt;AppMon Intruder - Manipulate API calls data to create change app&#39;s original behavior&lt;/li&gt;&lt;li&gt;AppMon Android Tracer - Automatically traces Java classes, methods, its arguments and their data-types in Android APKs&lt;/li&gt;&lt;li&gt;AppMon IPA Installer - Creates and installs &quot;inspectable&quot; IPAs on non-jailbroken iOS devices&lt;/li&gt;&lt;li&gt;AppMon APK Builder - Creates APKs &quot;inspectable&quot; on non-rooted Android devices&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;a href=&quot;https://github.com/dpnishant/appmon&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img alt=&quot;&quot; src=&quot;https://cloud.githubusercontent.com/assets/4301109/20019521/cc61f7fc-a2f2-11e6-95f3-407030d9fdde.png&quot; style=&quot;max-width: 100%;&quot; /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mobile Security Framework (MobSF) is an automated, all-in-one mobile application (Android/iOS/Windows) pen-testing, malware analysis and security assessment framework capable of performing static and dynamic analysis.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://github.com/MobSF/Mobile-Security-Framework-MobSF&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/272767104670784073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2021/03/appmon-automated-framework-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/272767104670784073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/272767104670784073'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2021/03/appmon-automated-framework-for.html' title='AppMon/MobSF  - Automated framework for monitoring and tampering system API calls macOS, iOS and Android'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-5760716180951737476</id><published>2021-01-08T04:10:00.002-08:00</published><updated>2021-01-08T04:10:10.984-08:00</updated><title type='text'>FF Chartwell: Defining pie chart, bar charts and many others via vector font!</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;img alt=&quot;&quot; class=&quot;aligncenter size-full wp-image-23611&quot; height=&quot;270&quot; src=&quot;https://www.fontblog.de/wp-content/uploads/2012/05/chartwell_aufmacher.png&quot; title=&quot;FF-Chartwell-Beispiel-Disgramme&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;With FF Chartwell you can define Charts via OpenType font, and transform a string, e.g. &quot;&lt;b&gt;60+&lt;span style=&quot;color: #2b00fe;&quot;&gt;30&lt;/span&gt;+&lt;span style=&quot;color: red;&quot;&gt;10&lt;/span&gt;&lt;/b&gt;&quot; into a Pie Chart 60%-30%-10% including color support (not only b/w!) without rendering anything: directly via font without using any images!&lt;/p&gt;&lt;p&gt;Check this out:&lt;br /&gt;&lt;a href=&quot;https://www.fontblog.de/einfuhrung-in-ff-chartwell/&quot; target=&quot;_blank&quot;&gt;FontBlog FF Chartwell&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;So great!&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/5760716180951737476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2021/01/ff-chartwell-defining-pie-chart-bar.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/5760716180951737476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/5760716180951737476'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2021/01/ff-chartwell-defining-pie-chart-bar.html' title='FF Chartwell: Defining pie chart, bar charts and many others via vector font!'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4858171838588273694.post-5319328863768985607</id><published>2020-12-17T01:09:00.003-08:00</published><updated>2020-12-17T01:09:25.047-08:00</updated><title type='text'>Google Play: Best Apps 2020</title><content type='html'>&lt;p&gt;&lt;b&gt;&amp;nbsp;Celebrating the Developers Behind the Best Apps and Games of 2020&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Best App of 2020&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=co.loona&quot; target=&quot;_blank&quot;&gt;Loóna: Bedtime Calm &amp;amp; Relax by Loona Inc.&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Best Personal Growth Apps&lt;/li&gt;&lt;li&gt;Best Hidden Gem Apps&lt;/li&gt;&lt;li&gt;Best Everyday Essential Apps&lt;/li&gt;&lt;li&gt;Best Apps for Good&lt;/li&gt;&lt;li&gt;Best Apps for Fun&lt;/li&gt;&lt;li&gt;Best Game of 2020&lt;/li&gt;&lt;li&gt;Best Indie Games&lt;/li&gt;&lt;li&gt;Best Casual Games&lt;/li&gt;&lt;li&gt;Best Innovative Games&lt;/li&gt;&lt;li&gt;Best Competitive Games&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://android-developers.googleblog.com/2020/11/celebrating-developers-behind-best-apps.html&quot; target=&quot;_blank&quot;&gt;Android Developers&lt;/a&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://dev-ios.blogspot.com/feeds/5319328863768985607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dev-ios.blogspot.com/2020/12/google-play-best-apps-2020.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/5319328863768985607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4858171838588273694/posts/default/5319328863768985607'/><link rel='alternate' type='text/html' href='http://dev-ios.blogspot.com/2020/12/google-play-best-apps-2020.html' title='Google Play: Best Apps 2020'/><author><name>pkc</name><uri>http://www.blogger.com/profile/11284498566079935658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>