{"id":4005,"date":"2022-01-04T19:17:41","date_gmt":"2022-01-04T19:17:41","guid":{"rendered":"https:\/\/ionicframework.com\/blog\/?p=4005"},"modified":"2022-01-05T18:23:48","modified_gmt":"2022-01-05T18:23:48","slug":"building-the-eas-2021-conference-app","status":"publish","type":"post","link":"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app","title":{"rendered":"Building the EAS 2021 Conference App"},"content":{"rendered":"<p>The second annual Enterprise App Summit was a roaring success! Thanks to all our speakers and sponsors from the Ionic community who attended.<\/p>\n<p>For this year\u2019s summit, we developed a cross-platform conference application for attendees which included information about each speaker, an event schedule with a description of each session, and even a swag giveaway for registered attendees!<\/p>\n<p>Built with Ionic technology including Live Updates, Capacitor 3, and Ionic\u2019s own UI framework Ionic 6, this app is designed to be updated quickly to bring the latest information to event participants, and provide a seamless experience across any device.<\/p>\n<p>Although the conference is over, this app serves as a reference for any developer looking to build a conference app for their events using Ionic technology.<\/p>\n<p>Download the app on your device to check it out:<\/p>\n<ul>\n<li>iOS: <a href=\"https:\/\/ionic.link\/eas21-ios\">App Store<\/a><\/li>\n<li>Android: <a href=\"https:\/\/ionic.link\/eas21-android\">Google Play<\/a><\/li>\n<li>Web (hosted on Vercel): <a href=\"https:\/\/eas21.ionic.io\">https:\/\/eas21.ionic.io<\/a> <\/li>\n<li>OSS Code: <a href=\"https:\/\/github.com\/ionic-team\/eas-2021\">https:\/\/github.com\/ionic-team\/eas-2021<\/a><\/li>\n<\/ul>\n<p>Or, you can watch this short fireside chat where I discuss the app&#8217;s highlights:<\/p>\n<p><iframe loading=\"lazy\" width=\"560\" height=\"315\" data-src=\"https:\/\/www.youtube.com\/embed\/ZcnM_PVRzvI\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" class=\"lazyload\" data-load-mode=\"1\"><\/iframe><\/p>\n<p>Read on to get a behind-the-scenes look into how we designed, built, and shipped the app.<\/p>\n<p><!--more--><\/p>\n<p><a href=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-app-store.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"509\" data-src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-app-store-1024x509.jpg\" alt=\"\" class=\"aligncenter size-large wp-image-4009 lazyload\" data-srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-app-store-1024x509.jpg 1024w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-app-store-300x149.jpg 300w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-app-store-768x382.jpg 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-app-store-1536x764.jpg 1536w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-app-store.jpg 2014w\" data-sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/509;\" \/><noscript><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"509\" src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-app-store-1024x509.jpg\" alt=\"\" class=\"aligncenter size-large wp-image-4009\" srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-app-store-1024x509.jpg 1024w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-app-store-300x149.jpg 300w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-app-store-768x382.jpg 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-app-store-1536x764.jpg 1536w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-app-store.jpg 2014w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/noscript><\/a><\/p>\n<h2>Meet the Team Behind the App<\/h2>\n<p>The EAS 2021 app was built by a team of three members of the Ionic team. They worked closely with the larger EAS conference planning team to get the content updated and deployed. <a href=\"https:\/\/twitter.com\/benjsperry\">Ben Sperry<\/a>, Ionic co-founder and chief design officer, designed the app. <a href=\"https:\/\/twitter.com\/LiamDeBeasi\">Liam DeBeasi<\/a>, Ionic Framework engineer, designed and developed the front-end. <a href=\"https:\/\/twitter.com\/dotNetkow\">Matt Netkow<\/a>, head of product marketing and developer advocate developed the native components and built the CI\/CD processes.<\/p>\n<p>We all have multiple projects to juggle at any given moment, so building this app couldn&#8217;t be a full-time effort and needed to be done asynchronously. That said, creating awesome cross-platform apps is kinda our thing, so we weren\u2019t too worried.<\/p>\n<h2>The Development Process<\/h2>\n<p>We agreed on a simple process. Ben created a conference app design in Figma that we could all reference when building the app.<\/p>\n<p><a href=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-figma.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"448\" data-src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-figma-1024x448.jpg\" alt=\"\" class=\"aligncenter size-large wp-image-4006 lazyload\" data-srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-figma-1024x448.jpg 1024w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-figma-300x131.jpg 300w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-figma-768x336.jpg 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-figma-1536x672.jpg 1536w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-figma.jpg 1640w\" data-sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/448;\" \/><noscript><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"448\" src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-figma-1024x448.jpg\" alt=\"\" class=\"aligncenter size-large wp-image-4006\" srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-figma-1024x448.jpg 1024w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-figma-300x131.jpg 300w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-figma-768x336.jpg 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-figma-1536x672.jpg 1536w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-figma.jpg 1640w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/noscript><\/a><\/p>\n<p>I really enjoy Figma since it\u2019s easy for a developer to download image assets right from the tool. You can clearly see the CSS, color values (#1B4DFF for EAS blue), dimensions, and other properties. Figma also allows you to leave a comment on any part of the design which helps communicate questions or concerns throughout the process.<\/p>\n<p>After Ben drafted the design, Liam and I began building the app. Liam wrote a majority of the app including creating each page and adding design details, and I worked on native features like push and local notifications, storage, and app management tasks like CI\/CD and app store releases.<\/p>\n<h2>App Architecture<\/h2>\n<p><strong>UI: <a href=\"https:\/\/ionicframework.com\">Ionic 6<\/a> and <a href=\"https:\/\/angular.io\">Angular 13<\/a> <\/strong><br \/>\nIonic 6 was in release candidate (RC) status at the time. We thought it would be great to take it for a spin. Ionic apps work well with any web framework, so we decided on Angular.<\/p>\n<p><strong>Native runtime: <a href=\"https:\/\/capacitorjs.com\">Capacitor 3<\/a> <\/strong><br \/>\nSince we planned on building a web app before deploying it to mobile, we needed a powerful runtime tool that produces native Android and iOS projects. In addition to tooling, Capacitor offers core plugin APIs (camera, geolocation, haptics) that run on the web, Android, and iOS.<\/p>\n<p><strong>Native features powered by Capacitor<\/strong><br \/>\nWe wanted to take advantage of mobile device features since we were building a mobile app. We implemented <a href=\"https:\/\/capacitorjs.com\/docs\/apis\/push-notifications\">push notifications<\/a> powered by Firebase to send messages to attendees throughout the event and <a href=\"https:\/\/capacitorjs.com\/docs\/apis\/local-notifications\">local notifications<\/a> to set reminders five minutes before talks began. Finally, the <a href=\"https:\/\/capacitorjs.com\/docs\/apis\/storage\">storage plugin<\/a> was used to save the user&#8217;s response to the push notifications permissions prompt (following good UX, we only want to ask the user once if we can send push notifications to them).<\/p>\n<p>Though we didn\u2019t use the push notifications feature during the event, we wanted to be sure it was built to use for future events.<\/p>\n<p><strong>App data: JSON <\/strong><br \/>\nAll conference data such as speaker bios, agenda items, and more and images were stored within the app. For the next iteration, we might use a content management system (CMS) to handle the content, but this approach not only made development faster, it automatically gave us offline support since nothing had to be loaded over the network. When updates were required, we managed the data remotely through Appflow&#8217;s Live Updates feature.<\/p>\n<p><strong>CI\/CD powered by Appflow and Vercel <\/strong><br \/>\nEven with a small team, it\u2019s important to set up a continuous integration\/delivery pipeline. We\u2019re big fans of Vercel at Ionic, so we hosted the web app version with their platform. Each push to the <code>main<\/code> branch triggered a production Angular build deployed to <a href=\"https:\/\/eas21.ionic.io\">https:\/\/eas21.ionic.io<\/a>. Appflow, Ionic\u2019s mobile CI\/CD service, was used to build the Android and iOS versions then deploy those binaries to the app stores.<\/p>\n<h2>App Features<\/h2>\n<p>We added a lot of features to the app to give attendees the information they needed when they needed it. To build in this functionality, we relied on a few different technologies to get the job done.<\/p>\n<h3>Native Mobile Design Powered by Ionic 6<\/h3>\n<p>The app\u2019s UI is powered by Ionic 6, the latest version of our 100+ UI component toolkit.  With Ionic\u2019s adaptive styling feature, apps look and feel native to the user as all UI components automatically switch to the design based on the device platform (Cupertino on iOS and Material Design on Android).<\/p>\n<p>Some specific UI flourishes that Ionic 6 includes are the bottom sheet component, new modal styles (especially in dark mode), and header and footer fading effects.<\/p>\n<p>There\u2019s also everyone\u2019s favorite feature: dark mode support! In this app, we use the <code>prefers-color-scheme<\/code> CSS media query which hooks into the system setting of the user&#8217;s device and applies the specified dark theme colors when dark mode is enabled:<\/p>\n<pre><code class=\"language-css\">\/* variables.scss *\/\n@media (prefers-color-scheme: dark) {\n  body {\n    --ion-color-dark: #f4f5f8;\n    --ion-color-dark-rgb: 244,245,248;\n    --ion-color-dark-contrast: #000000;\n    --ion-color-dark-contrast-rgb: 0,0,0;\n    --ion-color-dark-shade: #d7d8da;\n    --ion-color-dark-tint: #f5f6f9;\n\n   \/* snip - other colors *\/\n}\n<\/code><\/pre>\n<figure><figcaption>Dark Mode<\/figcaption><video controls autoplay muted loop style=\"width:65%;\"><source \nsrc=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-dark-mode.mov\"\n      type=\"video\/mp4\"\n    \/><\/video><\/p>\n<\/figure>\n<h3>Push Notifications Powered by Capacitor and Firebase<\/h3>\n<p>Since the conference featured live online talks, we wanted a way to remind attendees that the conference and various talks were about to start and allow users to enable timed reminders that trigger a few minutes before their favorite talk began.<\/p>\n<p>To send remote notifications to users, we used Capacitor\u2019s <a href=\"https:\/\/capacitorjs.com\/docs\/apis\/push-notifications\">Push Notifications plugin<\/a> coupled with Firebase\u2019s cloud messaging functionality. While push notifications can be complex to implement, Capacitor makes it easy with a <a href=\"https:\/\/capacitorjs.com\/docs\/guides\/push-notifications-firebase\">step-by-step configuration guide<\/a> that outlines how to configure the native projects. Then, it\u2019s just a matter of adding different listener methods that fire when registration is successful, a notification is received, or similar events occur:<\/p>\n<pre><code class=\"language-typescript\">\/\/ push-notification.service.ts\nexport class PushNotificationService  {\n  async promptPushRegistration() {\n    \/\/ Request permission to use push notifications\n    \/\/ iOS will prompt user and return if they granted permission or not\n    \/\/ Android will just grant without prompting\n    PushNotifications.requestPermissions().then(result =&gt; {\n      if (result.receive === &#039;granted&#039;) {\n        \/\/ Register with Apple \/ Google to receive push via APNS\/FCM\n        PushNotifications.register();\n      } else {\n        \/\/ Show some error\n        console.log(&quot;error: &quot; + result.receive);\n      }\n    });\n\n    \/\/ Triggers when device is registered with Firebase\n    \/\/ once this happens, device can receive push notifications\n    PushNotifications.addListener(&#039;registration&#039;, (token: Token) =&gt; {\n      console.log(&quot;push registration success&quot;);\n    });\n\n    PushNotifications.addListener(&#039;registrationError&#039;, (error: any) =&gt; {\n      console.log(&#039;Error on registration: &#039; + JSON.stringify(error));\n    });\n\n    \/\/ Device has received a push notification\n    PushNotifications.addListener(\n      &#039;pushNotificationReceived&#039;,\n      (notification: PushNotificationSchema) =&gt; {\n        console.log(&#039;Push received: &#039; + JSON.stringify(notification));\n      },\n    );\n  }\n}\n<\/code><\/pre>\n<p>On iOS, when prompting the user for permission, the default \u201c\u2018EAS 21\u2019 would like to send you notifications\u201d message is used. Unlike other permission prompts, there is no way to customize this. Before requesting permission, the best practice is to first explain the value the user receives by accepting the permission request.<\/p>\n<p>We decided on: &#8220;Get reminders when the event is about to start, talk recordings have been published, and more!&#8221;<\/p>\n<p>To display this message, we decided to use the new Ionic 6 sheet modal aka \u201cbottom sheet.\u201d Built into the existing <code>ion-modal<\/code> component, this popular effect is used to display a modal that doesn\u2019t take up the entire screen. Often, as we did here, it overlays on top of one fourth to one half of the screen:<\/p>\n<p><a href=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-pushModal.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"473\" height=\"1024\" data-src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-pushModal-473x1024.jpg\" alt=\"\" class=\"aligncenter size-large wp-image-4011 lazyload\" data-srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-pushModal-473x1024.jpg 473w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-pushModal-139x300.jpg 139w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-pushModal-768x1663.jpg 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-pushModal-709x1536.jpg 709w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-pushModal-946x2048.jpg 946w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-pushModal.jpg 1125w\" data-sizes=\"auto, (max-width: 473px) 100vw, 473px\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" style=\"--smush-placeholder-width: 473px; --smush-placeholder-aspect-ratio: 473\/1024;\" \/><noscript><img loading=\"lazy\" decoding=\"async\" width=\"473\" height=\"1024\" src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-pushModal-473x1024.jpg\" alt=\"\" class=\"aligncenter size-large wp-image-4011\" srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-pushModal-473x1024.jpg 473w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-pushModal-139x300.jpg 139w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-pushModal-768x1663.jpg 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-pushModal-709x1536.jpg 709w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-pushModal-946x2048.jpg 946w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-pushModal.jpg 1125w\" sizes=\"auto, (max-width: 473px) 100vw, 473px\" \/><\/noscript><\/a><\/p>\n<p>The <code>initialBreakpoint<\/code> and <code>breakpoints<\/code> are key. The breakpoints property accepts an array which states each breakpoint that the sheet can snap to when swiped. A breakpoints property of [0, 0.5, 1] would indicate that the sheet can be swiped to show 0% of the modal, 50% of the modal, and 100% of the modal. When the modal is swiped to 0%, the modal will be automatically dismissed. The initialBreakpoint property is required so that the sheet modal knows which breakpoint to start at when presenting.<\/p>\n<pre><code class=\"language-typescript\">const modal = await this.modalController.create({\n  component: PermissionsModalComponent,\n  initialBreakpoint: 1,\n  breakpoints: [0, 1],\n  cssClass: &#039;permissions-modal&#039;\n});\n\nreturn await modal.present();\n<\/code><\/pre>\n<p>Here\u2019s the sheet modal and push notification prompt on iOS in action:<\/p>\n<figure><figcaption>Ionic 6 Bottom Sheet Prompt<\/figcaption><video controls autoplay muted loop style=\"width:65%;\"><source \nsrc=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-modal.mov\"\n      type=\"video\/mp4\"\n    \/><\/video><\/p>\n<\/figure>\n<h3>Local Notifications Powered by Capacitor<\/h3>\n<p>While push notifications are sent from a server (Firebase in this case), local notifications are stored on the device and do not need an internet connection. In the EAS app, users can set reminders for the talks they are interested in that trigger five minutes before the talk begins.<\/p>\n<p>When the user taps the &#8220;Remind Me&#8221; button on an agenda item page, the reminder is registered with the mobile OS internal clock then a toast message (using the <code>ion-toast<\/code> component) is displayed, confirming that the reminder has been set:<\/p>\n<pre><code class=\"language-typescript\">async setReminder(agendaItem: AgendaItem) {\n  await this.talkReminderService.scheduleReminder(agendaItem);\n\n  \/\/ set reminder for 5 minutes before!\n  const toast = await this.toastController.create({\n    message: &quot;Reminder set for 5 minutes before the talk begins&quot;,\n    duration: 2000,\n    color: &quot;primary&quot;\n  });\n\n  await toast.present();\n}\n<\/code><\/pre>\n<figure><figcaption>Local Notification Reminder<\/figcaption><video controls autoplay muted loop style=\"width:65%;\"><source \nsrc=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-Reminder.mov\"\n      type=\"video\/mp4\"\n    \/><\/video><\/p>\n<\/figure>\n<p>The <code>scheduleReminder<\/code> function uses the user-selected talk\u2019s scheduled start time to create a JavaScript <code>Date<\/code> object that is set five minutes in the past. That date is fed into the local notification\u2019s <code>schedule<\/code> property:<\/p>\n<pre><code class=\"language-typescript\">\/\/ talk-reminder.service.ts\n\/\/ Set reminder 5 minutes before the talk begins\nasync scheduleReminder(agendaItem: AgendaItem) {\n  \/\/ Format examples: 09:00 AM, 12:00 PM, 14:30 PM\n  const timeSlice = agendaItem.startTime.substring(0, 5);\n  const reminderDate = new Date(`December 8, 2021 ${timeSlice}:00`);\n  reminderDate.setMinutes(reminderDate.getMinutes() - 5);\n\n  \/\/ Schedule reminder\n  await LocalNotifications.schedule({\n    notifications: [\n      {\n        id: 1,\n        title: &quot;Talk starting soon!&quot;,\n        body: agendaItem.title,\n        schedule: { at: reminderDate },\n        extra: {\n          agendaId: agendaItem.id\n        }\n      }\n    ]\n  });\n}\n<\/code><\/pre>\n<p>That\u2019s all it takes to set up local notifications. As a bonus, we add a listener that fires when the user taps on the notification. The app is opened, then the user is taken directly to the talk\u2019s agenda page using the Angular router:<\/p>\n<pre><code class=\"language-typescript\"> \/\/ Navigate the user to the talk they wanted to be reminded about\n async configure() {\n   LocalNotifications.addListener(&quot;localNotificationActionPerformed&quot;, (notification =&gt; {\n     this.ngZone.run(() =&gt; {\n       this.router.navigate([`agenda\/${notification.notification.extra.agendaId}`]);\n     });\n   }));\n}\n<\/code><\/pre>\n<h3>Shipping the App with Appflow<\/h3>\n<p>Building and shipping a mobile app to the app stores involves much more than writing code. Tasks like app certificate generation and management, building native binaries, and managing app store releases can take significant time. Managing iOS and Android builds can be especially tedious, so we set up CI\/CD processes with <a href=\"https:\/\/ionic.io\/blog\/appflow\">Appflow<\/a>, Ionic\u2019s mobile CI\/CD service. With Appflow, we could automate the Android and iOS builds of EAS 2021 then deploy the binaries to the app stores.<\/p>\n<p>After a one-time configuration that includes uploading security certificates, Appflow makes it simple to build native apps. Make a code commit to your repository, choose the target platform and type of build (development, ad-hoc, production, etc.) then check a box if you want the binary to be uploaded to the app store.<\/p>\n<p><a href=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-ios-build.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"769\" height=\"1024\" data-src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-ios-build-769x1024.jpg\" alt=\"\" class=\"aligncenter size-large wp-image-4015 lazyload\" data-srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-ios-build-769x1024.jpg 769w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-ios-build-225x300.jpg 225w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-ios-build-768x1022.jpg 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-ios-build.jpg 852w\" data-sizes=\"auto, (max-width: 769px) 100vw, 769px\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" style=\"--smush-placeholder-width: 769px; --smush-placeholder-aspect-ratio: 769\/1024;\" \/><noscript><img loading=\"lazy\" decoding=\"async\" width=\"769\" height=\"1024\" src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-ios-build-769x1024.jpg\" alt=\"\" class=\"aligncenter size-large wp-image-4015\" srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-ios-build-769x1024.jpg 769w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-ios-build-225x300.jpg 225w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-ios-build-768x1022.jpg 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-ios-build.jpg 852w\" sizes=\"auto, (max-width: 769px) 100vw, 769px\" \/><\/noscript><\/a><\/p>\n<p>This saved us a bunch of time, gave our team one centralized place to manage the build\/release process, and ensured we always knew the app\u2019s latest development progress.<\/p>\n<h3>Live Updates Powered by Appflow<\/h3>\n<p>The Enterprise App Summit featured talks from tech leaders across various industries who use Ionic to build mission-critical apps. As it goes with a conference like this, the schedule changed often: new speakers were added and a talk or two was shifted to a different time to accommodate availability changes.<\/p>\n<p>In order to keep the app up to date with the latest information, we used Appflow\u2019s Live Updates functionality. With Live Updates, you can deploy updates instantly to users without a new app store release, seamlessly in the background. Updates can include HTML, CSS, JavaScript, images, and other files (just not native code, which does require a new app store submission).<\/p>\n<p>New speaker headshot to add? Talk title changed? Bug identified in testing? No problem. After making a new code commit to any repository branch, you log into Appflow and create a new web build. Once the build is complete, app users receive the update in the background and the app is refreshed with the latest version automatically.<\/p>\n<p><a href=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/appflow-liveupdates.png\"><img loading=\"lazy\" decoding=\"async\" width=\"568\" height=\"1024\" data-src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/appflow-liveupdates-568x1024.png\" alt=\"\" class=\"aligncenter size-large wp-image-4014 lazyload\" data-srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/appflow-liveupdates-568x1024.png 568w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/appflow-liveupdates-166x300.png 166w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/appflow-liveupdates-768x1384.png 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/appflow-liveupdates-852x1536.png 852w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/appflow-liveupdates.png 970w\" data-sizes=\"auto, (max-width: 568px) 100vw, 568px\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" style=\"--smush-placeholder-width: 568px; --smush-placeholder-aspect-ratio: 568\/1024;\" \/><noscript><img loading=\"lazy\" decoding=\"async\" width=\"568\" height=\"1024\" src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/appflow-liveupdates-568x1024.png\" alt=\"\" class=\"aligncenter size-large wp-image-4014\" srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/appflow-liveupdates-568x1024.png 568w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/appflow-liveupdates-166x300.png 166w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/appflow-liveupdates-768x1384.png 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/appflow-liveupdates-852x1536.png 852w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/appflow-liveupdates.png 970w\" sizes=\"auto, (max-width: 568px) 100vw, 568px\" \/><\/noscript><\/a><\/p>\n<h2>Final Thoughts<\/h2>\n<p>I had a blast working with Ben, Liam, and the EAS planning team to build the EAS 2021 app. If I had to pick my favorite app feature, it would definitely be its overall performance and incredibly fast startup time. As you can see, you barely have any time to view the splash screen:<\/p>\n<figure><figcaption>Ionic App Launch Time<\/figcaption><video controls autoplay muted loop style=\"width:65%;\"><source \nsrc=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easApp-startup-time.mov\"\n      type=\"video\/mp4\"\n    \/><\/video><\/p>\n<\/figure>\n<p>Web Native apps have come a long way in recent years and so it\u2019s an exciting time to be a web developer building for all platforms. <a href=\"https:\/\/ionicframework.com\/blog\/announcing-ionic-6\/\">Ionic 6 is available now.<\/a> Download it today and start building your own slick cross-platform apps!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The second annual Enterprise App Summit was a roaring success! Thanks to all our speakers and sponsors from the Ionic community who attended. For this year\u2019s summit, we developed a cross-platform conference application for attendees which included information about each speaker, an event schedule with a description of each session, and even a swag giveaway [&hellip;]<\/p>\n","protected":false},"author":62,"featured_media":4025,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"publish_to_discourse":"1","publish_post_category":"23","wpdc_auto_publish_overridden":"","wpdc_topic_tags":"","wpdc_pin_topic":"","wpdc_pin_until":"","discourse_post_id":"539913","discourse_permalink":"https:\/\/forum.ionicframework.com\/t\/building-the-eas-2021-conference-app\/219127","wpdc_publishing_response":"","wpdc_publishing_error":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[121],"tags":[151,3],"class_list":["post-4005","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-engineering","tag-capacitor","tag-ionic"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v23.0 (Yoast SEO v23.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Building the EAS 2021 Conference App - Ionic Blog<\/title>\n<meta name=\"description\" content=\"A behind-the-scenes look into how we designed, built, and shipped the Enterprise App Summit 2021 app using Ionic, Capacitor, and Appflow.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building the EAS 2021 Conference App\" \/>\n<meta property=\"og:description\" content=\"A behind-the-scenes look into how we designed, built, and shipped the Enterprise App Summit 2021 app using Ionic, Capacitor, and Appflow.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app\" \/>\n<meta property=\"og:site_name\" content=\"Ionic Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-01-04T19:17:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-01-05T18:23:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-feature-image.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1600\" \/>\n\t<meta property=\"og:image:height\" content=\"880\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Matt Netkow\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@dotNetkow\" \/>\n<meta name=\"twitter:site\" content=\"@ionicframework\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Matt Netkow\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app#article\",\"isPartOf\":{\"@id\":\"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app\"},\"author\":{\"name\":\"Matt Netkow\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/93c8b2fe110f183510c6285b0de40790\"},\"headline\":\"Building the EAS 2021 Conference App\",\"datePublished\":\"2022-01-04T19:17:41+00:00\",\"dateModified\":\"2022-01-05T18:23:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app\"},\"wordCount\":1921,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/ionic.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-feature-image.png\",\"keywords\":[\"Capacitor\",\"Ionic\"],\"articleSection\":[\"Engineering\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app\",\"url\":\"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app\",\"name\":\"Building the EAS 2021 Conference App - Ionic Blog\",\"isPartOf\":{\"@id\":\"https:\/\/ionic.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app#primaryimage\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-feature-image.png\",\"datePublished\":\"2022-01-04T19:17:41+00:00\",\"dateModified\":\"2022-01-05T18:23:48+00:00\",\"description\":\"A behind-the-scenes look into how we designed, built, and shipped the Enterprise App Summit 2021 app using Ionic, Capacitor, and Appflow.\",\"breadcrumb\":{\"@id\":\"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app#primaryimage\",\"url\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-feature-image.png\",\"contentUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-feature-image.png\",\"width\":1600,\"height\":880},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/ionic.io\/blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building the EAS 2021 Conference App\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/ionic.io\/blog\/#website\",\"url\":\"https:\/\/ionic.io\/blog\/\",\"name\":\"ionic.io\/blog\",\"description\":\"Build amazing native and progressive web apps with the web\",\"publisher\":{\"@id\":\"https:\/\/ionic.io\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/ionic.io\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/ionic.io\/blog\/#organization\",\"name\":\"Ionic\",\"url\":\"https:\/\/ionic.io\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png\",\"contentUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png\",\"width\":1920,\"height\":854,\"caption\":\"Ionic\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/ionicframework\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/93c8b2fe110f183510c6285b0de40790\",\"name\":\"Matt Netkow\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2018\/07\/mattnetkow-150x150.jpg\",\"contentUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2018\/07\/mattnetkow-150x150.jpg\",\"caption\":\"Matt Netkow\"},\"sameAs\":[\"https:\/\/x.com\/dotNetkow\"],\"url\":\"https:\/\/ionic.io\/blog\/author\/mattnetkow\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Building the EAS 2021 Conference App - Ionic Blog","description":"A behind-the-scenes look into how we designed, built, and shipped the Enterprise App Summit 2021 app using Ionic, Capacitor, and Appflow.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app","og_locale":"en_US","og_type":"article","og_title":"Building the EAS 2021 Conference App","og_description":"A behind-the-scenes look into how we designed, built, and shipped the Enterprise App Summit 2021 app using Ionic, Capacitor, and Appflow.","og_url":"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app","og_site_name":"Ionic Blog","article_published_time":"2022-01-04T19:17:41+00:00","article_modified_time":"2022-01-05T18:23:48+00:00","og_image":[{"width":1600,"height":880,"url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-feature-image.png","type":"image\/png"}],"author":"Matt Netkow","twitter_card":"summary_large_image","twitter_creator":"@dotNetkow","twitter_site":"@ionicframework","twitter_misc":{"Written by":"Matt Netkow","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app#article","isPartOf":{"@id":"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app"},"author":{"name":"Matt Netkow","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/93c8b2fe110f183510c6285b0de40790"},"headline":"Building the EAS 2021 Conference App","datePublished":"2022-01-04T19:17:41+00:00","dateModified":"2022-01-05T18:23:48+00:00","mainEntityOfPage":{"@id":"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app"},"wordCount":1921,"commentCount":0,"publisher":{"@id":"https:\/\/ionic.io\/blog\/#organization"},"image":{"@id":"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app#primaryimage"},"thumbnailUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-feature-image.png","keywords":["Capacitor","Ionic"],"articleSection":["Engineering"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app#respond"]}]},{"@type":"WebPage","@id":"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app","url":"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app","name":"Building the EAS 2021 Conference App - Ionic Blog","isPartOf":{"@id":"https:\/\/ionic.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app#primaryimage"},"image":{"@id":"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app#primaryimage"},"thumbnailUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-feature-image.png","datePublished":"2022-01-04T19:17:41+00:00","dateModified":"2022-01-05T18:23:48+00:00","description":"A behind-the-scenes look into how we designed, built, and shipped the Enterprise App Summit 2021 app using Ionic, Capacitor, and Appflow.","breadcrumb":{"@id":"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app#primaryimage","url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-feature-image.png","contentUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-feature-image.png","width":1600,"height":880},{"@type":"BreadcrumbList","@id":"https:\/\/ionic.io\/blog\/building-the-eas-2021-conference-app#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ionic.io\/blog"},{"@type":"ListItem","position":2,"name":"Building the EAS 2021 Conference App"}]},{"@type":"WebSite","@id":"https:\/\/ionic.io\/blog\/#website","url":"https:\/\/ionic.io\/blog\/","name":"ionic.io\/blog","description":"Build amazing native and progressive web apps with the web","publisher":{"@id":"https:\/\/ionic.io\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ionic.io\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/ionic.io\/blog\/#organization","name":"Ionic","url":"https:\/\/ionic.io\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png","contentUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png","width":1920,"height":854,"caption":"Ionic"},"image":{"@id":"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/ionicframework"]},{"@type":"Person","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/93c8b2fe110f183510c6285b0de40790","name":"Matt Netkow","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/image\/","url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2018\/07\/mattnetkow-150x150.jpg","contentUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2018\/07\/mattnetkow-150x150.jpg","caption":"Matt Netkow"},"sameAs":["https:\/\/x.com\/dotNetkow"],"url":"https:\/\/ionic.io\/blog\/author\/mattnetkow"}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2021\/12\/easapp-feature-image.png","_links":{"self":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts\/4005","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/users\/62"}],"replies":[{"embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/comments?post=4005"}],"version-history":[{"count":0,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts\/4005\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/media\/4025"}],"wp:attachment":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/media?parent=4005"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/categories?post=4005"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/tags?post=4005"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}