Tilgang Native funksjoner med Xamarin.Forms

Accessing Native Funksjoner med Xamarin.Forms
15
Del
5
Del
Dette Cyber ​​mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.

1. Innstilling av Stage

Når det gjelder å skrive mobile applikasjoner, er det viktig å integrere med plattformspesifikke funksjoner som er tilgjengelige for deg når det er fornuftig. For eksempel, hvis du var å skrive en navigasjon app, er det fornuftig for deg å bruke geolocation funksjonene på enheten og plattform. Hvis du skulle lage en app for å hjelpe folk med en synshemning, ville du ønsker å integrere med noen tekst-til-tale-funksjoner som var tilgjengelig.

Det er utviklerne som kan dra nytte av disse funksjonene som gjør at seg selv og sine apps, bortsett fra resten. Disse enkle ting tar bare en vanlig app og gjøre det bra. Men hva skjer når du ønsker å dra nytte av disse funksjonene, men du har besluttet å vedta Xamarin.Forms som din cross-platform mekanisme av valget? Har du å gi opp håpet om disse funksjonene bare fordi du bestemt at appen må være plattformuavhengig, og du vil være i stand til å dele så mye logikk og brukergrensesnitt kode som mulig? Absolutt ikke.

Disse typer spørsmål uunngåelig føre til noen problemer for utviklere som tar i bruk nyere teknologier som Xamarin.Forms. Før utgivelsen av Xamarin.Forms, når du arbeidet direkte med Xamarin.iOS, Xamarin.Android og Windows Phone prosjektmaler, tilgang til disse typer funksjoner var ganske grei. Fra Xamarin perspektiv, hvis du kunne finne prøven C # -eller enda morsmål og SDK dokumentasjon-for en bestemt funksjon, kan du bare kartlegge koden til de innfødte konsepter, fordi Xamarin gjorde en fantastisk jobb med å oversette de samme innfødte begreper på disse plattformene i C # språkkonstruksjoner. Windows Phone-funksjonene var enda enklere fordi det var ingen oversettelse nødvendig. Alt du måtte gjøre var å lese dokumentasjonen.

Heldigvis for oss som utviklere, har Xamarin lagt mye tid og krefter på å utforme en mekanisme for oss å få tilgang til de samme funksjonene selv om vi velger å bruke sin Xamarin .Forms abstraksjonslag. Denne mekanismen er kjent som DependencyService.

2. DependencyService Oversikt

Ved første øyekast kan et navn som DependencyService virke litt skremmende. Det høres ut som noen fancy programmering terminologi som bare eliten få forstår. Hvis du noen gang har jobbet med Dependency Injection plakater (DI) eller Inversjon av Controller
(IOC) beholdere, bør du føle deg hjemme med DependencyService. Hvis du ikke har, jeg forsikrer deg om at det er et veldig enkelt konsept å forstå når du bryte det ned i sine enkelte komponenter.

Hva Er DependencyService?

På det mest grunnleggende, DependencyService er en klasse. Det er en klasse der det eneste formålet med tilværelsen er å tillate deg å registrere
en rekke klasser i hele søknaden din. Ved register, mener jeg ta noen klasse du har og gjøre det kjent for tjenesten. Når DependencyService vet om en klasse, kan det gå og hente en forekomst av denne klassen når det er nødvendig. Det er annet formål med den DependencyService. Hvis du på noe punkt i søknaden din, bestemmer du at du trenger en forekomst av en klasse som har blitt registrert i DependencyService, kan du be om eller få en forekomst av det.

Når du virkelig komme ned i nøtter og bolter av DependencyService, er dette en svært bred generalisering. Men fra en utviklers ståsted, er at nesten alt du trenger å vite. Men det er en annen konsept du må være klar over når du arbeider med DependencyService, grensesnitt
. Når det kommer til DependencyService og alt dette registrering og henting, er du vanligvis gjør det i forhold til grensesnitt. Dette betyr at når du registrerer en klasse, er du registrere den som en implementering av et bestemt grensesnitt. Og når du henter en klasse, er du faktisk spør DependencyService for en implementering av det grensesnittet. På dette punktet, trenger du egentlig ikke bryr seg hva implementeringen er, du bare vil ha en klasse som implementerer dette grensesnittet.

Hvordan virker den DependencyService arbeid?

