<?xml version="1.0" encoding="utf-8"?>
<!-- generator="Kirby" -->
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">

  <channel>
    <title>Mot-cl&#233;: ios &#183; Blog &#183; Liip</title>
    <link>https://www.liip.ch/fr/blog/tags/ios</link>
    <generator>Kirby</generator>
    <lastBuildDate>Wed, 11 Jul 2018 00:00:00 +0200</lastBuildDate>
    <atom:link href="https://www.liip.ch" rel="self" type="application/rss+xml" />

        <description>Articles du blog Liip avec le mot-cl&#233; &#8220;ios&#8221;</description>
    
        <language>fr</language>
    
        <item>
      <title>It's never &#34;just a WebView&#34;</title>
      <link>https://www.liip.ch/fr/blog/its-never-just-a-webview</link>
      <guid>https://www.liip.ch/fr/blog/its-never-just-a-webview</guid>
      <pubDate>Wed, 11 Jul 2018 00:00:00 +0200</pubDate>
      <description><![CDATA[<p>Thomas already talked about how <a href="https://www.liip.ch/en/blog/do-i-need-a-mobile-application-or-a-mobile-website">the web and the app ecosystems are different</a>. They don't have the same goals, and should aim for a different user experience. I will focus on the technical side on implementing a website into a native app using <a href="https://developer.android.com/reference/android/webkit/WebView.html">WebView</a> on Android and <a href="https://developer.apple.com/documentation/webkit/wkwebview">WKWebView</a> on iOS here.</p>
<h4>Websites have extra UI that you don't want in your app</h4>
<p>Websites always have extra content which is not needed, when wrapping them in an app. They have a header title, a navigation menu, and a footer with extra links. Depending on how much &quot;native&quot; you want your app to appear, you will show a native navigation bar, a custom navigation flow and certainly not a footer under each screen.</p>
<p>If you are lucky, you can ask the website developer to create a special template for the app to remove those extra features and only show the main content. Otherwise you'll have to <a href="https://www.google.com/search?q=webview+inject+javascript">inject javascript</a> to hide this content.</p>
<h4>If the website contains a special &quot;app&quot; template, make sure you always use it</h4>
<p>We built an app where the website had a special template. Each page could be loaded with the extra parameter <code>mobile=true</code> like <code>http://www.liip.ch/?mobile=true</code>. This worked great, but each link contained to the page <em>did not</em> have this extra parameter. If we’d simply allowed link clicks without filtering, the user would see the non-app pages. We had to catch every link that the user clicked, and append the extra parameter &quot;manually&quot;. This is quite easy for <code>GET</code> parameters, but it can get quite tricky when <code>POST</code>ing a form.</p>
<h4>Making sure users cannot go anywhere</h4>
<p>By default a WebView will follow every link. This means that as long as the web page shows a link, the user will be able to click on. If your page links to Google or Wikipedia, the user can go anywhere <strong>from within the app</strong>. That can be confusing.</p>
<p>It is easier to block every link, and specifically allow those that we know, in a &quot;<a href="https://www.wikiwand.com/en/Whitelisting">whitelist</a>&quot; fashion. This is particularly important because the webpage can change without the app developer being notified. New links can appear on the application and capsize the whole navigation.</p>
<h4>WebViews take a lot of memory</h4>
<p>WebViews <a href="https://www.google.ch/search?q=webview+memory+usage">use a lot of RAM</a> compared to a native view. When a WebView is hidden — when we show another screen or put the app in background for example — it is very likely that the system will kill the Android <code>Activity</code> that contains the WebView or the whole iOS application.</p>
<p>As it takes a lot of memory, it matches killing criterias to making space for other apps in the system.</p>
<p>When restoring the <code>Activity</code> or application which contains the WebView, the view has lost its context. This means, if the user entered content in a form, everything is gone. Furthermore, if the user navigated within the website, the WebView can’t remember on which page the user was.</p>
<p>You can mitigate some of the inconvenience by handling state restoration on <a href="https://developer.android.com/guide/components/activities/activity-lifecycle.html#saras">Android</a> and <a href="https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/PreservingandRestoringState.html#//apple_ref/doc/uid/TP40007457-CH28-SW6">iOS</a>. Going as far as remembering the state inside a WebView will cause a lot of distress for the developer :)</p>
<h4>WebView content is a blackbox</h4>
<p>Unless you inject JavaScript to know what is inside, you cannot know what is displayed to the user. You don't know which areas are clickable, you don't know (easily) if the view is scrollable, etc...</p>
<h4>WebViews don't handle file downloads</h4>
<p>On iOS, there is no real concept of file system, even with the new <a href="https://support.apple.com/en-ph/HT206481">Files app</a>. If your website offers PDF downloads for example, the WebView does simply nothing. An option is to catch the URLs that are PDFs and open Safari to view them.</p>
<p>On Android, you can use <a href="https://developer.android.com/reference/android/webkit/WebView.html#setDownloadListener(android.webkit.DownloadListener)">setDownloadListener</a> to be notified when the WebView detects a file that should be downloaded instead of displayed. You have to handle the file download by using <a href="https://developer.android.com/reference/android/app/DownloadManager.html">DownloadManager</a> for example.</p>
<pre><code class="language-kotlin">webview.setDownloadListener { url, _, contentDisposition, mimetype, _ -&gt;
  val uri = Uri.parse(url)
  val request = DownloadManager.Request(uri)
  val filename = URLUtil.guessFileName(url, contentDisposition, mimetype)
  request.allowScanningByMediaScanner()
  request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
  request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename)
  val dm = context?.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
  dm.enqueue(request)
}</code></pre>
<h4>WebViews don't handle non-http protocols such as <code>mailto:</code></h4>
<p>You will have to catch any non-http protocol loads and define what the application should do.</p>
<h4>The Android back button is not handled</h4>
<p>If the user presses their back button, the standard action (leave activity, ...) will happen. It will not do a &quot;previous page&quot; action like the user is used to. You have to handle it yourself.</p>
<pre><code class="language-kotlin">webview.setOnKeyListener { _, keyCode, event -&gt;
 if (keyCode == KeyEvent.KEYCODE_BACK &amp;&amp; event.action == MotionEvent.ACTION_UP &amp;&amp; webview.canGoBack()) {
    webview.goBack()
    return@setOnKeyListener true
 }
  return@setOnKeyListener false
}</code></pre>
<h4>There is no browser UI to handle previous page, reload, loading spinner, etc...</h4>
<p>If the website is more than one page, you need to have the possibility to go back and forth in the navigation history. This is important if you removed the website's header/footer/menu in particular. On Android, users can still use the back button (if you enabled it) but on iOS there is no way to do that.</p>
<p>You should offer the possibility to reload the page. Showing a loading indicator so that users know when the page is loaded completely, like in a native application or a standard browser helps.</p>
<h4>This is no default way to display errors</h4>
<p>When an HTTP error occurs, if you don't have a network connection for example, the WebView doesn’t handle it for you.</p>
<p>On iOS, the view will not change. If the first page fails to load, you will have a white screen.</p>
<p>On Android, you will have an ugly default error message like this one:</p>
<figure><img src="https://liip.rokka.io/www_inarticle/9ab16d/webview-error-cropped.jpg" alt=""></figure>
<h4>WebViews don't know how to open <code>target="_blank"</code> links</h4>
<p>WebViews don't know how to handle links that are supposed to open a new browser window. You have to handle it. You can decide to stop the &quot;new window&quot; opening and load the page on the same WebView for example. But by default nothing will happen for those links.</p>
<h4>iOS and security</h4>
<p>iOS is — rightfully — very conservative regarding security. Apple added <a href="https://developer.apple.com/library/content/releasenotes/General/WhatsNewIniOS/Articles/iOS9.html#//apple_ref/doc/uid/TP40016198-SW14">App Transport Security</a> in iOS 9 to prevent loading unsecure content. If your website does not use a recent SSL certificate, you will have to <a href="https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html">disable ATS</a>, which <strong>never</strong> is a good sign.</p>
<h4>It is hard to make code generic</h4>
<p>Since every page can be different, having different needs, it is hard to make code generic. For a client, where we show two sub-pages of their website on different screens, we have two webview handlers because of the various needs.</p>
<p>Once you have thought through all these things and believe you can start coding your webview, you will discover that iOS and Android handle them differently.</p>
<ul>
<li>On iOS every page load if caught by <a href="https://developer.apple.com/documentation/webkit/wknavigationdelegate/1455643-webview">webView(_:decidePolicyFor:decisionHandler:)</a> and can be treated by our code
<ul>
<li>Except <code>target="_blank"</code> links which have to be handled by <a href="https://developer.apple.com/documentation/webkit/wkuidelegate/1536907-webview">webView(_:createWebViewWith:for:windowFeatures:)</a> which is actually another delegate!</li>
</ul></li>
<li>On Android, only a subset of page loads are handled by <a href="https://developer.android.com/reference/android/webkit/WebViewClient.html#shouldOverrideUrlLoading(android.webkit.WebView,%20android.webkit.WebResourceRequest)">shouldOverrideUrlLoading()</a>
<ul>
<li>The first URL loading programmatically is always loaded</li>
<li>Only <code>GET</code> loads go through the filter. When <code>POST</code>ing a form, the handler is not called</li>
</ul></li>
</ul>
<h4>There is a strong dependency on the website</h4>
<p>Once you faced all challenges and your app is ready to ship, there is one last thing that you cannot control: You are displaying a website that you did not code, and that is most likely not managed by someone in your company.</p>
<p>If the website changes, there is a high chance that the webmaster doesn’t think of telling you. Mainly because he doesn’t think one change on the website is enough to mess up your app completely.</p>
<h2>Conclusion</h2>
<p>WebViews can be used for wrapping upon existing websites fast, but it is never &quot;just&quot; a WebView. There is some work to do to deliver the high quality that we promise at Liip. My advices for you:</p>
<ul>
<li>Use <a href="https://en.wikipedia.org/wiki/Defensive_programming">Defensive programming</a>.</li>
<li>List all features of each page with the client, and define the steps clearly, like for any native app.</li>
<li>Get in touch with the website developer and collaborate. Make sure they tell you when the website changes.</li>
</ul>]]></description>
                  <enclosure url="http://liip.rokka.io/www_card_2/2625d7/featured.jpg" length="9957" type="image/png" />
          </item>
        <item>
      <title>Why and how we use Xamarin</title>
      <link>https://www.liip.ch/fr/blog/why-how-xamarin</link>
      <guid>https://www.liip.ch/fr/blog/why-how-xamarin</guid>
      <pubDate>Fri, 01 Jun 2018 00:00:00 +0200</pubDate>
      <description><![CDATA[<p>When we start a new project, we always ask ourselves if we should choose Xamarin over a full native solution. I wanted to reflect on past projects and see if it was really worth using Xamarin. </p>
<p>But how do you compare projects? I decided to use line counting. It can seem obvious or simplistic, but the number of shared lines of code will easily show how much work has been done once instead of twice. I took the two most recent Xamarin projects that we worked on <a href="https://ski.ticketcorner.ch/campaign/ski-app">Ticketcorner Ski</a> and <a href="https://www.together-in-switzerland.ch">together</a>.</p>
<p>I used the following method:</p>
<ul>
<li>Use the well-known <a href="https://github.com/AlDanial/cloc/">cloc</a> tool to count the number of lines in a project.</li>
<li>Count only C# files.
<ul>
<li>Other types such as json configuration files or API response mocks in unit tests do not matter.</li>
</ul></li>
<li>Make an exception with Android layout files.
<ul>
<li>Our iOS layout is all done in Auto Layout code and we don't use Xcode Interface Builder.</li>
<li>To have a fair comparison, I included the Android XML files in the line count.</li>
</ul></li>
<li>Do not count auto-generated files.</li>
<li>Do not count blank lines and comments.</li>
<li>Other tools like <a href="https://fastlane.tools/">Fastlane</a> are also shared, but are not taken into account here.</li>
</ul>
<p>If you want to try with one of your one project, here are the commands I used for the C# files:</p>
<pre><code class="language-bash">cloc --include-lang="C#" --not-match-f="(([Dd]esigner)|(AssemblyInfo))\.cs" .</code></pre>
<p>For the Android XML layouts, I used:</p>
<pre><code class="language-bash">cloc  --include-lang="xml" --force-lang="xml",axml Together.Android/Resources/layout</code></pre>
<h2>Here is what I found:</h2>
<table>
<thead>
<tr>
<th style="text-align: left;">Project</th>
<th style="text-align: center;">Android</th>
<th style="text-align: center;">iOS</th>
<th style="text-align: center;">Shared</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">Ticketcorner Ski</td>
<td style="text-align: center;">31%</td>
<td style="text-align: center;">31%</td>
<td style="text-align: center;"><strong>38%</strong></td>
</tr>
<tr>
<td style="text-align: left;">together</td>
<td style="text-align: center;">42%</td>
<td style="text-align: center;">30%</td>
<td style="text-align: center;"><strong>28%</strong></td>
</tr>
</tbody>
</table>
<p>We can see that on those projects, an average of one third of code can be shared. I was pretty impressed to see that for Ticketcorner Ski we have the same number of lines on the two platforms. I was also pleasantly surprised to see that the project almost <strong>shares 40% of its code</strong>.</p>
<p>In a mobile app, most of the unit tests target the business logic, which is exactly what is shared with Xamarin: business logic and their unit tests are only written once. Most libraries not directly related to business logic are also shared: REST client, Database client, etc...</p>
<p>The code that is not shared is mostly UI code, interaction, etc... But it is also platform specific code: how to access the camera, how to handle push notifications, how to securely store user credentials according to each platform's guidelines.</p>
<p>It would not be fair to conclude that doing those projects in native would have been 30% more expensive. The shared code has sometimes to take into account that it will be used on two different platforms, and it gets more generic than it would be if written twice.</p>
<h2>So... how do you choose one or the other ?</h2>
<p>My goal with this blogpost is not to start a flame war on whether Xamarin is good or bad. I have shown here that for those projects, it was the right choice to use Xamarin. I want to share a few things we think about when we have to make a decision. Note that we use Xamarin.iOS and Xamarin.Android, but don't use Xamarin.Forms.</p>
<ul>
<li>Does the application contain a lot of business logic, or is it more UI-based?
<ul>
<li>With one Xamarin project we worked on in the past year, a specific (and complex) use-case was overlooked by the client and it resulted in paying users being pretty unhappy. We were very pleased to be able to fix the problem once, and write the related unit tests once too.</li>
<li>As a counterexample, for the <a href="https://www.zoo.ch/de/apps">Zürich Zoo app</a>, most of our job was writing UX/UI code. The business logic is solely doing GET requests to a backend.</li>
</ul></li>
<li>Do you plan to use external libraries/SDKs?
<ul>
<li>Xamarin is pretty good at <a href="https://docs.microsoft.com/en-us/xamarin/android/platform/binding-java-library/binding-a-jar">using .jar files on Android</a>.</li>
<li>Native libraries on iOS <a href="https://docs.microsoft.com/en-us/xamarin/cross-platform/macios/binding/objective-sharpie/">have to be processed manually</a> and it can be tedious to do. It is also hard to use a library packaged with CocoaPods that depends on many other pods.</li>
<li>For both platforms, We encountered closed-source tools that are not that easy to convert. As an example, we could use the <a href="https://www.datatrans.ch/en/technics/payment-apis/in-app-payment-libraries">Datatrans SDK</a>, but not without some <em>trial and error</em>.</li>
<li>There are however other Xamarin libraries that can replace what you are used to when developping on both platforms. We replace <a href="http://square.github.io/picasso/">Picasso</a> on Android and <a href="https://github.com/onevcat/Kingfisher">Kingfisher</a> on iOS by <a href="https://github.com/luberda-molinet/FFImageLoading">FFImageLoading</a> on Xamarin. This library has the same API methods on both platforms which makes it easy to use.</li>
</ul></li>
<li>Do you plan to use platform-specific features?
<ul>
<li>Xamarin is able to provide access to every platform feature, and it works well. It is also known that they update the Xamarin SDKs as soon as new iOS/Android versions are announced.</li>
<li>For <a href="https://www.liip.ch/x/cy7o8c">Urban Connect</a> however, the most important part of the app is using <em>Bluetooth Low Energy</em> to connect to bike locks. Even if Xamarin is able to do it too, it was the right decision to remove this extra layer and code everything natively.</li>
</ul></li>
<li>Tooling, state of the platform ecosystems:
<ul>
<li>In the mobile world, things move really fast:
<ul>
<li>Microsoft pushes really hard for developers to adopt Xamarin, for example with <a href="https://appcenter.ms/">App Center</a>, the new solution to build, test, release, and monitor apps. But Visual Studio for Mac is still really buggy and slow.</li>
<li>Google added first-class support for <a href="https://www.liip.ch/en/blog/kotlin-why-i-will-never-go-back-to-java">Kotlin</a>, has an awesome IDE and pushes mobile development with platforms like Firebase or Android Jetpack.</li>
<li>Apple follows along, but still somehow fails to improve Xcode and its tooling in a meaningful manner.</li>
</ul></li>
<li><strong>Choices made one day will certainly not be valid one year later.</strong></li>
</ul></li>
<li>Personal preferences:
<ul>
<li>Inside Liip there are very divergent opinions about Xamarin. We always choose the right tool for the job. Having someone efficient and motivated about a tool is important too.</li>
</ul></li>
</ul>
<p>I hope I was able to share my view on why and how we use Xamarin here at Liip. I personally enjoy working both on Xamarin or native projects. Have a look at <a href="https://www.together-in-switzerland.ch">together</a> and <a href="https://ski.ticketcorner.ch/campaign/ski-app">Ticketcorner Ski</a> and tell us what you think!</p>]]></description>
                  <enclosure url="http://liip.rokka.io/www_card_2/c03533/2000px-xamarin-logo-svg.jpg" length="48001" type="image/png" />
          </item>
        <item>
      <title>One.Thing.Less goes live!</title>
      <link>https://www.liip.ch/fr/blog/one-thing-less-goes-live</link>
      <guid>https://www.liip.ch/fr/blog/one-thing-less-goes-live</guid>
      <pubDate>Fri, 25 May 2018 00:00:00 +0200</pubDate>
      <description><![CDATA[<h2>Making privacy and data protection actionable by anyone</h2>
<p>You surely received many companies’ emails about your data privacy during last weeks. That’s due to the new European law (called GDPR for General Data Protection Regulation) that became enforceable on the 25th of May 2018.<br />
This is a major step towards a more responsible usage of personal data by companies, as you can now request information on how your data is being used, and ask to change it.</p>
<p>Nevertheless, as James Aschberger (Founder &amp; CEO of One.Thing.Less AG) noticed, many people didn’t understand how they can concretely claim their rights using this new regulation.</p>
<p><em>&quot;It’s overwhelming, where do I even start?&quot;</em></p>
<p><em>&quot;I am worried about my data, but I don’t have the time or knowledge to contact companies individually or read through all the privacy policies and terms of use they put in front of me.&quot;</em></p>
<p><em>&quot;I receive so many messages regarding data privacy, but I don’t understand all of it and don’t have time to read the fine print.&quot;</em></p>
<h2>There is an app for that now</h2>
<p>We at Liip have <a href="https://www.liip.ch/en/blog/one-thing-less-ag-unites-with-liip-to-launch-its-mobile-app">worked hard</a> during the past four months to make the One.Thing.Less dream of James happen — a free and simple way to take control over the use of your personal data.</p>
<p>You can now <a href="https://itunes.apple.com/app/one-thing-less/id1353068746">download the app on the Apple App Store</a> (and in June on Google Play for Android) and make your voice heard by companies.</p>
<figure><img src="https://liip.rokka.io/www_resize/resize-width-300/030ec3/onethingless-mobile-app-homescreen.jpg" alt="One.Thing.Less mobile app Homescreen" width="300"></figure>
<p><em>One.Thing.Less mobile app Homescreen</em></p>
<h2>Keep It Simple, Stupid (aka KISS)</h2>
<p>When James first came to us, he made it clear that the User Experience had to be simple. That was one of our main challenge: solve this complex legal problem via one click.</p>
<p>This is what we did.</p>
<figure><img src="https://liip.rokka.io/www_resize/resize-width-300/df49da/onethingless-mobile-app-ask-companies.jpg" alt="Ask companies about the use of your personal data, in one tap." width="300"></figure>
<p><em>Ask companies about the use of your personal data, in one tap.</em></p>
<p>On the above view, you can just press the “Send request” to ask a company seven (simple) questions about the use of your personal data. Companies have to provide a response within 30 days under GDPR.</p>
<p>Then you can request them to change how they make use of your personal data, still one click away.</p>
<figure><img src="https://liip.rokka.io/www_resize/resize-width-700/526751/onethingless-mobile-app-act-preview.jpg" alt="Change the way companies use your personal data." width="700"></figure>
<p><em>Change the way companies use your personal data</em></p>
<h2>A trustful partnership</h2>
<p>We can’t stop talking about trust here at Liip, as we believe that’s one of the core element of successful products and companies.<br />
This project was a great example of how one of our mottos “Trust over control” can lead to extraordinary results, in less than four months.</p>
<p><em>&quot;Successfully launching our platform in such a short time was only possible because we established and earned mutual trust along the entire journey together. If I had not been able to trust that each of the Liip team members delivers, we would have failed.&quot;</em> James Aschberger, Founder &amp; CEO at One.Thing.Less AG</p>
<p><em>&quot;It was a chance to craft such a meaningful product, in a trustful and solution-oriented partnership.&quot;</em> Thomas Botton, Product Owner at Liip</p>]]></description>
                  <enclosure url="http://liip.rokka.io/www_card_2/7c3560/onethingless-mobile-app-launch.jpg" length="663436" type="image/png" />
          </item>
        <item>
      <title>One.Thing.Less AG entrusts Liip with the launch of its mobile app</title>
      <link>https://www.liip.ch/fr/blog/one-thing-less-ag-unites-with-liip-to-launch-its-mobile-app</link>
      <guid>https://www.liip.ch/fr/blog/one-thing-less-ag-unites-with-liip-to-launch-its-mobile-app</guid>
      <pubDate>Wed, 02 May 2018 00:00:00 +0200</pubDate>
      <description><![CDATA[<p>One.Thing.Less AG will empower and enable individuals around the world to regain control over the use of their personal data in an easy and secure way. We currently help the startup to craft its mobile app and platform so it’s ready for the launch day on the 25th of May 2018.</p>
<h2>From idea to product</h2>
<p>This product idea comes from James Aschberger, Founder &amp; CEO of One.Thing.Less AG, who saw the opportunity in the new <a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">GDPR regulation</a> to bring back balance in the personal data “crisis” that our world currently faces. Their mobile app will allow you — in one-tap — to ask for visibility on what some companies such as Facebook or Google or Starbucks have and do with your data. More importantly, once they answered, you will be able to act and request changes on how they deal with your personal data. The goal of the product is that you are in control of the use of your personal data.<br />
I loved to hear such a pitch, and so did my mobile teammates. We hence kickstarted our collaboration back in January.</p>
<figure><img src="https://liip.rokka.io/www_inarticle/f0449e/liip-blog-otl-launch2.jpg" alt="One.Thing.Less-Liip team during a User Experience workshop"></figure>
<p><em>One.Thing.Less-Liip team during a User Experience workshop.</em></p>
<h2>Finding a strong mobile partner, with the right (startup) mindset</h2>
<p>One.Thing.Less’ challenge was their lack of an internal technical team. We solved their issue by putting up a cross-functional team tailored to their needs — composed of mobile and backend developers, as well as designers.</p>
<p>On top of this, and that’s maybe the most critical of all, we answered the need of James to find a trustworthy team with people having the right startup mindset:</p>
<p><em>“Once our idea was clear, the biggest challenge was to identify the right UX and technical team to bring it to life. Being a small startup, the chemistry needs to be right and the team mindset needs to be diverse. After our first meeting with Liip I had a strong feeling about the team and their know-how. It was after the second meeting that we were totally convinced that they not only have the technical expertise but also the right spirit and determination to bring this idea into a tangible product.”</em> — James Aschberger, Founder &amp; CEO of One.Thing.Less AG</p>
<p>We at Liip are all entrepreneurs, and the way we are <a href="https://www.liip.ch/en/blog/self-organization">self-organized</a> allows us to act as such on a daily basis. This reassured and convinced the CEO of One.Thing.Less that Liip was the right choice.<br />
It’s been only three months that we work together, but we already feel like we are one unique team, with one common goal — that is to launch a product that will impact lives positively.</p>
<figure><img src="https://liip.rokka.io/www_inarticle/3d11d3/one-thing-less-mobile-development.jpg" alt="Development of the One.Thing.Less mobile app and platform"></figure>
<p><em>Development of the One.Thing.Less mobile app and platform.</em></p>
<h2>Data, public or private, should be controlled by whom it belongs to</h2>
<p>If you follow us since a while, you surely know that the data topic is part of our DNA. From <a href="https://www.liip.ch/en/work/api">API</a> to allow interoperability of IT systems, to <a href="https://www.liip.ch/en/work/open-data">Open Data</a> to give back transparency to citizens, we were always involved in such domains and will remain for the long run. This collaboration with One.Thing.Less confirms it.</p>
<p>We can’t wait to put this product into your hands on the 25th of May. Stay tuned and sign up for a launch notification at <a href="https://www.onethingless.com">www.onethingless.com</a></p>]]></description>
                  <enclosure url="http://liip.rokka.io/www_card_2/bad153/liip-blog-otl-launch1.jpg" length="353028" type="image/jpeg" />
          </item>
        <item>
      <title>Urban Connect Mobile App Golive (And The Challenges We Faced)</title>
      <link>https://www.liip.ch/fr/blog/urban-connect-mobile-app-golive-and-the-challenges-we-faced</link>
      <guid>https://www.liip.ch/fr/blog/urban-connect-mobile-app-golive-and-the-challenges-we-faced</guid>
      <pubDate>Thu, 01 Feb 2018 00:00:00 +0100</pubDate>
      <description><![CDATA[<p>Back in October, we kickstarted the relaunch of the Urban Connect bicycle fleet solution for their corporate clients (amongst which are Google and Avaloq). We provided the startup with User Experience, design, and mobile development services. The goal was to launch a brand new iOS and Android mobile app, as well as a new back-office and API. This new solution will enable the startup to grow its activity based on a robust and scalable digital platform.</p>
<p>The golive happened successfully last week — yeah!, and while we prepare our celebration lunch, I thought it is maybe interesting to share the challenges we faced during this purposeful project, and how we overcame them.</p>
<h2>Make The User Use The App The Least Possible!</h2>
<p>This product development was particular because we soon realized that for once, we were crafting a mobile app that should be used the least possible. That’s for a goal when all what we hear nowadays is about user retention and engagement.<br />
The point is that Urban Connect service is about providing a bike solution with a smart lock that can be opened with your smartphone (via Bluetooth technology). People want to use it to book a bike and go from a point A to a point B, with the least friction possible — including with our mobile app software.</p>
<p>This key discovery was possible thanks to our UX workshops that focus on the user problems first. Concretely, it means that we went to the Google Zürich office to analyze and listen to how real users were using the solution, and which problems they had. That’s when we got that users wanted to use the app the least possible, and that it works automagically without getting their smartphone out of their pocket.<br />
It’s only afterwards that we started to draw the first wireframes, and iterated on prototypes with Urban Connect and its clients to be sure that what we’re going to build was answering the real issues.<br />
And finally, we developed and applied the user interface design layers.</p>
<p>This resulted in one of the Google users stating:</p>
<p><em><strong>“Wow, that’s like a Tesla!<br />
I never use the key, but it’s always there with me, and it just works.”</strong></em></p>
<p>Again, we looked at the problems first, not at the design aspects. It may sound simple, but it still isn’t such a mainstream approach as one could think.</p>
<h2>On Third-Party Smart Locks, Fancy Android Phones, and MVP</h2>
<p>Most of the struggles we had to overcome were linked to the Bluetooth connectivity between the smart locks from Noke, and the Chinese Android devices.</p>
<p>The issues we faced with the Noke Smart Lock solution were that the company is still a startup, and as such, there are still some perks to their product such as outdated documentation, or hardware reliability.<br />
Nevertheless, our solution was to not enter in a blame game party with them and Urban Connect, and rather contact them directly to fix the problems, one at a time. We must say that they were really responsive and helpful, so much that all of our main blockers were removed in less than a few days each time.<br />
But that’s something to take into account in the planning and investment margin when you do estimation — thankfully we did!</p>
<figure><img src="https://liip.rokka.io/www_inarticle/294682/urban-connect-mobile-app-development.jpg" alt="Tests of our Urban Connect Mobile App Developments"></figure>
<p><em>Testing Session of our Urban Connect Mobile App.</em></p>
<p>As for the fancy Android phones, that’s the same story one hear everywhere: Android devices’ fragmentation sucks. We’re prepared to face such issues, and bought many different Android devices to be sure to have a good coverage.<br />
Nevertheless, there are always corner cases such as a fancy Chinese phone with a specific Android ROM — one that is obviously not sold anymore to simplify the thing.<br />
We overcame this issue thanks to a simple tool: communication. We didn’t play the blame game, and got in contact with the end user to figure out what was the problem on his device, so that we could understand it better.</p>
<p>Although communication is a good ally, its effect is the most effective when you start to use it as early as possible in the project.<br />
As we use the Minimum Viable Product approach to develop our products, this allowed us to focus on this critical points upfront from day one, face them, and find solutions — vs. building the entire thing and being stuck at the golive with unsolvable issues.</p>
<h2>Trustful Partnership as a Key to Success</h2>
<p>On top of the usual UX and technical challenges that we face in every project, one key to the success of this product launch was the people involved. And the trustful collaboration between  Urban Connect and us.<br />
We faced many different challenges, from unexpected events, to sweats about planning deadlines (we made it on time, be reassured). And every single time, Judith and her team trusted us, as we did all along the way. Without this trust, we could have failed at many points during the project, but we both chose to remain in a solution-oriented mindset, and focus on the product launch goal. It proved to work, once again.</p>
<figure><img src="https://liip.rokka.io/www_inarticle/e3e56a/urban-connect-trustful-partnership.jpg" alt="A Trustful Partnership as a Key to a Product Success"></figure>
<p><em>A Trustful Partnership as the Key to a Product Success.</em></p>
<h2>What’s next for Urban Connect?</h2>
<p>Now that we happily pressed the “Go Live!” button, we’re first going to celebrate it properly around a nice lunch in Zürich. It was intense, but we love to work on such purposeful products which will help cities get more healthier thanks to less pollution and more physical activity for its users.</p>
<p>Then, we’ll have plenty of features to work on in 2018, including innovative ones like integrating IoT modules to the platform. We’ll make sure to share such new cool stuff with you.</p>
<p>In case you want to learn more about Urban Connect e-bike fleet service, feel free to contact Judith to get more infos and a demo of our solution.</p>]]></description>
                  <enclosure url="http://liip.rokka.io/www_card_2/3facca/urban-connect-golive.jpg" length="532536" type="image/jpeg" />
          </item>
        <item>
      <title>Going on a ride with Urban Connect</title>
      <link>https://www.liip.ch/fr/blog/going-on-a-ride-with-urban-connect</link>
      <guid>https://www.liip.ch/fr/blog/going-on-a-ride-with-urban-connect</guid>
      <pubDate>Fri, 03 Nov 2017 00:00:00 +0100</pubDate>
      <description><![CDATA[<p>Urban Connect provides complete bicycle fleet solutions for corporate clients. For example Google and Avaloq trust Urban Connect to provide fleets of e-bikes for their employees who need to move around the city. In this mobility environment, the user experience and stability of the software solution are crucial.</p>
<h2>A successful startup</h2>
<p>Judith Häberli founded Urban Connect in 2013. As CEO, her first concern was to test the market as soon as possible with a real product. For this reason, the team developed its initial minimum viable product. About a year later, the startup found its market and matured into an established enterprise in the mobility market. Today the proof-of-concept is achieved. Optimizing the user experience, improving the system stability, and having a better software evolutivity are the next challenges.</p>
<figure><img src="https://liip.rokka.io/www_inarticle/8579514aad66211748d3ef4a44758363aa98c579/urbanconnectteam.jpg" alt="Urban Connect Team"></figure>
<p><em>On Urban Connect office’s terrace in Zürich for our partnership kick-off (from left to right): Judith (UC), Noé &amp; Darja (Liip), Luting (UC), Jonas &amp; Thomas (Liip) and Robert (UC).</em></p>
<h2>Towards a robust and scalable software base</h2>
<p>In order to ensure the next maturity level of the company, Urban Connect asked us to partner on the development of their product: new iOS and Android mobile applications connected to a hardware device, a new Fleet Management System, and a new API. The deadline is tight, in order to keep their customers satisfied. At Liip, we will put a strong emphasis on a flawless user journey, backed-up by a robust technical implementation. It will provide Urban Connect with the basis needed to grow during the upcoming years.</p>
<h2>Our commitment to delight Urban Connect users</h2>
<p>Our UX process will support Judith and her team to craft a new solution that is designed around the users. We will then develop it iteratively in order to receive user feedbacks as early as possible.<br />
We are excited to start this new partnership as it is exactly what we love. Indeed, we like to be fully involved from the start, and to work in an entrepreneurship spirit.</p>]]></description>
                  <enclosure url="http://liip.rokka.io/www_card_2/781ba753ae1422dc05b795e45929c25a1f4c62c5/mig-2301.jpg" length="708254" type="image/jpeg" />
          </item>
        <item>
      <title>Native or Hybrid Mobile Application, Which One Should I Choose?</title>
      <link>https://www.liip.ch/fr/blog/native-or-hybrid-mobile-application-which-one-should-i-choose</link>
      <guid>https://www.liip.ch/fr/blog/native-or-hybrid-mobile-application-which-one-should-i-choose</guid>
      <pubDate>Mon, 19 Jun 2017 00:00:00 +0200</pubDate>
      <description><![CDATA[<p>It is complex for non-geeks to understand the mobile application ecosystem. We often hear jargon such as mobile apps, hybrid apps, native apps, single-codebase-cross-platforms apps, etc.</p>
<p>Some clarification is needed.</p>
<h3><strong>The Difference Between Native and Hybrid Apps</strong></h3>
<p>In this article, we talk only about apps that one can download from an app store (and not about <a href="https://blog.liip.ch/archive/2017/05/02/do-i-need-a-mobile-application-or-a-mobile-website.html">mobile websites</a>).</p>
<p><em>Native</em> apps are mobile applications that are written in a native language such as Swift for all Apple iOS apps, and Java for all Google Android apps. You have to write the code <em> two times</em>, once for each platform, which results in more development and maintenance work.</p>
<p><em>Hybrid</em> apps are based on a <em>single codebase</em> that produces mobile apps for both Apple and Google platforms.</p>
<p>Both native and hybrid applications are on app stores. Both are downloaded on your iPhone or Android smartphones. Both can be opened. Both can send push notifications. Both can be deleted from your smartphone. No matter what's inside.</p>
<h3><strong>Native or Hybrid App, Which One Should I Build?</strong></h3>
<p>“All this is very interesting, but what should I use for my next mobile product?”, you may wonder.</p>
<p>At Liip we use the following <em>criteria</em> to guide our strategy:</p>
<p><strong>Internal Business Logic</strong> If the app contains more than 50% business logic stored on the smartphone directly (vs. business logic stored at a backend server), then it's worth investing into a hybrid solution as the mutualization of code will have a significant financial impact on the project. An example we worked on is the <a href="https://www.liip.ch/en/what/projects/schindler-spare-parts-catalogue-app">Schindler elevators mobile app</a> with its offline requirements that required to store the logic on the smartphone app.</p>
<p>In the other case, we favor native mobile apps.</p>
<p><strong>Custom Design</strong> When the app has a lot of custom visual components (e.g. not the default list views proposed by Apple or Google), then we recommend to craft a <em>native</em> app as the hybrid approach wouldn't bring any mutualized value here because you anyway have to build custom User Interface for each platform.</p>
<figure><img src="https://liip.rokka.io/www_inarticle/d0263ec55a47d67c1ca02f1878913be59d8961fe/native-or-hybrid-custom-design-example-1-1024x854.jpg" alt="On the left is a list using standard Apple iOS visual components, and on the right the example of the UEFA Champions League mobile app with a custom list view."></figure>
<p>On the left is a list using standard Apple iOS visual components, and on the right the example of the UEFA Champions League mobile app with a custom list view.</p>
<p><strong>Reliance on Third Party Plugins</strong> If your project relies on one or more third party plugins (aka SDKs), like for instance Tealium (a data management tool including Analytics monitoring), then we recommend to build a <em>native</em> app. These plugins are written in Swift and Java so you never have compatibility issues with native apps.</p>
<p>This criteria comes from an experience we had where we spent a lot of time integrating a third party plugin within a Xamarin hybrid app project.</p>
<h3><strong>It is a Weighting Game</strong></h3>
<p>As we often claim, <em>we are not religious with technologies</em> here at Liip. There is no magic formula that can be applied to all projects; we always have to ponder each criteria together with the client in order to find the best fit for his situation.</p>
<p>Do <em>you</em> have experience with one or the other kind of mobile application? Bad or good, <em>share your story</em> with us.</p>]]></description>
                  <enclosure url="http://liip.rokka.io/www_card_2/aee2c6658f1dffba2ed8fcae5e21d42bddf6ef73/native-or-hybrid-mobile-application.jpg" length="510295" type="image/jpeg" />
          </item>
        <item>
      <title>5 lessons learnt about the new SAP Cloud Platform SDK for iOS</title>
      <link>https://www.liip.ch/fr/blog/5-lessons-learnt-about-the-new-sap-cloud-platform-sdk-for-ios</link>
      <guid>https://www.liip.ch/fr/blog/5-lessons-learnt-about-the-new-sap-cloud-platform-sdk-for-ios</guid>
      <pubDate>Thu, 01 Jun 2017 00:00:00 +0200</pubDate>
      <description><![CDATA[<p>The SAP Cloud Platform SDK for iOS was <a href="https://blogs.sap.com/2017/03/30/sap-cloud-platform-sdk-for-ios-released/">released in March</a> and we were very excited to try it out. This toolkit allows companies to let developers build, extend, and run iOS apps based on SAP back-end data. Thus, business' employees can access live data at any time from their iOS mobile app, and enjoy the standard SAP Fiori design language they are used to.</p>
<p>We booked a one-day hands-on with <a href="https://twitter.com/noefroidevaux">Noé</a> in our <a href="http://thinkspace.ch/">ThinkSpace</a> war room with the objective to have a demo app up and running and plugged to the SAP Cloud Platform (formerly known as SAP Hana). This may sound like an easy goal but honestly, knowing SAP, we thought that it was already ambitious.</p>
<h3><strong>Lesson learnt #1: One can easily create a SAP Cloud Platform demo account</strong></h3>
<p>We imagined it would require many days to have our Liip's SAP Cloud Platform up and running with validation processes and all. That's old-thinking. It took Noé less than half an hour to have it ready.</p>
<p>It may be different with a production environment but still, the <em>developer experience</em> was great as one can have a playground and try to build a Minimum Viable Product (MVP) straight away.</p>
<h3><strong>Lesson learnt #2: The SAP SDK provides a skeleton app — really — ready to play with</strong></h3>
<p>When we browsed the <a href="https://www.sap.com/developer/topics/cloud-platform-sdk-for-ios.tutorials.html">tutorials on the SAP blog</a>, we're again (positively) surprised to see that the SAP team crafted a demo app that was supposedly ready-to-use. And it was!</p>
<p>In less than 3h, we installed the app, and connected it to our Liip's SAP Cloud Platform from which we could read and write data. It actually required more time to register and activate all needed modules in the SAP Cloud Platform than to actually deploy the app on Noé's iPhone!</p>
<h3><strong>Lesson learnt #3: iOS SAP SDK documentation is not centralized enough</strong></h3>
<p>One drawback SAP has to fix if they want developers to catch-up on their new tools is the documentation. Although the skeleton app works out-of-the-box, we had hard times to follow the setup steps which were spread over the main homepage, various tutorials, and other articles. For instance, there are several modules and settings to configure and we took a lot of time to figure it out. If some SAP engineers read these lines, please keep up the good work and remove the complexity from your documentation.</p>
<figure><img src="https://liip.rokka.io/www_inarticle/35036db371f7c06db6930e5c04ee9c4e025e43eb/screen-shot-2017-06-01-at-10-55-09-149x300.jpg" alt="Our SAP iOS mobile application demo"></figure>
<p>Our SAP iOS mobile application demo</p>
<h3><strong>Lesson learnt #4: “SAP Fiori for iOS” documentation is complete and well structured</strong></h3>
<p>Compared to the previous point, the User Experience and Design documentation of SAP Fiori for iOS is impressive: it is well structured, complete, and easy to get through. All usual business use-cases are covered in a deep manner with all needed details about user flows.</p>
<p>I can't help but recommend the development department at SAP to follow their path as it would help the community to engage more, and as a result their products would take off more quickly!</p>
<figure><img src="https://liip.rokka.io/www_inarticle/d3f62505f8697f0406e1e5f4a031ae04657272ff/navigation-forward-300x167.jpg" alt='"SAP Fiori for iOS" User Interface Example'></figure>
<p>SAP Fiori for iOS User Interface Example (credits: SAP website)</p>
<h3><strong>Lesson learnt #5: User Interface customization will take you more than a day</strong></h3>
<p>Once we got the app and SAP environment ready, we dived into the code in order to play with screens' layout and data flows. As one might expect, that's what the demo app is for: testing in a playground. But when we wanted to customize the design to match our Liip corporate identity, we saw the limitation of the demo app: although it's not a blocker at all, it's good to know that it will require you more than a one-day workshop to get it implemented.</p>
<h3><strong>Summary</strong></h3>
<p>Below is what we achieved in less than a day with this new iOS SAP SDK:</p>
<ul>
<li>Setup of a Liip SAP Cloud Platform demo account with sample data</li>
<li>Running an iOS demo app on our iPhone</li>
<li>Live synchronisation of data between the app and the SAP Cloud Platform</li>
<li>Dive into the “SAP Fiori for iOS” documentation</li>
</ul>
<p>Did <em>you</em> play with the SAP SDK for iOS yet? Or even better, did you already release publicly an iOS app based on SAP? I'd be glad to share on the topic around a coffee or via the comments' section below.</p>]]></description>
          </item>
        <item>
      <title>Do I Need a Mobile Application or a Mobile Website?</title>
      <link>https://www.liip.ch/fr/blog/do-i-need-a-mobile-application-or-a-mobile-website</link>
      <guid>https://www.liip.ch/fr/blog/do-i-need-a-mobile-application-or-a-mobile-website</guid>
      <pubDate>Tue, 02 May 2017 00:00:00 +0200</pubDate>
      <description><![CDATA[<p>In our digital era where people's attention is scattered between apps and websites, it's not easy to know whether you need a mobile application, or if a responsive website (that can be accessed via your web browser) would meet your needs.</p>
<p>I have this discussion every week with new clients, and I thought it was time to share our reasoning here at Liip in order to give you a clear answer if you still hesitate.</p>
<h2>Do You Want To Reach Your Users, or Bring Rich Features to Them?</h2>
<p>When clients come with a mobile app request, I explain them that most of the time, a web application is more efficient in terms of investment, as well as in term of reach.</p>
<p>The second question I get after this answer is: “When would I need a mobile app, then?”</p>
<p>In my point of view, mobile apps are useful when they are crafted to be <a href="https://youtu.be/OkeJg92PA4E?t=1424"><em>rich</em> — vs. the <em>reach</em></a> that web applications can provide. Rich in terms of features that are only available on mobile devices, and that can't be achieved via web technologies.</p>
<p>Here is a non-exhaustive list of smartphones features that could be useful to your product:</p>
<ul>
<li>Bluetooth — to <a href="https://blog.liip.ch/archive/2017/03/08/industrial-challenges.html">connect to a supply chain system</a></li>
<li>Geolocation/geofencing — to contact only the employees you need (i.e. avoid information overload), such as with the <a href="https://www.liip.ch/en/what/projects/tpf-communication-system-for-buses">TPF Houston product</a></li>
<li>Beacons for indoor localization — to guide a user based on its location context</li>
<li>Push notifications — to inform people in a timely manner like goals scored in the <a href="https://itunes.apple.com/us/app/the-official-uefa-champions-league-app/id1024506667?mt=8">UEFA Champions League app</a></li>
<li>Camera usage — to scan a barcode to identify a drug such as in our <a href="https://www.liip.ch/en/news/archive/2016/05/17/patchie--fun-therapy-app---germany-and-switzerland-join-forces-in-cystic-fibrosis-fight.html">Patchie medical project</a></li>
<li>Augmented Reality — to enhance human capabilities like the <a href="https://daqri.com/">Daqri innovative tools</a> which we investigate currently</li>
<li>Fingerprint authentication — to improve the User Experience by shortening the “painful” steps such as <a href="https://twitter.com/lukew/status/843976459605561344">entering your password</a></li>
<li>Offline capabilities — like the offline local search in our <a href="https://www.liip.ch/en/what/projects/schindler-spare-parts-catalogue-app">Schindler app</a> for elevator repairers</li>
</ul>
<h2>Loyalty vs. Visibility</h2>
<p>If you are already established on the digital market, a mobile app is a great loyalty tool to invest in, as it engages your audience more. From the comScore 2016 App Report, one can learn that users spend 20x more time on apps than mobile website visitors. A bit like if an app created a bubble of attention focus. Something that the web, by essence with its linking nature, doesn't provide to visitors.</p>
<figure><img src="https://liip.rokka.io/www_inarticle/0508c6c7e41f02484d357452d768ae18d5b44efe/screen-shot-2017-04-13-at-09-36-03-300x272.jpg" alt="Users spend 20x more time on mobile apps than on mobile websites"></figure>
<p>Users spend 20x more time on mobile apps than on mobile websites (Credit “comScore 2016 U.S. Mobile App Report”)</p>
<p>However, if you aren't known yet, a website viewable on smartphones/tablets/desktops might help you to stand out as the average monthly audience is 3x more important on websites than on mobile applications.</p>
<figure><img src="https://liip.rokka.io/www_inarticle/7135926153bc19a1e7a1ad9c2b43c9c0e8782f31/screen-shot-2017-04-13-at-09-36-32-300x274.jpg" alt="Mobile websites reach 3x more visitors than mobile apps"></figure>
<p>Mobile websites reach 3x more visitors than mobile apps (Credit “comScore 2016 U.S. Mobile App Report”)</p>
<h2>It's Not a Religious Choice</h2>
<p>The time when you needed to choose one way or the other is behind us. Both solutions have their pros and cons, depending on <em>your needs</em>. In an ideal world with unlimited budgets and no deadlines, both solutions should be implemented for different purposes.</p>
<p>If you're not in this comfortable solution, you better start with what is the most critical to your business: engage more an existing audience? Or expand your audience reach?</p>
<h2>Rich vs. Reach — The Summary</h2>
<p>If your objective is to provide a <em>rich</em> experience to your clients, using the full native features offered by the latest smartphone, then you should go for a mobile application that will allow you to retain them longer.</p>
<p>If you're in the B2B sector or have internal needs, then there are even more chances that a mobile app is a good choice for you. A choice that can leverage smartphones' native features that are often what can bring <a href="https://blog.liip.ch/archive/2017/03/08/industrial-challenges.html">more efficiency and productivity in industries</a>.</p>
<p>If the goal of your new product is to <em>reach</em> as many customers as possible, and that you don't need to access to specific smartphones capabilities, then you should go for a web application.</p>
<p>“Mobile apps <em>engage</em> an audience. Mobile web <em>expand audience reach</em>.”</p>
<p>I'm always interested to challenge assumptions when it comes to choose between a mobile application and a responsive website, so don't hesitate to share your use cases in the comments section below, or come to our office to chat around a coffee.</p>]]></description>
                  <enclosure url="http://liip.rokka.io/www_card_2/37e339ce75c693fe525a9a810b1cf03ab0ba3a6c/mobile-app-or-mobile-web.jpg" length="469589" type="image/jpeg" />
          </item>
        <item>
      <title>Using an After Effects animation in your iOS, Android or React Native app</title>
      <link>https://www.liip.ch/fr/blog/using-after-effects-app</link>
      <guid>https://www.liip.ch/fr/blog/using-after-effects-app</guid>
      <pubDate>Thu, 30 Mar 2017 00:00:00 +0200</pubDate>
      <description><![CDATA[<p><em>Animations greatly improve overall user experience! This tutorial explains how to export and use an Adobe After Effects animation in your iOS, Android or React Native project, with Bodymovin and Lottie.</em></p>
<h2>Animating your logo with After Effects</h2>
<p>The first part is creating the animation with Adobe After Effects. After Effects is a powerful tool that is used to create digital visual effects and motion graphics. Starting with After Effect is fairly easy. Animating a logo for example will take you a few hours. Read my last blog post and go for it:  <a href="https://blog.liip.ch/archive/2017/03/14/adobe-after-effects.html"><em>Adobe After Effects: how to get started?</em></a></p>
<figure><img src="https://liip.rokka.io/www_inarticle/90c8549c9589120e0c49bdbbfd2c4f5879e884a0/ezgif-com-crop-2.jpg" alt="Liip Logo Animated"></figure>
<h2></h2>
<p>This tool is mainly used in film and television production although is also popular to create UI/UX animations among designers.</p>
<p>If you need inspiration, you can see many examples of <strong>animations</strong> in the popular website <a href="http://dribbble.com">dribbble.com</a>.</p>
<figure><img src="https://liip.rokka.io/www_inarticle/913ced6c74bc273308f754ee02c87502bbf61bbe/screen-shot-2017-02-15-at-8-56-02-am-1024x663.jpg" alt="Dribbble Screenshot"></figure>
<p>In this tutorial we won't cover how to create an animation, but how to use it in your app.</p>
<p>To export and use an animation in your App, you can use  <strong>Bodymovin</strong> and <strong>Lottie. </strong> As we will see in this post, both of them have advantages and limitations. It's better to be aware of them before starting your work on your animation.</p>
<h2>Exporting the animation with Bodymovin</h2>
<p>Once we have the animation created the next step is to export it with <a href="https://github.com/bodymovin/bodymovin">Bodymovin</a>.</p>
<p>Bodymovin is an After Effects plugin for exporting animations into a JSON file. Bodymovin is an open-source project. We can follow the current state of its <a href="https://github.com/bodymovin/bodymovin/issues">development</a>.</p>
<p>There are different ways to install Bodymovin plugin. The easiest/recommended way is to <a href="https://github.com/bodymovin/bodymovin/archive/master.zip">download the zip</a> file from the github repository, then extract the contents and get the .zxp file from ‘/build/extension', and finally use the <a href="http://aescripts.com/learn/zxp-installer/">ZXP installer</a> to install it in After Effects.</p>
<p>After this, the process to export the animation is simple and straightforward. Follow these steps:</p>
<p>1.- Open your After Effects project and select the Bodymovin extension on <strong>Window</strong> &gt; <strong>Extensions</strong> &gt; <strong>Bodymovin</strong> .</p>
<figure><img src="https://liip.rokka.io/www_inarticle/5362930739c89c19a35590f9396abe5bd4fd8a07/screen-shot-2017-02-14-at-3-18-54-pm-1024x705.jpg" alt=""></figure>
<p>2.- Click <strong>refresh</strong> to get a list of all your project compositions, then select the composition you want to export.</p>
<figure><img src="https://liip.rokka.io/www_inarticle/2609f06c62a3765e352ca610e6a2381ae4176d64/screen-shot-2017-02-14-at-3-21-13-pm-e1487155862630.jpg" alt="Bodymovin screenshot"></figure>
<p>3.- Select the <strong>destination folder</strong> for each of the compositions you want to export and save the JSON file.</p>
<figure><img src="https://liip.rokka.io/www_inarticle/17868322eb0c341a50ff5d7fe450e3193a266581/screen-shot-2017-02-14-at-3-32-43-pm.jpg" alt="Bodymovin screenshot"></figure>
<p>4.- And finally click <strong>render</strong> .</p>
<figure><img src="https://liip.rokka.io/www_inarticle/55de2c4328b1e4f32a2729f58f4aca887ab0e749/screen-shot-2017-02-14-at-3-21-13-pm-e1487155892294.jpg" alt="Bodymovin screenshot"></figure>
<p>5.- <strong>Hooray!</strong> Animation is exported into a JSON file so we can move to the final part of our tutorial.</p>
<figure><img src="https://liip.rokka.io/www_inarticle/a3d087055cf45629f887a57f60d2192d4e95f210/screen-shot-2017-02-14-at-3-22-19-pm-e1487155921297.jpg" alt="Bodymovin screenshot"></figure>
<h2>Using Lottie to import the animation in your project</h2>
<p>Once the animation is created and exported into a JSON file it's time to import and render it into to your App project. Thanks to AirBnB now we can do this with <strong>Lottie</strong> .</p>
<p><a href="http://airbnb.design/lottie/">Lottie</a> is a new open source library coming from the <a href="http://airbnb.io/projects/">AirBnB</a> Engineering department which helps you to add high-quality <strong>animations</strong> to your native app.</p>
<p>The basic idea of Lottie is that renders an After Effect animation in real time, allowing you to use animations as easy as adding a new view/layer to your <a href="http://github.com/airbnb/lottie-ios">iOS</a>, <a href="http://github.com/airbnb/lottie-android">Android</a> or <a href="http://github.com/airbnb/lottie-react-native">React Native</a> App.</p>
<p>Continuing with our example, at this step we are going to import the <strong>data.json</strong> file that we have exported from the previous step into the iOS project.</p>
<figure><img src="https://liip.rokka.io/www_inarticle/49f0751d83d6fcce3a4a557fa248d8f1f765e28c/screen-shot-2017-02-15-at-10-35-23-am-1024x677.jpg" alt="Xcode screenshot"></figure>
<p>The next step is to add the Lottie Library to your project.</p>
<h3>Including Lottie in your iOS project</h3>
<p>This can be done easily using CocoaPods since the project is CocoaPods compatible.</p>
<pre><code>pod 'lottie-ios'</code></pre>
<p>Then import the framework in your class.</p>
<pre><code>import lottie</code></pre>
<p>Once the framework is imported, it's time to add the LOTAnimationView to your view.</p>
<pre><code>let animationView = LOTAnimationView.animationNamed("data")

self.view.addSubview(animationView!)</code></pre>
<p>And finally play the animation.</p>
<pre><code>animationView?.play(completion: { (finished) in

 // Do Something

})</code></pre>
<h3>Including Lottie in your Android project</h3>
<p>To include it in your Android project start by adding the dependency in your build.gradle file.</p>
<pre><code>dependencies {  
  compile 'com.airbnb.android:lottie:1.0.3'
}</code></pre>
<p>After downloading the library, it's time to add the view your your project and play the animation.</p>
<pre><code>LottieAnimationView animationView = (LottieAnimationView) findViewById(R.id.animation_view);
 ...
 LottieComposition composition = LottieComposition.fromJson(getResources(), jsonObject, (composition) -&gt; {
     animationView.setComposition(composition);
     animationView.playAnimation();
 });</code></pre>
<h3>Including Lottie in your React Native project</h3>
<p>To get started install the node module in your project.</p>
<pre><code>npm i --save lottie-react-native</code></pre>
<p>For iOS, add the pod your Podfile.</p>
<pre><code>pod 'lottie-react-native', :path =&gt; '../node_modules/lottie-react-native'</code></pre>
<p>For android, you can react-native link as well.</p>
<pre><code>react-native link lottie-react-native</code></pre>
<p>Example of how to use it in your code.</p>
<pre><code>import React from'react';
import Animation from'lottie-react-native';

export defaultclassBasicExampleextendsReact.Component {
  componentDidMount() {
    this.animation.play();
  }

  render() {
    return (
      &lt;Animationref={animation=&gt; { this.animation = animation; }}style={{width:200,height:200,        }}source = {require('../path/to/animation.json')}
      /&gt;
    );
  }
}</code></pre>
<h2>Why Lottie?</h2>
<p>The main advantage of using Lottie is that animating CALayers (iOS) to generate complex animations is a tedious and very complicated job, instead it's more user friendly to create the animation using After Effects.</p>
<h2>Current Limitations with Lottie</h2>
<p>At the current time of writing this post, there are some important limitations when using After Effects+Bodymovin+Lottie combination.</p>
<p>One of the most important limitations are that there is no support for animating <strong>text layers</strong> as well as animating <strong>image layers</strong> using Lottie.</p>
<p>Because Lottie library is an open source project we can see for each platform the current development status and the list of feature requests for <a href="https://github.com/airbnb/lottie-ios/issues">iOS</a>, <a href="https://github.com/airbnb/lottie-android/issues">Android</a> or <a href="https://github.com/airbnb/lottie-react-native/issues">React Native</a>.</p>
<h2>Conclusion</h2>
<p>Creating a visually complex animation with After Effects takes time but it takes even more time to code it in a native app. From my point of view there is no need for small and simple animation to use the After Effects+Bodymovin+Lottie combination. On the other hand I do recommend using this animation stack for more complex animations.</p>
<p>Furthermore, before designing an animation with After Effects is very important for the designer to be aware of the current limitations of Bodymovin and Lottie at the time of designing it so there are not any visual differences of the final result.</p>
<p>Manuel Escrig <a href="https://www.twitter.com/@manuelescrig">@manuelescrig</a></p>]]></description>
                  <enclosure url="http://liip.rokka.io/www_card_2/5a53eb6ac52d18f0c2b8b589b047bb35786e2bc6/data-json-copie.jpg" length="1244691" type="image/png" />
          </item>
    
  </channel>
</rss>
