There is no app! – LevelUp Mobile slides

 

On September 22nd, 2016 I presented a session called “There is no app!” at the LevelUp Mobile 2016 event in Leusden. Here are the slides and video of that presentation:

[The video will be placed here shortly]

Abstract
Mobile platforms are evolving and getting richer and richer in features with every new release. The OS itself is becoming the primary interface for users to interact with, as are a new category of (wearable) devices.

What does this mean for us as app developers? Are the days of the traditional “mobile app” numbered? How do we serve our end users and optimize their mobile moment as much as possible?

The average smartphone owner has installed over 100 apps on their phone while they only use between 3 and 5 apps a day. By integrating your app more deeply into the mobile operating system can greatly increase the usage of the app. During this session we will show what you can do to integrate your apps in the Windows, iOS and Android platforms to keep your app top of mind. We’ll look at spotlight search, universal links, app indexing, Cortana integration and other APIs provided by iOS and Google Play services to engage your users in your apps. We’ll also look at new interaction models that are closer to the mobile platform: widgets, 3D-Touch, etc.

Ceci n’est pas une app

LevelUpMobile_logoRGBCall to action: join us at LevelUp Mobile on September 22nd in Leusden for a FREE inspirational evening on the future of Mobility and Devices.

 

The mobile platform war has been raging for almost ten years now. For now, it seems that Google (Android) and Apple (iOS) have won. (link) Microsoft, though still pushing Windows 10 for mobile as well, has accepted this and started providing high quality mobile apps for both Android and iOS.

Apple and Google have invested a lot in making their platforms richer and richer to attract and retain users. Apple’s advantage of 100% vertical integration of software and hardware has allowed them to create experiences like Apple Pay, 3D-Touch and Touch-ID that are very appealing to users and developers alike. At the same time, both Apple and Google have been putting features into the OS and stock apps that are competing with 3rd party offerings in the App Store. Furthermore, users have come to expect the same experience they get from their OS from 3rd party apps. Though some platform features might seem alike between iOS, Android and Windows, the way they are implemented can vastly differ and require access to core platform API’s.

As a strong proponent of Xamarin, I’ve been working in the world of cross platform mobile app development for almost 6 years now. The reason we chose to go with Xamarin was – first of all – of course the ability to share code amongst platforms, but – equally important – full access to the native platform API’s and the ability to create 100% native experiences. Given the trend of ever innovating mobile platforms, this puts us at a huge advantage over cross platform solutions that go for the lowest common denominator, both in UI (the same UI across all platforms) and UX (most of the time just the common superficial feature set across platforms).

With iOS 10, Apple is showing us a trend where apps can be integrated even deeper in the core OS experience. Of course we already had widgets in Android, but what to think about interactive widgets in iOS’s Today view, enriched with Siri’s AI capabilities? Interactive notifications are becoming more popular. Where a notification used to be a way to alert the user and allow them to open the accompanying app by tapping on it, notifications are becoming a User Interface by themselves, allowing the user to deal with the app’s functionality right from the lock screen.

ios-10-interactive-notifications
Deal with a notification right away from the Home screen. No need to open the app!
The boundaries of apps are blurring even more with advanced features like 3D-touch on the Home screen, and the ability to interact with apps from the Siri screen:

iOS-10-Control-Center-3D-Touch-iPhone-screenshot-001
Direct access to an app’s features through 3D-Touch. No need to open the app!

open_app_in_siri
Siri knows how to invoke your app and show it as a widget right inside its own interface. No need to open the app!

apps_in_imessage
iMessage can invoke your app right from its own interface. No need to open your app!
These are all iOS examples, by the way, but similar features can be found in Android and Windows 10, with its Live Tiles, Cortana integration, etcetera.

In general, user interaction with their mobile devices is becoming more and more streamlined, and to stay ahead as developers, we need to start thinking about these micro-interactions, these Mobile Moments, and offer the most efficient experience with our apps.

Mobile is not a neutral platform (link). The philosophy of web applications (built for browsers, available everywhere, with a consistent user experience everywhere) doesn’t apply here. We don’t build for the web, we build for the OS. Yay for native development! 🙂

spoon-boy
There is no spoon.
If we follow this train of thought, it leads us to an existential question: is there actually an app?

I would argue: not anymore – at least not in the traditional sense where we have an icon sitting on the home screen that launches into an application that comes into the foreground and occupies the whole screen. It seems like the days of the mobile “app” are numbered and we have to start thinking about apps as a set of autonomous micro-interactions that work together with the OS and/or other apps.

Luckily for us, as developers, there are plenty of new API’s and frameworks that help us build these interactions and I think it will only become more exciting from a technical perspective to build mobile experiences.

LevelUpMobile_logoRGB

On September 22nd, I’m joining Brechtje de Leij (mobile strategist and expert), Jorn de Vries of Flitsmeister fame, Johan Gorter & Rick Hoving from AFAS Software and the ever brilliant Laurent Bugnion to speak at a one-off inspiring event about the future of Mobile and Devices: LevelUp Mobile. Together with my colleague Geert, our talk is going to be about the exact topic of this blogpost and we’ll show some real life examples of how to implement these Mobile Moments using Xamarin.

If you have not registered yet, you can do it here: http://www.levelupmobile.nl! It’s free and it’s going to be fun!

To get more inspired, read Laurent’s teaser blog post about his upcoming talk: A world of devices.

GMImagePicker ported to Xamarin.iOS

TL;DR
I ported GMImagePicker to C#. Code here, Nuget here. Happy coding!

This past week I was working on a Xamarin project where we need support for selecting multiple images and/or taking pictures and uploading them to a backend service. The default UIImagePicker control in iOS is ok but not very versatile. It can take a picture with the camera, or lets you select a single image from your gallery but that’s about it. Furthermore, working with the resulting images is quite cumbersome as you’re working with large UIImage objects in memory. A lot of performance and memory issues can happen if you’re not careful.

In order to deal with photos and videos more efficiently and in a much richer manner, Apple introduced the PhotoKit API in iOS 8. Mike Bluestein has written a nice introductory post on this API on the Xamarin blog, so I’m not going to repeat this.

In short, PhotoKit works with the notion of PHAsset objects, which are basically descriptors for media files on the device. There are API’s to query different photo galleries, etcetera. Only once you actually need the image for display or other purposed do you have to retrieve the image using the PHAsset descriptor. Very efficient.

Many apps, such as the Facebook app, allow users to select multiple images in a user friendly manner, and maybe even add pictures on the go by providing access to the camera while they are browsing their gallery. This is something that we also wanted to add to our app. Luckily, there are some nice open source projects around that implement just that. One of the nicest ones is the GMImagePicker component by Guillermo Muntaner Perelló, which uses the PhotoKit API under the hood. The user experience looks like this:

gmimagepickerdemo

That’s slick! You can browse through several collections, and the control is highly customizable, and even contains localized texts for labels, buttons and dialogs. Only, it’s written in Objective-C…

I had two options: bind the API using Xamarin’s Objective Sharpie or port it verbatim to C#. I chose to port it, mainly to have full control over the inner workings of the control and to not have to pull in a “foreign” language into the project. The port has complete feature parity with the Objective-C version and I tried to iron out as many issues as I could. It seems to be working pretty smoothly in my Xamarin app.

The code is up on GitHub and you can use the control by either downloading the code and including the .csproj in your project, or install the Nuget package in your Xamarin.iOS app:

Install-Package GMImagePicker.Xamarin

As I said, the GMImagePicker control is highly customizable. You can change its appearance by specifying colors for different parts of the UI, and you can provide custom titles and confirmation prompts. It’s also possible to filter and limit the types of assets you want the user to select. The whole range of options can be found in the sample app that comes with the control. Here is an overview:

