SlideShare a Scribd company logo
My customers are using iPhone/Android, but I'm a Microsoft Guy.
My Customers Are Using iPhone/Android but I'm a Microsoft Guy/Gal Now What?DPR304Simon GuestDirector, Mobility SolutionsNeudesic, LLC
My customers are using iPhone/Android, but I'm a Microsoft Guy.
How many smartphones are there?
ComScoreMobiLens
http://www.comscore.com/Products_Services/Product_Index/MobiLens72.5m Active Smartphones in US
www.comscore.com/Products_Services/Product_Index/MobiLens (trend used for Dec and Mar)
www.comscore.com/Products_Services/Product_Index/MobiLens (trend used for Dec and Mar)
www.comscore.com/Products_Services/Product_Index/MobiLens (trend used for Dec and Mar)
www.comscore.com/Products_Services/Product_Index/MobiLens (trend used for Dec and Mar)
www.comscore.com/Products_Services/Product_Index/MobiLens (trend used for Dec and Mar)
www.comscore.com/Products_Services/Product_Index/MobiLens (trend used for Dec and Mar)
www.comscore.com/Products_Services/Product_Index/MobiLens (trend used for Dec and Mar)
www.comscore.com/Products_Services/Product_Index/MobiLens (trend used for Dec and Mar)
www.comscore.com/Products_Services/Product_Index/MobiLens (trend used for Dec and Mar)
www.comscore.com/Products_Services/Product_Index/MobiLens (trend used for Dec and Mar)
www.comscore.com/Products_Services/Product_Index/MobiLens (trend used for Dec and Mar)
www.comscore.com/Products_Services/Product_Index/MobiLens (trend used for Dec and Mar)
www.comscore.com/Products_Services/Product_Index/MobiLens (trend used for Dec and Mar)
www.comscore.com/Products_Services/Product_Index/MobiLens (trend used for Dec and Mar)Android on fire.  From 9% to 33% in 12 monthsiOS holding steady around 25% market share
Many organizations adoptingiOS/Android
My customers are using iPhone/Android, but I'm a Microsoft Guy.
Not much help available…
My customers are using iPhone/Android, but I'm a Microsoft Guy.
My customers are using iPhone/Android, but I'm a Microsoft Guy.
To give you the tools and knowledge to integrate iPhone, iPad, and Android devicesinto an existing Microsoft development environment
My customers are using iPhone/Android, but I'm a Microsoft Guy.
My customers are using iPhone/Android, but I'm a Microsoft Guy.
“Can I make an existing web site work on iPhone and Android?”
First, how do we know it’s a mobile device?
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; InfoPath.3; MS-RTC LM 8)HTTP RequestHTTP ResponsePagesWindows 7 / IE8.0
UserAgent: Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5HTTP RequestHTTP ResponsePagesiPhone OS 4.3
Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.3.1 Mobile/7B334b Safari/531.21.10HTTP RequestHTTP ResponsePagesiPad OS 4.3
Mozilla/5.0 (Linux; U; Android 2.3; en-gb; Nexus One Build/FRF50) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1HTTP RequestHTTP ResponsePagesAndroid 2.3
if (useragent contains ”MSIE”)…User-Agent: Mozilla/4.0 (compatible; MSIE8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; InfoPath.3; MS-RTC LM 8)Windows 7 / IE8.0Pagesif (useragentcontains ”Android”)…Mozilla/5.0 (Linux; U; Android2.3; en-gb; Nexus One Build/FRF50) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1PagesAndroid 2.3
if (useragent contains ”MSIE”)…User-Agent: Mozilla/4.0 (compatible; MSIE8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; InfoPath.3; MS-RTC LM 8)Windows 7 / IE8.0ViewCSSControllerif (useragentcontains ”Android”)…Mozilla/5.0 (Linux; U; Android2.3; en-gb; Nexus One Build/FRF50) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1ViewCSSAndroid 2.3
if (useragent contains ”MSIE”)…User-Agent: Mozilla/4.0 (compatible; MSIE8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; InfoPath.3; MS-RTC LM 8)Windows 7 / IE8.0ViewCSSControllerif (useragentcontains ”Android”)…Mozilla/5.0 (Linux; U; Android2.3; en-gb; Nexus One Build/FRF50) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1ViewCSSAndroid 2.3
if (useragent contains ”MSIE”)…User-Agent: Mozilla/4.0 (compatible; MSIE8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; InfoPath.3; MS-RTC LM 8)Windows 7 / IE8.0ViewCSSControllerASP.NET MVCViewEngineif (useragentcontains ”Android”)…Mozilla/5.0 (Linux; U; Android2.3; en-gb; Nexus One Build/FRF50) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1ViewCSSAndroid 2.3
Demo:  Mobile View Engines in ASP.NET MVC 3All demos can be found on http://github.com/simonguest
“But it still looks like my original webpage”
User-Agent: Mozilla/4.0 (compatible; MSIE8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; InfoPath.3; MS-RTC LM 8)Windows 7 / IE8.0ViewCSSControllerASP.NET MVCViewEngineMozilla/5.0 (Linux; U; Android2.3; en-gb; Nexus One Build/FRF50) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1ViewCSSAndroid 2.3
Mobile Web FrameworksiUIhttp://iui-js.orgjQTouchhttp://jqtouch.comjQueryMobilehttp://jquerymobile.com
User-Agent: Mozilla/4.0 (compatible; MSIE8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; InfoPath.3; MS-RTC LM 8)Windows 7 / IE8.0ViewCSSControllerASP.NET MVCViewEngineMozilla/5.0 (Linux; U; Android2.3; en-gb; Nexus One Build/FRF50) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1ViewCSSAndroid 2.3
Demo:  Using jQueryMobile to create native look and feelAll demos can be found on http://github.com/simonguest
TakeawaysRecommendations:Mobile Web sites will let you target multiple devices with a single back end
Use ASP.NET MVC with ViewEngine support for device specific views
Use ASP.NET MVC 3 for improved HTML5 attributesWatch out for:Many different UI frameworks – choose carefully
MEAPs – Mobile Enterprise Application Platforms (auto gen’d UI from single source)
“We’ve built services using REST/SOAP.  Can I consume these?”
Native ApplicationRESTiPad/iPhone OS 4.3 (ObjC)Android 2.3 (Java)
Native ApplicationRESTREST.svc<%@ ServiceHost Service=”TechEd.Web.Services.SessionService" Factory="System.ServiceModel.Activation.WebServiceHostFactory"  %>iPad/iPhone OS 4.3 (ObjC)Android 2.3 (Java)
Native ApplicationSessionService.csRESTpublic class SessionService : ISessionService{public SessionSummary[] GetData(){// return active sessions    }} iPad/iPhone OS 4.3 (ObjC)Android 2.3 (Java)
Native ApplicationISessionService.csREST [ServiceContract]    public interface ISessionService    {[WebGet(UriTemplate = "/Sessions", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]        [OperationContract]SessionSummary[] GetData();    }iPad/iPhone OS 4.3 (ObjC)Android 2.3 (Java)
Native ApplicationRESTiPad/iPhone OS 4.3 (ObjC)Step 1:  Youneed a JSON libraryhttp://stig.github.com
iPhoneClientViewController.m-(IBAction)callRESTService:(id)sender{	NSURL *url = [NSURL URLWithString:@"http://sguest01/TechEdDemoMVC/Services/REST.svc/Sessions"];NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:url];	[request setHTTPMethod:@"GET"];connection = [[NSURLConnectionalloc] initWithRequest:requestdelegate:self];	if (connection)	{NSLog(@"Connection was established");receivedData = [[NSMutableData data] retain];	}else {NSLog(@"Connection wasnull");	}}Native ApplicationRESTiPad/iPhone OS 4.3 (ObjC)Step 2:  UseNSMutableURLRequest to call the service
iPhoneClientViewController.m- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{NSLog(@"Received response from the REST call");	[receivedData setLength:0];}-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{NSLog(@"Received data from the REST call");	[receivedDataappendData:data];}-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{NSLog(@"REST call failed with an error");}Native ApplicationRESTiPad/iPhone OS 4.3 (ObjC)Step 3:  Handle callbacks
iPhoneClientViewController.m-(void)connectionDidFinishLoading:(NSURLConnection *)connection{NSLog(@"Connection finished loading");NSString *responseString = [[NSStringalloc]initWithData:receivedData encoding:NSUTF8StringEncoding];NSLog(@"%@",responseString);NSArray *dict = [responseStringJSONValue]; 	for (id obj in dict)	{NSDictionary *session = [[NSDictionaryalloc] initWithDictionary:obj];NSString *sessionCode = [session valueForKey:@"Code"];NSLog(@"%@",sessionCode);	}NSLog(@"Complete");}Native ApplicationRESTiPad/iPhone OS 4.3 (ObjC)Step 4:  Get the response, deserialize JSON
“REST appears to be fairly straightforward – but how about my services use SOAP?”
Native ApplicationiSOAP.cs [ServiceContract]public interface ISOAP{[OperationContract]List<SessionSummary> GetSessions();}SOAP (WS-I)iPad/iPhone OS 4.3 (ObjC)SOAP.svc.cspublic class SOAP : ISOAP{public List<SessionSummary> GetSessions(){// code to return active sessions}}Android 2.3 (Java)
“It’s not as easy as you were hoping!”
Native ApplicationSOAP (WS-I)iPad/iPhone OS 4.3 (ObjC)Option 1:  Handcraft the SOAP request/handle the SOAP response
Native ApplicationSOAP (WS-I)iPad/iPhone OS 4.3 (ObjC)Option 2:  Yoursearcheswilllikelytakeyou down the road of gSOAP and WSMakeStubs
Native ApplicationSOAP (WS-I)iPad/iPhone OS 4.3 (ObjC)Option 3:  wsdl2objc (http://code.google.com/p/wsdl2objc/)Version 0.7-pre1 recommendedhttp://code.google.com/p/wsdl2objc
Native ApplicationSOAP (WS-I)iPad/iPhone OS 4.3 (ObjC)Option 3:  wsdl2objc (http://code.google.com/p/wsdl2objc/)Version 0.7-pre1 recommended
iPhoneClientViewController.mBasicHttpBinding_ISOAPBinding *myBinding = [SOAP BasicHttpBinding_ISOAPBinding];myBinding.logXMLInOut= true;SOAP_GetTitleForCode*parameters = [[SOAP_GetTitleForCode new] autorelease];parameters.code= [[NSStringalloc]initWithString:[numberTextField text]];BasicHttpBinding_ISOAPBindingResponse*response = [myBindingGetTitleForCodeUsingParameters:parameters];NSArray*responseBodyParts = response.bodyParts;for (id bodyPart in responseBodyParts){NSString *message = [bodyPartGetTitleForCodeResult];}Native ApplicationSOAP (WS-I)iPad/iPhone OS 4.3 (ObjC)Option 3:  wsdl2objc (http://code.google.com/p/wsdl2objc/)Version 0.7-pre1 recommended
Demo:  Consuming REST and SOAP based services on iPhone/iPadAll demos can be found on http://github.com/simonguest
“Great!  Is it a similar process on Android?”
Native ApplicationRESTMain.javaHttpClienthttpClient = new DefaultHttpClient();HttpGetrequest = new HttpGet("http://sguest01/TRMobile/Services/REST.svc/Sessions");HttpEntityrestEntity= httpClient.execute(request).getEntity();String restResult= new BufferedReader(new InputStreamReader(restEntity.getContent())).readLine();Android 2.3 (Java)Step 1:  UseHttpClient and HttpGet to makeconnection
Native ApplicationRESTMain.javaJSONArrayjArray = new JSONArray(restResult);for(inti=0; i<jArray.length(); i++){JSONObject session = jArray.getJSONObject(i);Log.i("Session retrieved", "Code: "+session.getString("Code")+" - "+session.getString("Title"));}Android 2.3 (Java)Step 2:  Useorg.jsonlibraries to deserialize JSON
Native ApplicationRESTAndroid 2.3 (Java)Step 3:  Optional – use GSON to supportserializationhttp://code.google.com/p/google-gson
“How about SOAP support on Android?  A similar story?”
wsimportUsage: wsimport [options] <WSDL_URI>where [options] include:  -b <path>                 specify jaxws/jaxb binding files or additional schemas                            (Each <path> must have its own -b)  -B<jaxbOption>            Pass this option to JAXB schema compiler  -catalog <file>           specify catalog file to resolve external entity references                            supports TR9401, XCatalog, and OASIS XML Catalog format.  -d <directory>            specify where to place generated output files  -extension                allow vendor extensions - functionality not specified                            by the specification.  Use of extensions may                            result in applications that are not portable or                            may not interoperate with other...Native ApplicationSOAP (WS-I)Android 2.3 (Java)Youwouldthinkthatwsimportshouldwork
Native ApplicationSOAP (WS-I)Android 2.3 (Java)http://ksoap2.sourceforge.net
Native ApplicationSOAP (WS-I)Android 2.3 (Java)http://code.google.com/p/ksoap2-android
Native ApplicationSOAP (WS-I)Android 2.3 (Java)maveninstallKSOAP2-Android
Main.javaString SOAP_ACTION = "http://tempuri.org/ISOAP/GetTitleForCode";String METHOD_NAME = "GetTitleForCode";String NAMESPACE = "http://tempuri.org/";String URL = "http://sguest01/TRMobile/Services/SOAP.svc";SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);request.addProperty("code","ARC310");SoapSerializationEnvelopeenv = new SoapSerializationEnvelope(SoapEnvelope.VER11);env.dotNet= true;env.setOutputSoapObject(request);HttpTransportSE transport = new HttpTransportSE(URL);transport.call(SOAP_ACTION, env);SoapPrimitivereturnedTitle = (SoapPrimitive)env.getResponse();Native ApplicationSOAP (WS-I)Android 2.3 (Java)
Demo:  Consuming REST and SOAP based services on AndroidAll demos can be found on http://github.com/simonguest
“How about Windows Azure?”
Blob StorageTable Storage
Most suitable for binary data (images, video, audio)
Container-based approach
8k metadata for each blobBlob StorageTable Storage
Blob StorageTable StorageMost suitable for structured data
Dynamic schema
Partitioning to enable scaleBlob StorageTable Storage
Blob StorageTable Storage
REST Endpoint:http://[account].blob.core.windows.netList, Create, and Delete Containers
List, Put, Get, Delete BlobsphotosBlob Storage
REST request for listing all containersREST Endpoint:http://[account].blob.core.windows.netGET http://iostest.blob.core.windows.net/?comp=list&include=metadatax-ms-date: Thu, 14 Apr 2011 20:30:00 GMTx-ms-version: 2009-09-19x-ms-blob-type: BlockBlobAuthorization: SharedKeyiostest:[ComputedHash]Blob Storage
…but how do I get that computed hash?REST Endpoint:http://[account].blob.core.windows.netTo calculate the computed hash:AccountKey: /9seXadQ9HwOpXUO1jKxFN8q…Request: GETx-ms-blob-type:BlockBlobx-ms-date:Thu, 14 Apr 2011 20:30:00 GMTx-ms-version:2009-09-19/iostest/comp:listinclude:metadataHash = HMACSHA256(UTF8Encode(Request), Base64Decode(AccountKey))photosBlob StorageAccount Key:  /9seXadQ9HwOpXUO1jKxFN8q…
GET http://iostest.blob.core.windows.net/?comp=list&include=metadatax-ms-date: Thu, 14 Apr 2011 20:30:00 GMTx-ms-version: 2009-09-19x-ms-blob-type: BlockBlobAuthorization: SharedKeyiostest:[ComputedHash]<?xml version="1.0" encoding="utf-8"?><EnumerationResultsAccountName="http://myaccount.blob.core.windows.net/">  <Prefix>c</Prefix>  <MaxResults>3</MaxResults>  <Containers>    <Container>      <Name>container1</Name>      <Url>http://iostest.blob.core.windows.net/photos</Url>      <Properties>        <Last-Modified>Sun, 14 Apr 2011 20:09:03 GMT</Last-Modified>     </Properties>    </Container>  </Containers>REST Endpoint:http://[account].blob.core.windows.netphotosBlob Storage
REST request (PUT) for adding a new photoREST Endpoint:http://[account].blob.core.windows.netPUT http://iostest.blob.core.windows.net/photos/myphoto.jpgx-ms-date: Thu, 14 Apr 2011 20:30:00 GMTx-ms-version: 2009-09-19x-ms-blob-type: BlockBlobAuthorization: SharedKeyiostest:[ComputedHash]{...binary representation of photo...}photosBlob Storage
http://www.zdnet.com/blog/microsoft/microsoft-releases-windows-azure-toolkit-for-apples-ios-android-version-slated-for-june/9386?tag=mantle_skin;content
Demo:  Windows Azure Toolkit for iOS(http://github.com/microsoft-dpe)All demos can be found on http://github.com/simonguest
AppRegistrationApple Push Notification Servicegateway.sandbox.push.apple.comNative ApplicationiPad/iPhone OS 4.3.1User Acceptance
Token LengthPayload LengthJSON formattedAppRegistrationSend Message Payload0032deviceToken034messageApple Push Notification Servicegateway.sandbox.push.apple.comNative ApplicationAzure Role optimized for backgroundtasksWorker RoleiPad/iPhone OS 4.3.1User Acceptance
AppRegistrationSend Message PayloadApple Push Notification Servicegateway.sandbox.push.apple.comNative ApplicationWorker RoleWindows Azure QueueiPad/iPhone OS 4.3.1User Acceptance
AppRegistrationSend Message PayloadApple Push Notification Servicegateway.sandbox.push.apple.comNative ApplicationWorker RoleRequestChangedSessionDetailsWindows Azure QueueiPad/iPhone OS 4.3.1Web RoleSessionUpdatedthrough WebUser AcceptanceUpdate QueueReceive Message, LaunchApp
Demo:  Apple Push Notifications from ASP.NET MVCAll demos can be found on http://github.com/simonguest
TakeawaysRecommendations:Use REST whenever you have a choice
Windows Azure Toolkit for iOS
Push notification to both iOS and Android possible using Windows Azure worker roles
Get a good development environment setup with Fiddler/CharlesWatch out for:Asyncvs Sync operation.  Both iOS and Android support sync, but don’t use it!
Very limited support for WS-* on native iOS and Android libraries
“Many of Microsoft’s server products also expose REST/SOAP.  What options exist for consuming these?”
“Let’s start with SharePoint Server”
Custom:  Native Client to Services or Mobile Web Middle TierPackaged:  Use AppStore/Market ClientiPad/iPhone OS 4.3Basic:  Use OOB Mobile RenderingSharePoint Server2007/2010Android 2.3
iPad/iPhone OS 4.3SharePoint Server2007/2010Android 2.3
iPad/iPhone OS 4.3SharePoint Server2007/2010Android 2.3
Basic:  Use OOB Mobile RenderingPros:  Easy to setup, works out of the box (with SPS2010)Cons:  Basic, non-native CSS. No support for browser-based NTLM from Android.  No caching of username/password credentials.iPad/iPhone OS 4.3SharePoint Server2007/2010Android 2.3
Custom:  Native Client to Services or Mobile Web Middle TierPackaged:  Use AppStore/Market ClientiPad/iPhone OS 4.3Basic:  Use OOB Mobile RenderingSharePoint Server2007/2010Android 2.3
iPad/iPhone OS 4.3SharePoint Server2007/2010Android 2.3http://itunes.apple.com/us/app/filamente-sharepoint-client
iPad/iPhone OS 4.3SharePoint Server2007/2010Android 2.3http://itunes.apple.com/us/app/shareplus-office-mobile-client
iPad/iPhone OS 4.3SharePoint Server2007/2010Android 2.3
Packaged:  Use AppStore/Market ClientPros:  Cheap ($10 – $20 per client).  Multiple authentication schemes.  Cached credentials.  Some offline/sync support.Cons:  All site content for mobile users.  Leaf nodes are mostly read only HTML (e.g. Announcements).  Most solutions are iPhone only (limited Android)iPad/iPhone OS 4.3SharePoint Server2007/2010Android 2.3
Custom:  Native Client to Services or Mobile Web Middle TierPackaged:  Use AppStore/Market ClientiPad/iPhone OS 4.3Basic:  Use OOB Mobile RenderingSharePoint Server2007/2010Android 2.3
SPWeb (2007)ODATA (2010)iPad/iPhone OS 4.3SharePoint Server2007/2010Android 2.3
SPWeb (2007)ODATA (2010)iPad/iPhone OS 4.3Mobile Web Rendering of informationuseful to Mobile clientsASP.NET MVCMiddle Tier(jQueryMobile)SharePoint Server2007/2010Android 2.3
SPWeb (2007)ODATA (2010)iPad/iPhone OS 4.3Mobile Web Rendering of informationuseful to Mobile clientsASP.NET MVCMiddle Tier(jQueryMobile)SharePoint Server2007/2010Android 2.3
SPWeb (2007)ODATA (2010)Custom:  Native Client or Middle Web TierPros:  Complete custom solution.  Can even hide fact that back end is SharePoint-based.Cons: More expensive option.  Limitations with SOAP client libraries for iPhone/Android.iPad/iPhone OS 4.3Mobile Web Rendering of informationuseful to Mobile clientsASP.NET MVCMiddle Tier(jQueryMobile)SharePoint Server2007/2010Android 2.3
“Do the same options apply to Dynamics CRM?”
Custom:  Native Client to Services or Mobile Web Middle TierPackaged:  Use AppStore/Market ClientiPad/iPhone OS 4.3Basic:  Use OOB Mobile RenderingDynamics CRM4.0/2011Android 2.3
iPad/iPhone OS 4.3Dynamics CRM4.0/2011Android 2.3
iPad/iPhone OS 4.3Dynamics CRM4.0/2011Android 2.3http://www.microsoft.com/downloads/en/details.aspx?FamilyID=f592ec6c-f412-4fd5-9a80-cd3bcbd26d8b
iPad/iPhone OS 4.3Dynamics CRM4.0/2011Android 2.3
iPad/iPhone OS 4.3Dynamics CRM4.0/2011Android 2.3
Basic:  Use OOB Mobile RenderingPros:  Easy to setup, works out of the box.  Forms based authentication works with non-NTLM browsers.Cons:  Basic, non-native CSS.  Controls a little awkward.  No user-agent detection. No caching of username/password credentials.iPad/iPhone OS 4.3Dynamics CRM4.0/2011Android 2.3
Custom:  Native Client to Services or Mobile Web Middle TierPackaged:  Use AppStore/Market ClientiPad/iPhone OS 4.3Basic:  Use OOB Mobile RenderingDynamics CRM4.0/2011Android 2.3
iPad/iPhone OS 4.3Dynamics CRM4.0/2011Android 2.3http://tendigits.com/mobileaccess.html
iPad/iPhone OS 4.3Dynamics CRM4.0/2011Android 2.3http://itunes.apple.com/us/app/cwr-mobile-crm-v4-2-for-microsoft
iPad/iPhone OS 4.3Optimized renderingDynamics CRM4.0/2011CWR/TenDigitsMiddle TierAndroid 2.3
Packaged:  Use AppStore/Market ClientPros:  Offline access.  Cached credentials.Cons:  All site content for mobile users. Most solutions are iPhone only (limited Android)iPad/iPhone OS 4.3Optimized renderingDynamics CRM4.0/2011CWR/TenDigitsMiddle TierAndroid 2.3
Custom:  Native Client to Services or Mobile Web Middle TierPackaged:  Use AppStore/Market ClientiPad/iPhone OS 4.3Basic:  Use OOB Mobile RenderingDynamics CRM4.0/2011Android 2.3
SOAP Web Services (4.0)REST Endpoint (2011)Updated Web Services (2011)ODATA (2011)iPad/iPhone OS 4.3Dynamics CRM4.0/2011Android 2.3
SOAP Web Services (4.0)REST Endpoint (2011)Updated Web Services (2011)ODATA (2011)iPad/iPhone OS 4.3Dynamics CRM4.0/2011Android 2.3Neudesic CRM Accelerator for iOS – http://neudesic.com
SOAP Web Services (4.0)REST Endpoint (2011)Updated Web Services (2011)ODATA (2011)iPad/iPhone OS 4.3Dynamics CRM4.0/2011Android 2.3
Custom:  Native Client or Middle Web TierPros:  Complete custom solution.  Can even hide fact that back end is Dynamics-based.Cons: Limitations with SOAP client libraries for iPhone/Android.  On CRM 2011, REST endpoint only provides limited CRUD.  Web Service (SOAP) endpoint uses WS-Security with Kerberos.SOAP Web Services (4.0)REST Endpoint (2011)Updated Web Services (2011)ODATA (2011)iPad/iPhone OS 4.3Dynamics CRM4.0/2011Android 2.3
TakeawaysRecommendations:Think about accessing SPS/CRM three ways
Basic Web
Packaged
Custom
Custom is (IMO) the most interesting to customersWatch out for:Mobile Web is very basic
Packaged solutions are good, but expose whole site
CRM 2011 REST interface only allows certain CRUD operations
CRM 2011 Web Service uses WS-Security w/ Kerberos tokens“You’ve mentioned ODATA many times.  What’s the story?”
My customers are using iPhone/Android, but I'm a Microsoft Guy.
XTDS ProtocoliPad/iPhone OS 4.3SQL ServerAndroid 2.3
Native ApplicationODataiPad/iPhone OS 4.3 (ObjC)WCFDataServiceSQL ServerEDMX
Native ApplicationODATA.svc public class ODATA : DataService<SessionModelContainer>{     public static void InitializeService(DataServiceConfigurationconfig){config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;}}ODATAiPad/iPhone OS 4.3 (ObjC)WCFDataServiceEDMXSQL Server
Native ApplicationODATAiPad/iPhone OS 4.3 (ObjC)WCFDataServiceEDMXSQL Serverhttp://interoperabilitybridges.com
Native Applicationodatagen./odatagen /uri=http://sguest01/TRMobile/Services/ODATA.svc /out=.-rw-r--r--  1 Simon  staff   5738 Feb 10 13:09 SessionModelContainer.h-rw-r--r--  1 Simon  staff  14735 Feb 10 13:09 SessionModelContainer.mODataiPad/iPhone OS 4.3 (ObjC)WCFDataServiceEDMXSQL Server
iPhoneClientViewController.m-(IBAction)callODATAService:(id)sender{SessionModelContainer *proxy = [[SessionModelContaineralloc] initWithUri:@"http://sguest01/TRMobile/Services/ODATA.svc" credential:nil];QueryOperationResponse *response = [proxy execute:@"Sessions"];NSMutableArray *sessions =[response getResult];	for (id session in sessions)	{NSLog(@"Session Code: %@",[session getCode]);NSLog(@"Session Title: %@", [session getTitle]);	}NSLog(@"Complete");}Native ApplicationODataiPad/iPhone OS 4.3 (ObjC)WCFDataServiceEDMXSQL Server
Native ApplicationODataAndroid 2.3WCFDataServiceEDMXSQL Server
Native ApplicationODATAAndroid 2.3WCFDataServiceEDMXSQL Serverhttp://code.google.com/p/odata4j
Native ApplicationODATAAndroid 2.3WCFDataServiceEDMXSQL Serverhttp://www.restlet.org
Note:  Must be done with the full JSE version of Restlet.jarlibraries (no generator in the Android version)!Native ApplicationProxy Generationlib Simon$ java -cp org.restlet.jar:org.restlet.ext.xml.jar:org.restlet.ext.atom.jar:org.restlet.ext.freemarker.jar:org.restlet.ext.odata.jar:org.freemarker.jar org.restlet.ext.odata.Generator http://sguest01/TRMobile/Services/ODATA.svc ~/Desktop/ARC310/restlet-proxy/---------------------------OData client code generator---------------------------...The source code has been generated in directory: /Users/Simon/Desktop/ARC310/restlet-proxyODATAAndroid 2.3WCFDataServiceEDMXSQL Server
Main.javaTrmobileWebModelsServiceservice = new TrmobileWebModelsService();Query<sessionmodel.Session> query = service.createSessionQuery("/Sessions?$filter=startswith(Code,'VIR')%20eq%20true");for (Session session : query){// do work}Native ApplicationODataAndroid 2.3WCFDataServiceEDMXSQL Server

More Related Content

My customers are using iPhone/Android, but I'm a Microsoft Guy.