building your apps for cross platform compatability

29
Building your Apps for Cross Platform Compatibility Intro to MvvmCross and Xamarin.Mobile Michael Cummings Microsoft Technical Evangelist @mcummings http://geekswithblogs.net/mathoms

Upload: michael-cummings

Post on 05-Dec-2014

568 views

Category:

Technology


1 download

DESCRIPTION

Now with 3 App Marketplaces to sell your apps in, it's becoming more important to design and build your apps so that you can publish in all 3 markets without having to rebuild the entire app for each platform. In this session we will cover the pros and cons of HTML5/JS/CSS3 and C#/CLR.

TRANSCRIPT

Page 1: Building your apps for cross platform compatability

Building your Apps for Cross Platform CompatibilityIntro to MvvmCross and Xamarin.Mobile

Michael CummingsMicrosoft Technical Evangelist@mcummingshttp://geekswithblogs.net/mathoms

Page 2: Building your apps for cross platform compatability

Overview

Challenges FrameworksDevelopment Approaches

Page 3: Building your apps for cross platform compatability

Development Approaches

Page 4: Building your apps for cross platform compatability

The Cross Platform Pyramid• Toolsets / Frameworks• Hybrid Applications• Integrated

HTML5• MS .Net• Xamarin MonoC#/CLR

• Barebones access to low level API’s

C++

Port

ab

ility

Flexibility

Page 5: Building your apps for cross platform compatability

Battle Royale Web Standard being

leveraged for mobile Performance hit from

JavaScript execution Development tools are

lacking, esp. Debugging

Desktop paradigm being leveraged for mobile

Native execution model for each platform

1 Stack - Cloud to Device

HTML5/JS/CSS3 C# / CLR

Page 6: Building your apps for cross platform compatability

http://xamarin.com

Page 7: Building your apps for cross platform compatability

Challenges

Page 8: Building your apps for cross platform compatability

Where can you go wrong? User Interface

Use UI patterns to abstract presentation logic from display

Application Logic Use abstractions to hide implementation of device services Storage, Camera, Contacts, GPS, etc

Services WCF is not a reliable cross platform client framework Use WebRequest to send / receive data REST over XML Web Services JSON over XML

Page 9: Building your apps for cross platform compatability

Avoidance Patterns Patterns Patterns

Page 10: Building your apps for cross platform compatability

MvvmCross and MonoCross Awesome UI and Data Development Unit Testing of code Large applications to have a common architecture

Different platforms can share code

Page 11: Building your apps for cross platform compatability

Model-View-ViewModel

ModelViewModelView

Data Binding

Data

Page 12: Building your apps for cross platform compatability

Model-View-Controller

ModelController

View

Data Binding

Data

Page 13: Building your apps for cross platform compatability

Xamarin.Mobile API

xamarin.com/mobileapi

Page 14: Building your apps for cross platform compatability

Xamarin.Mobile API

Contacts Geolocation

Compass + Accelerometer

CameraNotifications

Xamarin.Mobile

Page 15: Building your apps for cross platform compatability

Contacts - AndroidContentResolver content= getContentResolver();

Cursor ncursor = null;try { ncursor = content.query (ContactsContract.Data.CONTENT_URI, new String[] { ContactsContract.Data.MIMETYPE, ContactsContract.Contacts.LOOKUP_KEY, ContactsContract.Contacts.DISPLAY_NAME }, ContactsContract.Data.MIMETYPE + "=? AND " + ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME + "=?", new String[] { ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE, "Smith" }, null);

while (ncursor.moveToNext()) { print (ncursor.getString(ncursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)) + lineSep); String lookupKey = ncursor.getString (ncursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); Cursor dcursor = null; try { dcursor = content.query (ContactsContract.Data.CONTENT_URI, new String[] { ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.NUMBER,ContactsContract.Data.DATA1 }, ContactsContract.Contacts.LOOKUP_KEY + "=?", new String[] { lookupKey }, null); while (dcursor.moveToNext()) { String type = dcursor.getString (ncursor.getColumnIndex(ContactsContract.Data.MIMETYPE));

if (type.equals (ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)) print ("Phone: " + dcursor.getString(dcursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)) + lineSep); else if (type.equals (ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)) print ("Email: " + dcursor.getString(dcursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA1)) + lineSep); } } finally { if (dcursor != null) dcursor.close(); } }} finally { if (ncursor != null) ncursor.close();}

Page 16: Building your apps for cross platform compatability

Contacts – iOS

ABAddressBookRef ab = ABAddressBookCreate(); CFStringRef name = CFSTR ("Smith"); CFArrayRef smiths = ABAddressBookCopyPeopleWithName(ab, name); CFRelease (name); int count = CFArrayGetCount(smiths); for (int i = 0; i < count; ++i) { ABRecordRef person = (ABRecordRef)CFArrayGetValueAtIndex(smiths, (CFIndex)i); if (ABRecordGetRecordType(person) != kABPersonType) continue; NSString *name = (NSString*)ABRecordCopyCompositeName(person); NSLog ("%@\n", name); [name release]; ABMultiValueRef phoneNumberProp = ABRecordCopyValue(person, kABPersonPhoneProperty); NSArray* numbers = (NSArray*)ABMultiValueCopyArrayOfAllValues(phoneNumberProp); CFRelease(phoneNumberProp); for (NSString *pvalue in numbers) NSLog ("Phone: %@\n", pvalue);

[numbers release]; ABMultiValueRef emailProp = ABRecordCopyValue(person, kABPersonEmailProperty); NSArray* emails = (NSArray*)ABMultiValueCopyArrayOfAllValues(emailProp); CFRelease(emailProp); for (NSString *evalue in emails) NSLog ("Email: %@\n"); [emails release]; } CFRelease (ab); CFRelease (smiths);

ABAddressBookRef ab = ABAddressBookCreate(); CFStringRef name = CFSTR ("Smith"); CFArrayRef smiths = ABAddressBookCopyPeopleWithName(ab, name); CFRelease (name); int count = CFArrayGetCount(smiths); for (int i = 0; i < count; ++i) { ABRecordRef person = (ABRecordRef)CFArrayGetValueAtIndex(smiths, (CFIndex)i); if (ABRecordGetRecordType(person) != kABPersonType) continue; NSString *name = (NSString*)ABRecordCopyCompositeName(person); NSLog ("%@\n", name); [name release]; ABMultiValueRef phoneNumberProp = ABRecordCopyValue(person, kABPersonPhoneProperty); NSArray* numbers = (NSArray*)ABMultiValueCopyArrayOfAllValues(phoneNumberProp); CFRelease(phoneNumberProp); for (NSString *pvalue in numbers) NSLog ("Phone: %@\n", pvalue);

[numbers release]; ABMultiValueRef emailProp = ABRecordCopyValue(person, kABPersonEmailProperty); NSArray* emails = (NSArray*)ABMultiValueCopyArrayOfAllValues(emailProp); CFRelease(emailProp); for (NSString *evalue in emails) NSLog ("Email: %@\n"); [emails release]; } CFRelease (ab); CFRelease (smiths);

Page 17: Building your apps for cross platform compatability

var book = new AddressBook () { PreferContactAggregation = true} ;

foreach (Contact c in book.Where (c => c.LastName == "Smith")) { Console.WriteLine (c.DisplayName);

foreach (Phone p in c.Phones) Console.WriteLine ("Phone: " + p.Number);

foreach (Email e in c.Emails) Console.WriteLine ("Email: " + e.Address);}

Xamarin.Mobile Contacts

Page 18: Building your apps for cross platform compatability

MvvmCross & Xamarin.Mobile

Contacts ListDemo

Page 19: Building your apps for cross platform compatability

Frameworks

Page 20: Building your apps for cross platform compatability

HTML5/JS developersGameMaker - family of products that caters to entry-level developers and seasoned game development professionals to create cross platform games

Page 21: Building your apps for cross platform compatability

HTML5/JS developersGameSalad – create cross platform games rapidly with no code

Page 22: Building your apps for cross platform compatability

HTML5/JS developersConstruct2 - cross platform game development for beginners

Page 23: Building your apps for cross platform compatability

• Free open source cross platform framework for apps on mobile devices

• Renders UI using HTML5 and CSS; Web browser encased in a native app for each platform

• Build for Windows Phone and Port to Windows 8

HTML5/JS developers

Page 24: Building your apps for cross platform compatability

C# developersMonoGame – cross platform implementation of the XNA 4.0 framework

Page 25: Building your apps for cross platform compatability

C++ developersEpic Games Unreal Engine 3 (UDK ) – a complete professional framework that provides tools for creating high-quality games and apps, movies and advanced 3D visualizations and simulations

http://www.unrealengine.com/udk/

Page 26: Building your apps for cross platform compatability

IN THE SPOTLIGHTTHE WWE APP IS READY TO RUMBLE!● Kevin Mills and Xudong He from UI Centric brought this

app to life. ● App features: easy-to-explore bios, stunning designs, and

unique interactions so that fans feel like they're a part of themain event.

● Mills and He’s top tip: "Get familiar with the PlayerFramework. Think Lean. Load time and content caching are important." READY TO BUILD THE NEXT BIG APP? JOIN GENERATION APP FOR:

● Tips and tricks on Windows 8 and Windows Phone app development. ● 1:1 on-the-phone access to a Windows 8 and Windows Phone expert*. ● An exclusive Windows UI style design consultation*.● An opportunity to test your app with qualified experts an App Lab.

Sign Up at www.generationapp.com

*See Ts&Cs on www.generationapp.com

Page 27: Building your apps for cross platform compatability

Where can I find out more?

Page 28: Building your apps for cross platform compatability

Detailed Technical Topics on HTML5, XAML, Games and more!

http://aka.ms/bostonmeetup

Workshops

Page 29: Building your apps for cross platform compatability

Ready to Submit? Having a nasty problem? Use our machines to test or our experts to help solve your app issues!

http://aka.ms/bostonmeetup

Office Hours