Nå som du har en grunnleggende forståelse på et konseptuelt nivå av hva DependencyService er, la oss grave litt dypere og se hvordan det faktisk fungerer

For å bruke DependencyService, trenger du tre ting:.


    Grensesnitt:.
    Et grensesnitt er rett og slett en konstruksjon som definerer hva medlemmene må være til stede i alle klasser som velger å gjennomføre, eller er enig, til denne kontrakten

    Påmelding:
    Registrering er bare mekanismen for å la DependencyService vet at en bestemt klasse ønsker å være registrert og kunne hentes senere

    Sted:.
    Dette konseptet er ofte forbundet med et mønster i programvareutvikling kjenner som Tjeneste Locator
    mønster. Det betyr ganske enkelt at du kan gå til ett sted, den DependencyService, og be om noe av funksjonaliteten, en klasse, uten å direkte bruke et nytt eksempel.

    La oss grave i hver og en av disse begrepene i en litt mer detaljert.

    3. Grensesnitt

    grensesnitt er svært vanlige hendelser i de fleste objektorientert programmering (OOP) språk i disse dager. Ved hjelp av et grensesnitt lar deg definere en kontrakt som inneholder en rekke egenskaper, metoder, hendelser osv, som må gjennomføres av alle klasser som samtykker til at kontrakten.

    Her er et veldig enkelt eksempel på et grensesnitt . og en klasse som implementerer dette grensesnittet
    felles grensesnitt IFileGrabber {string GetFileContents (string fileUri);} public SimpleGrabber: IFileGrabber {public String GetFileContents (string fileUri) {return GetFileFromFileSystem (fileUri); }}

    Dette virker som et veldig enkelt eksempel, men det tjener formålet ganske godt. Den IFileGrabber grensesnittet definerer en enkelt metode, GetFileContents. Den SimpleGrabber klasse samtykker eller implementerer IFileGrabber grensesnitt, noe som betyr at det må inneholde en implementering for den ene metoden.

    Nå, i stedet for å måtte gjennomføre annen kode i søknaden direkte mot en konkret klasse, SimpleGrabber, du kan begynne å referere til IFileGrabber grensesnittet i stedet. Tenk deg at du har en annen klasse i søknaden som ser slik ut:
    public class DataRetriever {private IFileGrabber _fileGrabber; offentlig DataRetriever (IFileGrabber fileGrabber) {_fileGrabber = fileGrabber} public String GetFileContents (string fileUri) {return _fileGrabber.GetFileContents (fileUri); }}

    Ved hjelp av IFileGrabber grensesnitt i stedet for en konkret klasse, har du muligheten til å lage andre mekanismer for å hente filer fra forskjellige steder og DataRetriever klassen ville seg ikke. La oss anta at vi har en annen klasse som ser slik ut:
    public class NetworkGrabber: IFileGrabber {public String GetFileContents (string fileUri) {return GetFileFromNetwork (fileUri); }}

    Du har nå bryr seg mindre om hvordan klassen eller GetFileContents metoden er implementert, du bare vet at minst medlemmene som er definert i grensesnittet er til stede, og det betyr at du kan fortsette å kode bort ved hjelp av nettopp det grensesnitt som en referanse. Dette er en utrolig viktig begrep når det kommer til DependencyService.

    4. Registrering

    I forbindelse med DependencyService har Xamarin gjort prosessen med å registrere en klasse ganske enkel. Siden du allerede har definert grensesnitt og minst en klasse som implementerer den, kan du registrere den i DependencyService bruker en veldig enkel montering attributt.

    La oss fortsette å bruke eksempelet ovenfor og registrere SimpleGrabber klassen. Klassen definisjon ville nå ser omtrent slik ut: product: [forsamlingen: Xamarin.Forms.Dependency (typeof (SimpleFileGrabber))] //Enhver navneromdeklarasjon som kan existpublic SimpleGrabber: IFileGrabber {public String GetFileContents (string fileUri) {return GetFileFromFileSystem (fileUri); }}

    Alt du trenger å gjøre er å legge til forsamlingen referansen ovenfor klassen din definisjon og utenfor enhver navnedefinisjon som kan ligge i den filen også. Ved å gjøre dette enkel oppgave, vil du ha registrert den SimpleGrabber klassen som en implementering av IFileGrabber grensesnittet.

    Når du registrerer en klasse, at klassen må inneholde en parameterless konstruktør for at DependencyService på å bruke den. I mitt eksempel ovenfor, jeg har ikke definert en konstruktør så kompilatoren vil, som standard, skape en parameterless konstruktør for meg.

    5. Beliggenhet

    Den siste brikken i puslespillet er å få en forekomst av en registrert klasse. Dette er faktisk den enkleste delen av hele prosessen. Hvis du vil hente en forekomst av en registrert klasse, du bare bruke DependencyService klassen, og det er generisk Få < > () -metoden. Her er et enkelt eksempel:
    public class FileHelper {public String GetFileContents (string fileUri) {return DependencyService.Get < IFileGrabber > () GetFileContents (fileUri);. }}

    I dette tilfellet under kjøring, du ikke bryr seg hvor DependencyService blir betongen klasse som implementerer IFileGrabber grensesnittet. Alt du bryr deg om er at klassen implementerer IFileGrabber grensesnittet.

    6. Bruke DependencyService

    Nå som du har en konseptuell forståelse av hva DependencyService er og hvordan du bruker det, la oss lage et enkelt program for å sette den i bruk.

    For dette eksempelet, vil jeg være å bruke Xamarin Studio 5, men gjerne bruke Visual Studio 2013 hvis du ønsker det. Start med å lage en ny løsning. I Ny løsning
    dialogboksen under C #
    kategori til venstre, velg Mobile Apps
    prosjekt familien. På høyre side, velger du enten Blanke app (Xamarin.Forms Portable)
    eller Blank App (Xamarin.Forms delt)
    prosjektmalen. Koden og den resulterende programmet vil være den samme uavhengig av malen du velger.

    I dette eksempelet, vil jeg bruke Bærbar Class Library plakater (PCL) versjon av malen. Gi et navn til prosjektet. Jeg skal navngi løsningen og første prosjektet DependencyServiceSample
    . Deretter klikker du på OK
    knappen

    Denne prosessen vil opprette tre separate prosjekter:

    DependencyServiceSample Anmeldelser - Delt bibliotek (PCL)
    DependencyServiceSample.Android Anmeldelser - Android-prosjektet

    DependencyServiceSample.iOS Anmeldelser - iOS prosjektet

    Xamarin Studio støtter ikke oppretting Windows Phone-prosjekter. Hvis du bruker Visual Studio, vil denne prosessen opprette fire prosjekter. Det vil skape de ovennevnte tre prosjekter samt en Windows Phone prosjekt kalt DependencyServiceSample.WinPhone
    .

    I det delte biblioteket ( DependencyServiceSample
    ), opprette et nytt grensesnitt fil og gi den navnet ISampleInterface Hotell og gi den følgende gjennomføring:
    navnerom DependencyServiceSample {public interface ISampleInterface {string GetData (); }}

    Det er en standard utseende grensesnitt fil som definerer en enkel metode som heter
    GetData som vil returnere en streng. Nok en gang, er det viktig poeng å forstå at fra perspektivet til den delte kodefilen, betyr det seg ikke om hva gjennomføringen av dette grensesnittet ser ut. Det eneste som betyr noe er at uansett hva gjennomføringen er gitt for dette grensesnittet, har det en metode som heter GetData som vil returnere en streng.

    Neste, vi endre App.cs
    fil som skal brukes den DependencyService å få en forekomst av ISampleInterface å bruke i Xamarin.Forms app. Endre GetMainPage metoden for å se ut som følgende:.
    Public static Side GetMainPage () {return new ContentPage {Content = ny etikett {Text = DependencyService.Get < ISampleInterface > () GetData (), VerticalOptions = LayoutOptions.CenterAndExpand, HorizontalOptions = LayoutOptions.CenterAndExpand,}}; }

    Legg merke til at den eneste forskjellen er at teksten tilhører Label er endret til følgende linje:.
    DependencyService.Get < ISampleInterface > () GetData ()

    På denne måten bruker du DependencyService klasse og den generiske Get < > () metode for å hente uansett gjennomføring av ISampleInterface er implementert i plattformspesifikk prosjekt som kjører for øyeblikket. Når den forekomsten har blitt hentet frem, ringer du den GetData metode for å få tilbake en streng og sette Tekst eiendom Label.

    Det siste trinnet består av to deler (tre hvis du bruker Visual Studio). På dette punktet, vil du trenger for å implementere den ISampleInterface grensesnittet i alle de plattformspesifikke prosjekter i din løsning.

    La oss starte i DependencyServiceSample.Android
    søknad. Alt du trenger å gjøre er å opprette en ny klasse fil i prosjektet og gi den et navn du liker. Jeg har kalt meg Sample_Android
    . Erstatte standard gjennomføring med følgende:
    bruker System; hjelp DependencyServiceSample.Android [forsamlingen: Xamarin.Forms.Dependency (typeof (Sample_Android))] navnerom DependencyServiceSample.Android {public class Sample_Android: ISampleInterface {#region ISampleInterface implementering offentlig string GetData () {return "Jeg kom fra Android prosjektet!"; } #endregion}}

    Dette er en enkel klasse som implementerer ISampleInterface grensesnitt og gjennomføringen er å bare returnere en streng som sier at det kommer fra Android-prosjektet. Den eneste forskjellen er bruken av forsamlingen attributtet på toppen av filen som registre
    denne klassen med
    DependencyService slik at den kan hentes senere.

    Nå La oss skape en annen gjennomføring av dette grensesnittet i iOS-prosjektet. Opprett en ny klasse i iOS-prosjektet, navn det Sample_iOS
    , og erstatte standard gjennomføring med følgende:
    bruker System; hjelp DependencyServiceSample.iOS [forsamlingen: Xamarin.Forms.Dependency (typeof ( Sample_iOS))] navne DependencyServiceSample.iOS {public class Sample_iOS: ISampleInterface {#region ISampleInterface implementering offentlig string GetData () {return "Jeg kom fra iOS-prosjektet!"; } #endregion}}

    Gjennomføringen er akkurat det samme som Android-versjonen, bortsett fra at den returnerer en annen streng som sier at det kommer fra iOS-prosjektet denne gangen. Det siste trinnet er å kjøre programmet og se om du får det resultatet du forventer.

    Her er resultatet av iOS program kjører.

    Her er resultatet av Android applikasjon kjører.

    Som du kan se, begge programmene kjøres uten problemer. Ikke bare gjør de kjører, men de er vellykket kjører fra en delt Xamarin.Forms prosjekt som styrer brukergrensesnittet. Fra den brukergrensesnitt koden innen Xamarin.Forms, du er nå i stand til å dyppe direkte inn i plattformspesifikke prosjekter for å få tilgang til egen kode.

    7. Hvor Go From Here

    Nå som du har ferdigheter til å bruke DependencyService å få tilgang til lokale funksjonaliteten fra Xamarin.Forms, er det ingen begrensninger. Du kan fortsette å skrive enkle implementeringer som du har gjort i denne opplæringen, eller du kan begynne å trykke inn flere interessante trekk ved plattformene.

    En av de mest interessante ressurser til å ta en titt på for å integrere i din DependencyService er den Oppskrifter delen av Xamarin nettstedet. Her finner du plattformspesifikke implementeringer for å få tilgang til en rekke funksjoner including:


    Networking

    Audio

    Video

    Geolocation

    Accelerometers

    All av disse funksjonene er til din disposisjon når det gjelder Xamarin.Forms applikasjoner. Med DependencyService, kan disse funksjonene bli innkalt på et øyeblikks varsel.

    Konklusjon

    Nå som du vet og forstår DependencyService, trenger du ikke lenger å føle seg skremt når du trenger tilgang til plattformspesifikk funksjoner fra en Xamarin.Forms søknad. Du har nå verktøy som lar deg koble deg til de fantastiske innfødte funksjoner på enhetene som til slutt vil tillate deg å skille dine apps fra resten i app butikker

    Neste trinn:. Se Course

    Hvis du ønsker å lære mer om Xamarin, så sjekk ut vår kurs Bygge Multi-Platform Apps med C # i Xamarin.

    I kurset vil du lære hvordan du oppretter en kryssplattform søknad fra en enkelt kodebasen som vil kjøre på tre distinkt forskjellige plattformer: iOS, Android og Windows Phone 8. Tror det kan ikke være gjort? På bare en liten stund vil du gjøre det selv. La oss få til å fungere.

    Du kan ta med en gang med en helt gratis
    14 dagers prøveversjon av en Tuts + abonnement. Ta en titt på våre abonnement alternativer å komme i gang, eller, hvis du er like interessert i dette kurset, kan du kjøpe det individuelt for $ 15! Her er en forhåndsvisning for å komme i gang: