E N A B L I N G E F F I C I E N T H E A L T H C A R E
Kryssplattform mobilutvikling i C#
Runar Ovesen Hjerpbakk | Utviklingsleder | [email protected] Andreas Mosti | Systemutvikler | [email protected]
E N A B L I N G E F F I C I E N T H E A L T H C A R E
DIPS? DIPS. Motivasjon for kryssplattformutvikling Hva gjør C# til et flott språk å bruke også på mobil? Nyttige mønstre Demo og kodedykk
Agenda
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Hvem er DIPS?
Kontor i Bodø, Tromsø, Trondheim og OsloEt av de største programvarehusene i Norge
220 ansatte i DIPS– 130 utvikling– 20 databaseutviklere– 30 sykepleiere og leger
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Hva gjør DIPS
Vi utvikler journalsystem for 80% av sykehusene i NorgeAll pasientinformasjonen ligger i våre systemer80.000 sykehusansatte bruker DIPS hver dag
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Før var alt enkelt: Windows!
E N A B L I N G E F F I C I E N T H E A L T H C A R E
DIPS Mobile Platform 2007
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Dagens klientlandskap
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Andre forventninger fra brukerne
E N A B L I N G E F F I C I E N T H E A L T H C A R E
DIPS Mobile Platform 2014
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Native utvikling
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Selvpining
E N A B L I N G E F F I C I E N T H E A L T H C A R E
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Hybrider
Omtrent umulig å få til native brukeropplevlse
Ytelsen!
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Prøving og feiling
Mark Zuckerberg: Our Biggest Mistake Was Betting Too Much On HTML5
“There are mobile experiences out there that are so good, that … we need to have the highest quality, and the only way is doing native.”
“We have definitely shifted from HTML5 to native. The primary reason for that is, we’re seeing that more and more people are spending more time in the app, and the app is running out of memory.”
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Native for brukeren
Betyr det at vi er stuck med native utvikling om vi ønsker fornøyde brukere og vil ha en behagelig utviklerhverdag?
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Nei. Vi har Xamarin!
Alt du kan gjøre i Objective-C, Swift eller Java, kan du gjøre i C# vha. Xamarin!
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Ikke bare mobiler
E N A B L I N G E F F I C I E N T H E A L T H C A R E
C# fordeler
«Ligner på Java, alt er bare bedre.»
«Visual Studio med ReSharperer verdens beste IDE»
- Runar Ovesen Hjerpbakk
E N A B L I N G E F F I C I E N T H E A L T H C A R E
C vs C#
C# with XamarinC
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Java vs C#
C# with XamarinJava
E N A B L I N G E F F I C I E N T H E A L T H C A R E
LINQ - Language Integrated Query
E N A B L I N G E F F I C I E N T H E A L T H C A R E
XML? JSON? JSONx?
XML kan parses med LINQ
JSON er støttet av fantastiske 3. parts biblioteker
E N A B L I N G E F F I C I E N T H E A L T H C A R E
private void SnapAndPost (){ Busy = true; UpdateUIStatus ("Taking a picture"); var picker = new Xamarin.Media.MediaPicker (); var picTask = picker.TakePhotoAsync (new Xamarin.Media.StoreCameraMediaOptions ()); picTask.ContinueWith ((picRetTask) => { InvokeOnMainThread (() => { if (picRetTask.IsCanceled) { Busy = false; UpdateUIStatus ("Canceled"); } else { var tagsCtrl = new GetTagsUIViewController (picRetTask.Result.GetStream ()); PresentViewController (tagsCtrl, true, () => { UpdateUIStatus ("Submitting picture to server"); var uploadTask = new Task (() => { return PostPicToService (picRetTask.Result.GetStream (), tagsCtrl.Tags); }); uploadTask.ContinueWith ((uploadRetTask) => { InvokeOnMainThread (() => { Busy = false; UpdateUIStatus (uploadRetTask.Result.Failed ? "Canceled" : "Success"); }); }); uploadTask.Start (); }); } }); });}
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Async og Awaitprivate async Task SnapAndPostAsync (){ try { Busy = true; UpdateUIStatus ("Taking a picture"); var picker = new Xamarin.Media.MediaPicker (); var mFile = await picker.TakePhotoAsync (new Xamarin.Media.StoreCameraMediaOptions ()); var tagsCtrl = new GetTagsUIViewController (mFile.GetStream ());
// Call new iOS await API await PresentViewControllerAsync (tagsCtrl, true); UpdateUIStatus ("Submitting picture to server");
await PostPicToServiceAsync (mFile.GetStream (), tagsCtrl.Tags); UpdateUIStatus ("Success"); } catch (OperationCanceledException) { UpdateUIStatus ("Canceled"); } finally { Busy = false; }}
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Utvikle raskere!
Del kode mellom plattformene
Bruk ferdige biblioteker
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Standard mønster
E N A B L I N G E F F I C I E N T H E A L T H C A R E
IoC & Dependency Injection
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Men hva med Cloud?
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Men hva med Cloud?
66.9% markedsandel på web!
E N A B L I N G E F F I C I E N T H E A L T H C A R E
LAMP: 58.5%
E N A B L I N G E F F I C I E N T H E A L T H C A R E
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Skalerbar, Kryssplattform webkomponent i C# !?!?
Awesomeness!
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Forslag til REST-arkitektur
E N A B L I N G E F F I C I E N T H E A L T H C A R E
HTTP GET
HTTP POST
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Kjapp pakking og deployment med Docker
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Miguel approves!
E N A B L I N G E F F I C I E N T H E A L T H C A R E
En manuell, papirbasert prosedyre
Medikamenter føres fra papir til papir
Feilmedisinering: – Annen dose enn ordinært: 39%– Feil legemiddel til pasient: 17%– Legemiddel gitt til feil pasient: 12%
Usecase: medikamentutlevering
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Demo og kodedykk
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Hva vi ikke har pratet om: Xamarin Insights
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Hva vi ikke har pratet om: Xamarin Profiler
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Hva vi ikke har pratet om: Xamarin Test Cloud
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Hva vi ikke har pratet om: Xamarin Forms
E N A B L I N G E F F I C I E N T H E A L T H C A R E
Priser
E N A B L I N G E F F I C I E N T H E A L T H C A R E
C# er et fantastisk språk og kan brukes på «alle» plattformer vha. bla. Xamarin
Native Apps kan gi bedre brukeropplevelse og bedre ytelse enn hybrider
Opp mot 90% kodedeling på tvers av plattformer 27,533 - 3. parts komponenter og biblioteker på NuGet,
de viktigste er kryssplattform allerede Kan bruke Visual Studio eller Xamarin Studio
Oppsummering
E N A B L I N G E F F I C I E N T H E A L T H C A R E
@hjerpbakk@amostii
xamarin.com
github.com/xamarin
Sommerjobber og faste stillinger på dips.no
Spørsmål?
Top Related