{"id":208,"date":"2020-10-18T00:05:00","date_gmt":"2020-10-18T00:05:00","guid":{"rendered":"https:\/\/oqtacore.com\/app2\/?p=208"},"modified":"2022-11-24T08:00:40","modified_gmt":"2022-11-24T08:00:40","slug":"4-steps-of-moving-android-apps-to-ios","status":"publish","type":"post","link":"https:\/\/oqtacore.com\/blog\/4-steps-of-moving-android-apps-to-ios\/","title":{"rendered":"4 steps of moving Android apps to iOS"},"content":{"rendered":"<div class=\"article-content clearfix\">\n<figure><\/figure>\n<h2 style=\"text-align: left;\"><span class=\"ez-toc-section\" id=\"Steps_of_converting_the_app\"><\/span><span style=\"font-size: 16px;\">Steps of converting the app<\/span><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>It is possible that you already have an Android app that is making money. And if you are reading this, decide that you want to double your success and move the app to iOS?<\/p>\n<p>You did right in the first place. In most cases, it\u2019s better to start a mobile app with one platform and then move to another platform. The most famous example is Instagram \u2013 it started as an iPhone-only app and then moved to Android only one and a half year later \u2013 you can read more about this super-successful case here https:\/\/techcrunch.com\/2012\/04\/24\/the-rise-of-instagram-tracking-the-apps-spread-worldwide<\/p>\n<p>Moving Android apps to iOS might be considered easy, but unfortunately, it is not the point if your app is anything more sophisticated than a calculator app. The reasons for this:<\/p>\n<ul>\n<li>Android and iOS have different design guidelines, and the UI for the apps sometimes has to differ significantly to be approved by a moderator; for example, look at WhatsApp for Android and iOS. Even disregarding colors, screenshots look like they are of 2 different apps. The navigation is located very differently;<\/li>\n<li>Apple is much more strict about app notifications when moderating an app, while Android gives a lot of flexibility to the users and allows them to select which notifications they want to receive.<\/li>\n<li>Apple always uses human moderators, while on Android you can skip with automated moderation<\/li>\n<li>Android and iOS are very different technologically. iOS runs binary code, while Android runs the so-called\u00a0<strong>byte-code<\/strong>. Speaking the simple language, the difference is like between gasoline and electric cars \u2013 the innards are as different as it can get, while on the surface it might look very similar.<\/li>\n<\/ul>\n<p>But there are also some good points:<\/p>\n<ul>\n<li>Creating a responsive layout of an iOS app is a breeze after doing the same for Android. iPhones have much, much less different screen sizes, and they are much closer to each other performance-wise. So if you have the hard experience of Android, working on iOS will be a walk in the park<\/li>\n<li>iPhone users spend more per app on average. If your app earns money with Android users, there is a high chance that you will earn more per-user on iOS<\/li>\n<\/ul>\n<h2><\/h2>\n<h2><span class=\"ez-toc-section\" id=\"Step_1_review_the_basic_functionality_of_the_app\"><\/span>Step 1: review the basic functionality of the app<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Just as you had a fundamental design process when creating your app for Android, it will also be your first step when moving the app to iOS. Try to recollect all the design documents you had for your MVP on Android. When you have them, revise them and edit them to represent your vision of the iOS app.<\/p>\n<p>Just as with your first Android app, it might be a good idea to have gradual releases every few weeks. Do not underestimate differences in platforms \u2013 it might be that some 3rd party library that you depend on does not exist on the other platform, and this will significantly change your plans. It is possible to account for such small things, but you just never can be sure. So it is better to roll out piece by piece and try to work around the difficulties as they appear.<\/p>\n<p>And not only speaking about 3rd party libraries, but obstacles can also happen with:<\/p>\n<ul>\n<li>push notifications<\/li>\n<li>UI language<\/li>\n<li>size of the screen<\/li>\n<li>app access rights<\/li>\n<li>platform API possibilities<\/li>\n<li>user authorization (touch vs Face ID)<\/li>\n<li>security requirements<\/li>\n<\/ul>\n<p>You may do this work yourself or hire a specialist. This is pretty much technical work and does not require your attention as the core ideologist. you might look for a software product manager for this task.<\/p>\n<p>As a result of step 1, you should end up with your new high-level spec for the iOS app that has:<\/p>\n<ul>\n<li>All the main screens<\/li>\n<li>All the functionality from the user-side perspective (under the hood details are not described)<\/li>\n<li>Monetization strategy<\/li>\n<li>Market analysis<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"Step_2_In-depth_work_on_adopting_the_app\"><\/span>Step 2: In-depth work on adopting the app<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>In the first step, you pinpointed the differences between iOS and Android. This is very important, but in step 2 you have to dive into the details.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"iOS_vs_Android_UI_Design_The_Main_Differences\"><\/span>iOS vs. Android UI Design: The Main Differences<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3>1. Change the UI to account for no built-in \u2018back\u2019 button<\/h3>\n<p>Remember that iOS does not have a default \u2018back\u2019 button. On Android devices, there was always a hardware \u2018back\u2019 button, later replaced with a built-in \u2018back\u2019 button of Android on the screen. Android has offered the software option from the earliest versions, but they were a backup option until 2015 mostly.<\/p>\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-214 size-full\" src=\"http:\/\/blog.oqtacore.com\/wp-content\/uploads\/2020\/10\/2020-10-29_23-23-31.png\" alt=\"navigation bar\" width=\"533\" height=\"72\" srcset=\"https:\/\/oqtacore.com\/blog\/wp-content\/uploads\/2020\/10\/2020-10-29_23-23-31.png 533w, https:\/\/oqtacore.com\/blog\/wp-content\/uploads\/2020\/10\/2020-10-29_23-23-31-300x41.png 300w, https:\/\/oqtacore.com\/blog\/wp-content\/uploads\/2020\/10\/2020-10-29_23-23-31-180x24.png 180w\" sizes=\"auto, (max-width: 533px) 100vw, 533px\" \/><figcaption>In Android, the user has these 3 buttons on every screen<\/figcaption><\/figure>\n<p>iOS has never had a default \u2018back\u2019 button. So on each screen, you have to think of a place where you could put this \u2018back\u2019 button while not crumpling the UI.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-215 size-full\" src=\"http:\/\/blog.oqtacore.com\/wp-content\/uploads\/2020\/10\/2020-10-29_23-27-05.png\" alt=\"Back button\" width=\"208\" height=\"188\" srcset=\"https:\/\/oqtacore.com\/blog\/wp-content\/uploads\/2020\/10\/2020-10-29_23-27-05.png 208w, https:\/\/oqtacore.com\/blog\/wp-content\/uploads\/2020\/10\/2020-10-29_23-27-05-180x163.png 180w\" sizes=\"auto, (max-width: 208px) 100vw, 208px\" \/><figcaption>In iOS, you have to make sure that the \u201cBack\u201d button is there on each screen!<\/figcaption><\/figure>\n<\/div>\n<p>To make sure you do everything right, get yourself familiar with the platform\u2019s guidelines:\u00a0<a href=\"https:\/\/developer.apple.com\/design\/human-interface-guidelines\/\" target=\"_blank\" rel=\"noreferrer noopener\">Human Interface Guidelines<\/a>\u00a0(HIG) for iOS and\u00a0<a href=\"https:\/\/material.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Material Design<\/a>\u00a0for Android.<\/p>\n<p>An important thing to notice is that even the measurement units for iOS and Android are different: iOS uses\u00a0pt, while Android apps should use\u00a0<a href=\"https:\/\/material.io\/design\/layout\/pixel-density.html#density-independence\" target=\"_blank\" rel=\"noreferrer noopener\">dp<\/a>. Android uses dp because it has many more displays to accommodate, so its system is a little more advanced. DP\u2019s are density-independent pixels, so your image has the same size while having different pixel density: hdpi, xhdpi, xxhdpi, and xxxhdpi. In iOS it is the other way around: you provide pictures of different resolutions (1x, 2x, and 3x) and iOS selects the resolution based on the device.<\/p>\n<h3><strong>2. Android: elevation, iOS \u2013 flat. The importance of elevation in Material<\/strong><\/h3>\n<p>One of the important differences in the UI concepts of Android and iOS is that Android represents the screen as a multi-level field. Widgets can be higher and lower, with higher widgets casting shadows onto the lower ones. So a lot of detail in Android UI comes with shadows.<\/p>\n<p>On the other hand, iOS has almost no shadows. You can find shadows in App Store though, but it is more an exception. And when you migrate your app from Android to iOS, you should plan not to have shadows if you plan to follow HIG.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"An_important_question_of_step_2_can_we_just_port_the_Android_UI_to_iOS_with_little_to_no_changes\"><\/span>An important question of step 2: can we just port the Android UI to iOS with little to no changes?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>If you ask this question, then we have good news for you: yes you can! A lot of apps look almost identical on Android and iOS, even with the \u2018Back\u2019 button in Android where it can be skipped as having no additional value.<\/p>\n<p>So, if you plan to do it quick and easy, just make sure to include the \u2018Back\u2019 button everywhere, check the layout of the screens on the iPhone or iPad resolutions and pixel density, and your UI will be good to go!<\/p>\n<figure class=\"wp-block-image alignwide\"><a href=\"https:\/\/oqtacore.com\/app2\/wp-content\/uploads\/2020\/10\/iOS-Hero.svg\"><img decoding=\"async\" class=\"alignnone size-full wp-image-216\" src=\"https:\/\/oqtacore.com\/app2\/wp-content\/uploads\/2020\/10\/iOS-Hero.svg\" alt=\"\"><\/a><\/figure>\n<p>iOS Human Interface Guidelines (HIG)<\/p>\n<p>&nbsp;<\/p>\n<figure class=\"wp-block-image alignwide\">\n<p><div id=\"attachment_217\" style=\"width: 1074px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-217\" class=\"wp-image-217 size-full\" src=\"http:\/\/blog.oqtacore.com\/wp-content\/uploads\/2020\/10\/unnamed1.png\" alt=\"Featured \" width=\"1064\" height=\"532\" srcset=\"https:\/\/oqtacore.com\/blog\/wp-content\/uploads\/2020\/10\/unnamed1.png 1064w, https:\/\/oqtacore.com\/blog\/wp-content\/uploads\/2020\/10\/unnamed1-300x150.png 300w, https:\/\/oqtacore.com\/blog\/wp-content\/uploads\/2020\/10\/unnamed1-1024x512.png 1024w, https:\/\/oqtacore.com\/blog\/wp-content\/uploads\/2020\/10\/unnamed1-768x384.png 768w, https:\/\/oqtacore.com\/blog\/wp-content\/uploads\/2020\/10\/unnamed1-180x90.png 180w, https:\/\/oqtacore.com\/blog\/wp-content\/uploads\/2020\/10\/unnamed1-800x400.png 800w\" sizes=\"auto, (max-width: 1064px) 100vw, 1064px\" \/><p id=\"caption-attachment-217\" class=\"wp-caption-text\">Android Design Guide<\/p><\/div><\/figure>\n<p>But there are also some good points:<\/p>\n<ul>\n<li>Creating a responsive layout of an iOS app is a breeze after doing the same for Android. iPhones have much, much less different screen sizes, and they are much closer to each other performance-wise. So if you have the hard experience of Android, working on iOS will be a walk in the park<\/li>\n<li>iPhone users spend more per app on average. If your app earns money with Android users, there is a high chance that you will earn more per-user on iOS<\/li>\n<\/ul>\n<p>Here are the\u00a0<strong>most important differences<\/strong>\u00a0that UX\/UI designers need to take into account when \u201ctranslating\u201d an app from iOS to Android or vice versa (to learn more, you can visit https:\/\/learnui.design\/blog\/ios-vs-android-app-ui-design-complete-guide.html ):<\/p>\n<table class=\"wp-block-table\">\n<tbody>\n<tr>\n<td>DESIGN ELEMENT<\/td>\n<td>IOS<\/td>\n<td>ANDROID<\/td>\n<\/tr>\n<tr>\n<td>Minimum tap target size<\/td>\n<td>44\u00d744 pt<\/td>\n<td>48\u00d748 dp (<a href=\"https:\/\/learnui.design\/blog\/ios-vs-android-app-ui-design-complete-guide.html#tap-target\" target=\"_blank\" rel=\"noopener noreferrer\">What\u2019s a dp?<\/a>)<\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/learnui.design\/blog\/ios-vs-android-app-ui-design-complete-guide.html#primary-nav\" target=\"_blank\" rel=\"noopener noreferrer\">Main app navigation<\/a><\/td>\n<td>Bottom nav<\/td>\n<td>Tabs at top of screen<\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/learnui.design\/blog\/ios-vs-android-app-ui-design-complete-guide.html#secondary-nav\" target=\"_blank\" rel=\"noopener noreferrer\">Secondary app navigation<\/a><\/td>\n<td>Bottom nav \u201cMore\u201d OR on-page UI<\/td>\n<td>Bottom nav OR \u201chamburger button\u201d side menu<\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/learnui.design\/blog\/ios-vs-android-app-ui-design-complete-guide.html#primary-actions\" target=\"_blank\" rel=\"noopener noreferrer\">Primary button\/action<\/a><\/td>\n<td>Top nav, right side<\/td>\n<td>Floating action button<\/td>\n<\/tr>\n<tr>\n<td>Secondary actions<\/td>\n<td>On-page UI<\/td>\n<td>Top nav, right side<\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/learnui.design\/blog\/ios-vs-android-app-ui-design-complete-guide.html#selection\" target=\"_blank\" rel=\"noopener noreferrer\">Single-choice lists<\/a><\/td>\n<td>List with checkmark for selected item<\/td>\n<td>Radio button list<\/td>\n<\/tr>\n<tr>\n<td>Multiple-choice lists<\/td>\n<td>List with switches OR list with checkmarks for selected items<\/td>\n<td>Checkbox list OR list with switches<\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/learnui.design\/blog\/ios-vs-android-app-ui-design-complete-guide.html#undo\" target=\"_blank\" rel=\"noopener noreferrer\">Confirm or allow undo of destructive actions<\/a><\/td>\n<td>Modal dialog to confirm choice<\/td>\n<td>Allow Undo via temporary on-screen notifications<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2><span class=\"ez-toc-section\" id=\"Step_3_the_actual_development\"><\/span>Step 3: the actual development<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>When your UI design is prepared to be moved to the other platform, and you have decided on the functionality that will be moved or maybe even introduced, it is time to start implementing the port.<\/p>\n<p>The first technical issue is finding all the 3rd party dependencies. As you may know, modern apps are only 10-20% are independent creations. Most of the inner workings of the apps are taken from open-sourced or proprietary binary collections of code called libraries. Examples of libraries are:<\/p>\n<ul>\n<li>Internet connectivity<\/li>\n<li>FaceID, TouchID<\/li>\n<li>Image filters<\/li>\n<li>and many, many, many more<\/li>\n<\/ul>\n<p>The worst part is that you have no guarantee that an open-source library A that you used for Android will have a counterpart in iOS. It is a fifty-fifty chance that you will have to use another open-source library B that does some things differently or even\u00a0<strong>lacks<\/strong>\u00a0some functionality. It happens all the time.<\/p>\n<p>For the most proprietary libraries, you will find both iOS and Android versions. That means, for payment gateways and social networks you will also have a library both for Android and iOS.<\/p>\n<p>All that being said, migrating an app from Android to iOS is a development task of almost the same effort as building the original app for Android. The difference might in that you already have the audience, you know all the screens and you can make the architecture of the app simpler and better.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_4_quality_assurance\"><\/span>Step 4: quality assurance<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>An important last step is quality assurance. You are not building an MVP now, and your audience expects a well-built and working app.<\/p>\n<p>Types of tests:<\/p>\n<ul>\n<li>Functional testing<\/li>\n<li>Integration testing<\/li>\n<li>Security testing<\/li>\n<li>Performance and Load testing<\/li>\n<\/ul>\n<p>Except for these highly technical tests that can yield a well-working app that no one needs, there are also tests targeted at your target audience:<\/p>\n<ul>\n<li>validation tests<\/li>\n<li>usability tests<\/li>\n<li>acceptance tests<\/li>\n<\/ul>\n<p>We will cover these types of testing in our blog in the future articles<\/p>\n<p>It is possible that you have built your Android app without tests. it is not very uncommon that the first version of apps does not have a lot of testing due to cost cuts. When you are extending your app to a new market, another approach should be taken \u2013 as the risk costs are higher and you have only one try in taking over iOS market (you wouldn\u2019t change the app name now if something goes wrong, right?), you should test your app rigorously. Testing is usually taking 25-35% additional development time if done well. This time is not a time wasted, and an amazing number of errors are found and fixed during this period.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Migrating Android app to iOS might seem like a simple task, but if done right, it will take almost the same amount of time as building the original Android app, including analysis of target audience and feature design.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Steps of converting the app It is possible that you already have an Android app that is making money. And if you are reading this, decide that you want to double your success and move the app to iOS? You did right in the first place. In most cases, it\u2019s better to start a mobile [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_mo_disable_npp":"","yasr_overall_rating":0,"yasr_post_is_review":"","yasr_auto_insert_disabled":"","yasr_review_type":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-208","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"acf":{"image":209},"yasr_visitor_votes":{"number_of_votes":2,"sum_votes":6,"stars_attributes":{"read_only":false,"span_bottom":false}},"_links":{"self":[{"href":"https:\/\/oqtacore.com\/blog\/wp-json\/wp\/v2\/posts\/208","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oqtacore.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/oqtacore.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/oqtacore.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/oqtacore.com\/blog\/wp-json\/wp\/v2\/comments?post=208"}],"version-history":[{"count":18,"href":"https:\/\/oqtacore.com\/blog\/wp-json\/wp\/v2\/posts\/208\/revisions"}],"predecessor-version":[{"id":971,"href":"https:\/\/oqtacore.com\/blog\/wp-json\/wp\/v2\/posts\/208\/revisions\/971"}],"wp:attachment":[{"href":"https:\/\/oqtacore.com\/blog\/wp-json\/wp\/v2\/media?parent=208"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oqtacore.com\/blog\/wp-json\/wp\/v2\/categories?post=208"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oqtacore.com\/blog\/wp-json\/wp\/v2\/tags?post=208"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}