The Technical Details Of Our YAPC::EU app

Paul Zolnierczyk (@paulish29) & Nate Robison (@ntrobison)
october 5th, 2016

YAPC::EU

YAPC::EU recently hosted their annual Perl Conference in Cluj-Napoca, Romania, and Infinity Interactive is proud to have partnered with them in releasing the YAPC::EU mobile application on iOS and Android. Today, we’ll cover some of the technical challenges we faced in creating this app, which we built on the foundation of the Open Source project that provided a similar app for Xamarin Evolve 2016.

Show Me The Schedule!

The basic functionality of any conference app is to provide up-to-date schedule information, so that an attendee can make decisions about which sessions to attend. To meet this requirement, we needed a source of data that was updated in real time and accurately reflected the schedule displayed on the YAPC::EU website. Fortunately, the ACT software used by the conference provided an iCal feed of the schedule. We were able to use this standard data format without any interruption or interference to the way YAPC::EU operates, while also getting real-time schedule updates for our app.

The iCal Giveth & The iCal Taketh Away

RFC 5545 — Do You Speak It?

Unfortunately, there were some inconsistencies with the YAPC::EU iCal feed regarding compliance with the relevant RFCs (2445 and 5545). More specifically, the provided iCal file didn’t conform to the spec for certain fields: ATTENDEE, COMMENT, and ORGANIZER. We did find some existing .NET libraries that implemented iCal parsers, but we weren’t able to use them due to this lack of conformance; they all required strict RFC 5545 semantics.

Time To Get Close To The Metal?

We considered writing a quick-and-dirty Node app to parse the iCal and re-serve it as JSON, which the mobile app could then pull in directly. Although this was a theoretically viable solution, we decided that it involved too many moving parts. It would be another hosted app that could go down, would need to be monitored, would complicate deployment plans, and so on.

Sometimes You Just Gotta Say, “Parse It!”

The only “easy” option left, the one that didn’t involve another service piece, was to manually parse the iCal file ourselves in the backend of the system. While it didn’t adhere strictly to the RFC 5545 standard, the iCal file did follow the structure for the most part. This allowed us to read the file line by line looking for tokens such as LOCATION: or DESCRIPTION: to map to our event objects. In addition to a line-based parsing approach, we also had to account for multi-line event descriptions. Some descriptions didn’t correctly provide the newline character (\n), and other characters weren’t properly escaped. In the end, our DIY approach ended up being beneficial, as we were easily able to handle these inconsistencies as we discovered them

We used the Azure Scheduler to trigger a new iCal file fetch-parse cycle once an hour, so that any schedule changes would be pushed live to the mobile application. Later, after the event was actually underway, the organizers asked us to bump up the frequency to every 15 minutes to better accommodate their schedule changes. (They were dynamically rescheduling talks based on projected attendance to make the best use of their conference space.) Azure Scheduler made this as easy as pushing a button.

More Than Schedules

Info About The Sponsors

Tech conferences generally depend on sponsors to help make them happen. Naturally, we wanted information about the YAPC::EU sponsors to be in a prominent location within the app. We didn’t have a chance to coordinate a standard way to exchange data about the sponsors with the organizers of YAPC::EU. Instead, we manually extracted the data from the sponsor list on the YAPC::EU site and added it to the app. We ordered the sponsors by their tier: the highest tier sponsors were displayed first, and we went down the list from there. We also linked to the sponsors’ web pages and, where possible, to their Twitter handle.

Official Hashtag Timeline

YAPC::EU also had an official hashtag: #yapceu2016. The Xamarin Evolve app that we had based the app on already had support for displaying the Twitter timeline for a particular hashtag, so we updated that functionality to use the YAPC::EU tag. Exposing the official hashtag timeline within the app meant that users could easily follow it without having to track a new hashtag in their usual Twitter feed.

Azure

Application Backend

The existing Xamarin Evolve app backend that we used as the basis for the YAPC::EU app backend was designed to be used and hosted on Azure App Services. This made it very easy to deploy and scale for usage. During development, the Azure free tier was more than ample for our demands. Once the app was ready to go live, it was a matter of flipping a switch to move to the paid tier. This ensured that we would be able to handle any and all increases in traffic as the app was used by the conference attendees. As already mentioned, the Scheduler provided an easy means of running recurring jobs. All in all, Azure provided a scalable and stable back end with a minimal investment of both cost and time on our part.

Monitoring

Along with the monitoring available to us via Azure, we also use an external third-party tool to monitor the backend. An issue within the Azure network could take down both the site and the Azure monitoring service. We set up Pingdom to query an API endpoint that made a very lightweight database query. This exercised the entire application stack and validated that the backend was not only up, but also responding to requests in a timely fashion.

App Stores

Apple App Store

Recently Apple made changes to their review process which have significantly expedited getting apps approved and into the store. While it once took four to seven days for review and approval, in most cases, it now takes 24 hours or less. We are very happy to report that this was indeed the case for us. If you’re wondering what the difference between a Xamarin deploy and a Xcode iOS deploy is, there isn’t one! Both platforms yield an .ipa file that you submit to the app store for review. We did have one app rejection due to overusage of Apple iCloud storage, but that was quickly resolved once we optimized app icon sizes.

Google Play

Deployment to the Google Play store was extremely straightforward and quick. The Play store doesn’t have a lengthy approval process and thus apps can be live within a few hours. Xamarin makes it very easy to export the .apk file and sign it as needed for a Play store release. Once uploaded we were able to release a beta version to some users to test directly from the Play store. The Play store also made the switch from beta to release version trivial.

Conclusion

The most challenging piece of this conference app was importing the iCal data into the application. Importing data that comes in a standard format usually isn’t a challenge, but incomplete compliance with the RFCs caused some obstacles that forced us to consider alternatives. While this was an unexpected challenge, we recognize that many conference software systems don’t support any kind of structured data export, and so we’re grateful that we were able to get the schedule data as we did. In an ideal world, conference software systems would offer up a variety of format options for exporting data, such as JSON, XML, CSV, and/or XLS. In a perfect world, that dataset would also contain all the relevant metadata about the conference, such as details about sponsors, venue location and maps, WiFi information, and the conference Code of Conduct, all in one place. All in all, it was a lot of fun to work on and we’re extremely happy to hear the attendees and organizers of YAPC::EU found the app useful and a part of their daily conference experience.

Update: The YAPC::EU::2016 apps are no longer available on iOS or Android. Please check out the other iOS and Android apps we’ve created with Xamarin.

Tags: technology csharp xamarin