var picker = new GMImagePickerController {
Title = "Custom Title",
CustomDoneButtonTitle = "Finished",
CustomCancelButtonTitle = "Nope",
CustomNavigationBarPrompt = "Take a new photo or select an existing one!",
ColsInPortrait = 3,
ColsInLandscape = 5,
MinimumInteritemSpacing = 2.0f,
DisplaySelectionInfoToolbar = true,
AllowsMultipleSelection = true,
ShowCameraButton = true,
AutoSelectCameraImages = true,
ModalPresentationStyle = UIModalPresentationStyle.Popover,
MediaTypes = new [] { PHAssetMediaType.Image },
// Other customizations to play with:
//ConfirmSingleSelection = true,
//ConfirmSingleSelectionPrompt = "Do you want to select the image you have chosen?",
//PickerBackgroundColor = UIColor.Black,
//PickerTextColor = UIColor.White,
//ToolbarBarTintColor = UIColor.DarkGray,
//ToolbarTextColor = UIColor.White,
//ToolbarTintColor = UIColor.Red,
//NavigationBarBackgroundColor = UIColor.Black,
//NavigationBarTextColor = UIColor.White,
//NavigationBarTintColor = UIColor.Red,
//PickerFontName = "Verdana",
//PickerBoldFontName = "Verdana-Bold",
//PickerFontNormalSize = 14.0f,
//PickerFontHeaderSize = 17.0f,
//PickerStatusBarStyle = UIStatusBarStyle.LightContent,
//UseCustomFontForNavigationBar = true,
};

// You can limit which galleries are available to browse through
picker.CustomSmartCollections = new [] {
PHAssetCollectionSubtype.SmartAlbumUserLibrary,
PHAssetCollectionSubtype.AlbumRegular
};

// Event handling
picker.FinishedPickingAssets += Picker_FinishedPickingAssets;
picker.Canceled += Picker_Canceled;

// Other events to implement in order to influence selection behavior:
// Set EventArgs::Cancel flag to true in order to prevent the action from happening
picker.ShouldDeselectAsset += (s, e) => { /* allow deselection of (mandatory) assets */ };
picker.ShouldEnableAsset += (s, e) => { /* determine if a specific asset should be enabled */ };
picker.ShouldHighlightAsset += (s, e) => { /* determine if a specific asset should be highlighted */ };
picker.ShouldShowAsset += (s, e) => { /* determine if a specific asset should be displayed */ };
picker.ShouldSelectAsset += (s, e) => { /* determine if a specific asset can be selected */ };
picker.AssetSelected += (s, e) => { /* keep track of individual asset selection */ };
picker.AssetDeselected += (s, e) => { /* keep track of individual asset de-selection */ };

// The GMImagePicker can be treated as a PopOver as well:
var popPC = picker.PopoverPresentationController;
popPC.PermittedArrowDirections = UIPopoverArrowDirection.Any;
popPC.SourceView = gmImagePickerButton;
popPC.SourceRect = gmImagePickerButton.Bounds;

await PresentViewControllerAsync(picker, true);

The extensibility is very convenient. For example: if you want to set a maximum to the total size of the images you want to allow the user to select, you can handle the AssetSelected event, keep track of the total size selected, and handle ShouldSelectAsset, to prevent selection if a maximum threshold has been reached. This is exactly what we wanted to have in our app.

Once the user has finished selecting assets, you can use a PHImageManager to retrieve the actual images in whatever size you like:

void FinishedPickingAssets (object s, MultiAssetEventArgs e)
{
  PHImageManager imageManager = new PHImageManager();

  foreach (var asset in e.Assets) {
    imagePreview.Image = null;

    imageManager.RequestImageForAsset (asset, 
      new CGSize(asset.PixelWidth, asset.PixelHeight), 
      PHImageContentMode.Default, 
      null, 
      (image, info) => {
        // do something with the image (UIImage), e.g. upload to server
        // you can get the JPEG byte[] via image.AsJPEG()
      });
  }
}

Very nice, and it’s now available for Xamarin.iOS developers as well 🙂

photo-1437419764061-2473afe69fc2
Photo by Andrew Illarionov (https://unsplash.com/photos/-WW8jBak7bo)

Many thanks to Guillermo for letting me port his excellent code and publish it. I’d love to hear your feedback on the code and would love to see your PR’s for improvements.

Xamarin Evolve 2013 – Day 1

Austin, TX skyline

Hello from Austin, TX! So today was day 1 of the Xamarin Evolve conference. What a day! Marcel (@marcelv) and I flew in on Saturday and we arrived at the hotel late in the evening, so there was no time to check out downtown Austin, famous for its live music scene. It’s obvious as soon as you arrive on Austin airport.

Finally arrived in Austin for #xamarin Evolve w/ @marcelv

A post shared by Roy Cornelissen (@roycornelissen) on

After a good night’s sleep, we went down to the conference area in the Hilton hotel to register and have a nice breakfast. Immediately, the great attention to detail Xamarin put into organising Evolve was apparent. Have a look at the conference badge:

Yeah, @InfoSupportBV present at #xamarin Evolve!

A post shared by Roy Cornelissen (@roycornelissen) on

Ready to go! #xamarin

A post shared by Roy Cornelissen (@roycornelissen) on

The name badge also serves as a booklet containing the conference schedule and speaker information. The emphasis on the first name (printed in big bold letters) makes it personal and informal.

Next, the names of the conference rooms… They were all named after scientists related to Evolution (get it… Evolve) or monkeys. Illustrious people like Darwin, Dawkins, Gould, Goodall, Fossey, etcetera.

Things that make you feel that a lot of thought and attention to detail went into this conference. Xamarin can be proud of this.

We were also proud to see Info Support listed on the banner as a Silver Sponsor. 🙂

The welcome and keynote by Xamarin CEO Nat Friedman was nice. He told us how they were completely overwhelmed by the interest in Evolve. At first they anticipated around 250 people, but it soon went up to 400, and later on sold out at 600 people! Xamarin even had to change the venue and date in order to fit in all these people. A testament of Xamarin’s success and community passion for their products!

Passion is actually what describes Xamarin and Evolve best. All 70 (!) Xamarin employees are present at the conference, walking around, always available for a quick talk or questions, and all of them radiate passion for their job. The same with the participants. Mobile is fun. I’m confident that this vibe will stay during the remaining three days.

It was also great to meet and greet the Xamarin leaders. Nat, Miguel, Stephanie, all taking time to talk to everyone and eager to work together with their partners and the developer community.

This first day was dedicated to the Xamarin training. We did the Advanced track. After some technical difficulties – Wifi at a conference always sucks – we covered Notifications, Touch, Android Fragments, Animations and Graphics in iOS and Android. The training material is quite nice, as are the demo apps.

All day, we were very well taken care of in terms of food and drinks. Austin is a nice place for a foodie 🙂 To celebrate our first day at Evolve, we were all invited to Stubb’s Bar-B-Q restaurant, where we enjoyed a nice BBQ… pulled pork, beef briskett, cole slaw, nachos and quacamole, you name it. All that in a nice atmosphere and accompanied with a couple of beers. Oh and great weather!

Great evening with a real Texas BBQ! Great to meet the passionate folks from #xamarin

A post shared by Roy Cornelissen (@roycornelissen) on

Tomorrow it’s day 2 of the Advanced training. Looking forward to that. Tuesday and Wednesday are conference days, and then it’s our turn to talk about mobile development with Xamarin. See you at our sessions?

Tuesday, 2.30PM: Creating a Uniform Login for Apps
Wednesday, 1.30PM: Sharing up to 80% Code for iOS, Android and Windows

Airstream

A post shared by Roy Cornelissen (@roycornelissen) on

Microsoft TechDays 2013 session

Today I had the pleasure of delivering a session at Microsoft’s TechDays 2013 event in The Hague. A fun conference at which I’ve had the opportunity to speak for the last three years now.

Our session last year about Cross Platform Mobile Development still gets a lot of positive feedback. I did this together with Marcel de Vries and Willem Meints. Here’s the video feed on Channel 9: link. It’s in Dutch.

Unfortunately, an updated version of this talk wasn’t accepted for this year. I did however get a slot for a session about Real Time Mobile Apps and Websites with SignalR. SignalR is also a great topic to talk about, and I got to sneak in a couple of technologies I love: NServiceBus and Xamarin.iOS 🙂 The room was packed, which was great.

No recording this time around, but the slides are on SpeakerDeck. Here they are:

Thanks to those who attended my session!

Welcome Xamarin 2.0!

The past year, Xamarin has been working hard on their new product suite, Xamarin 2.0. Their awesome product suite for cross platform mobile development with C#, consisting of MonoTouch for iOS, Mono for Android and Xamarin.Mac, based on the MonoDevelop IDE has been completely revamped and rebranded.

Say hello to Xamarin Studio, Xamarin.iOS, Xamarin.Android and Xamarin.Mac! This is a more integrated, modern and gorgeous looking version of their delightful tool suite.

Xamarin Studio start screen (Windows version)

Develop iOS on Windows!
Along with this release, Xamarin also made it possible to develop iOS apps on Windows using Visual Studio! Wow! You can develop and compile apps in Visual Studio and, with a remote debugger, debug your apps on a Mac running Apple’s iOS Simulator. This means that you still need a Mac for finishing the app, and also for designing your XIB files, but this is a huge improvement, making it possible for your Visual Studio devs to open and compile your iOS apps. This is very useful e.g. when you do bugfixes in shared code and will ease the workflow of devs working on Windows Phone, Android and iOS apps at the same time.

Being an Apple fanboy, I still prefer to use my Mac for iOS development though. Xamarin took care of that as well, with a fantastic new version of Xamarin Studio for Mac.

Component Store
As a bonus, Xamarin released a Component Store on their Developer Center, which makes it easy to discover and incorporate 3rd party libaries into your mobile apps, and provides a great market place for developers to publish their library. Even Microsoft has published a component for integration with their Azure Mobile Services!

Pricing
This release also features an attractive new pricing model. First of all, there is now a free Starter edition! This version makes it possible for small independent developers and students to build and release small apps. The Starter edition is limited to a maximum package size and cannot do P/Invoke, but it’s an awesome way to get on your way building mobile apps with C#!

Next, there’s an Indie version for individual developers, attractively priced at $299 per platform (e.g. iOS and Android are two platforms). For organizations, there are Business and Enterprise editions that enable full fledged, unlimited apps, Visual Studio development and full support. There’s a nice comparison on the Xamarin website.

Try it out!
I’ve been test driving this release for a while now and I can say that this is a great achievement and big step forward in productivity, integration and developer delight. You can try it yourself here.

UPDATE: Nic Wise (@fastchicken on Twitter) has a nice blog post detailing more changes in Xamarin 2.0. Click here!

I want to congratulate the Xamarin team on reaching this milestone! Here’s to many great projects using your tools! I can’t wait to show this off at the Evolve conference in April.

Beer toasting

What will iOS 6 bring us?

Tomorrow Apple opens up WWDC 2012. As usual, CEO Tim Cook will deliver the keynote, which is usually laden with cool new announcements. Will it be a new iPhone? An Apple HDTV? In any case, there will be an introduction of iOS 6 for sure, judging from the banners in the Moscone Convention Center.

Image

I don’t care so much to see the iPhone 5 tomorrow, as I’m sure there will be one this year. Interesting rumours and “leaked parts” are flying around on the internet. Lots of cool stuff and no doubt it will be the coolest device on the market for yet another year. In any case, I will buy it as a replacement for my trusty iPhone 4.

For now, I’m mostly interested in iOS 6 and the new stuff it will bring. With iOS 5 I had hoped for a refresh, or even an overhaul, of the home screen. Slick and fluid as it is, iOS is starting to look aged compared to Windows Phone Mango and even Android Ice Cream Sandwich. Not that I want to have widgets all over the place, but the liveliness of Windows Phone (with its Live Tiles) is lacking in iOS. Live Tiles and Background Agents are the two things I have “feature envy” over. Metro, not so much. It looks nice and fresh at first sight, but after a couple of minutes of using a some of the apps it becomes obvious how difficult it is to apply the concept. Most Metro apps look bland, bare bone and not so fresh as the WP7 home screen promises. So it’s iPhone for me all the way, unsurprisingly… iOS is still the most complete, stable and mature smart phone OS on the market in my opinion. It’s not a coincidence that all of the cool apps appear on iOS first, and usually look the coolest on iOS as well.

While iOS 5 did bring a bunch of improvements in usability and some nice new features, the static home screen remained, so I was a bit disappointed. I´m hoping for more in iOS 6. When I first saw the announcement for WWDC 2012, I immediately thought the logo looked fresh and playful.

Image

Will this translate to the overall appearance of iOS 6? I hope so. Rumours are that there will be a completely new Maps application with 3D and all. Cool, but not crucial for me. Now is the time for Apple to put more innovation into the overall experience. Other rumours are that most of the application chrome in default apps will be silver instead of the grayish blue, much like the iPad. Also nice, but not shocking. Funny enough the iOS 6 logo (as seen above) is that same grayish blue color as the old chrome. On the other hand, the “6” has a gray/silver color. We’ll see…

What I’d love to see is an overhaul of the home screen UI, more and tighter integration possibilities between apps, and more informative home screen. I use my iPhone both for work and privately, so I’d love to see my upcoming appointments for the day in some way, missed phone calls, maybe some Twitter related info, and a bit less clunky than how notifications are done in iOS 5 (which already was a big improvement over iOS 4)! This video, made by an iOS fan, shows some nice ideas for iOS 6. I hope some of them will be announced tomorrow:

In terms of user interaction, I’m sure Apple will be setting the bar once again as soon as the new iPhone 5 is introduced. I’m expecting (hoping for) the addition of tactile and haptic feedback on the touch screen (not just those lame vibrations most Android devices do). Rumours and Apple patents about this have been flying around for a couple of years now. Time for action.

Apple has been known to put clues here and there into their invitations and stuff. Look closely at the iOS 6 logo… See the ripples? Does this hint at tactile feedback? Or is it just the new default wallpaper like on the new iPad? Sometimes speculating on non-information is fun 😉

Another cool rumour is the one around NFC integration. Apple was recently awarded a patent that hints towards usage of NFC for mobile payment type scenario’s. Very nice, and NFC opens some nice possibilities for apps.

The last thing I’d like Apple to do is create a better experience on the iPad for pens. I know Steve Jobs hated styluses, but there are a lot of very cool creativity apps for the iPad. FiftyThree’s Paper app is currently the coolest on the market. I like using the iPad for drawing, sketching and notetaking, and my Bamboo Stylus for iPad is a great tool, but the experience is still clunky. iPad / iOS has no palm negation technique so drawing on the iPad isn’t as natural as on a piece of paper. Microsoft is way more ahead of Apple in this area, with its years old Ink technology. The //BUILD developer preview tablet with Windows 8 comes with a nice pen and drawing and writing on it feels very natural. The more the iPad is becoming a device for creation, not just consuming, the more I think it needs this type of support. Of course iOS needs to be prepared for this as well. Luckily there have been rumours about this…

I’ll be watching the keynote live blogs very closely tomorrow! Time for Apple to 0wn back the competition.