I denne opplæringen skal vi starte i en serie som lar to mobile enheter overføre informasjon med en "Bump" -bevegelse. Denne appen krever en kombinasjon av programmering på klientsiden og server-side, og vi dekker alle trinnene for å kode begge sider. Fra nå av blir denne appen kjærlig referert til som "Thump".
Hovedfunksjonen til vår "Thump" -app vil være kryss-enhetens kommunikasjon av data via en mellomliggende webserver. Handlingen med å dumpe to mobile enheter sammen vil vise sluttbrukeren som lokal enhet til enhetskommunikasjon, når faktisk webserveren har behandlet datautvekslingen. Mens ideen om lokal enhetskommunikasjon kan virke som den mest praktiske tilnærmingen til å begynne med, er den i praksis fylt med kryssplattformoppheng og sikkerhetsmardrærmer! Så i stedet vil vi bruke en Rails app hosted på Heroku plattformen for å håndtere mottak av meldinger fra våre enheter og levere meldingen til den tiltenkte mottakeren.
Slik fungerer dette er ganske interessant. Serveren vil i hovedsak gjøre en estimering av hvem den mest sannsynlige mottakeren av en melding vil være basert på en kombinasjon av GPS koordinater og en server tidsstempel. Ved samtidig (eller i nærheten av) å dumpe våre to enheter sammen, sender vi breddegrad og lengdegrad informasjon til serveren, slik at det kan avgjøre at våre to lokasjonslignende enheter forsøkte å kommunisere med hverandre i noe nær sanntid. Enkel, rett?
Selv om denne metoden ikke er perfekt, gir det en statistisk sannsynlighet for at våre to enheter hadde til hensikt å kommunisere med hverandre. En av de store problemene med en tjeneste som dette (og vår app er ikke noe unntak) ville være en hendelse som et messeshow eller et sted hvor mange mennesker kan prøve å "thump" alt på samme tid. Selv om det kan være usannsynlig, kan det potensielt tillate overføring av en melding til en utilsiktet mottaker.
Vi starter med å opprette en grunnleggende funksjonalitet for mobilappen vår. I vår main.lua-fil legger vi til noen viktige kodelinjer for å komme i gang.
lokal ui = krever ('ui') system.setLocationAccuracy (10) local isSimulator = "simulator" == system.getInfo ("miljø") lokal deviceId = system.getInfo ("deviceID")
Den første linjen krever at vi inkluderer UI-biblioteket som i stor grad hjelper til med opprettelsen av innfødte komponenter i Corona. Denne koden vil bli inkludert i en kildekode zip-fil vedlagt denne Mobiletuts + opplæringen. Deretter skal vi angi en nøyaktighetsterskel for stedet for enhetene våre. Vi trenger enheten til å prøve sitt beste for å få oss til et sted innenfor en feiltoleranse på ikke mer enn 10 meter. Hvis avstanden er større enn dette, løper vi risikoen for å hente ut uhell fra enheter som ikke er i nærheten. For å gjøre det enklere når vi utvikler, vil vi oppdage om appen vår kjører i Corona-simulatoren eller på enheten. Dette vil være å primært forhindre ulik oppførsel fra funksjoner som ikke støttes av simulatoren. Til slutt må vi identifisere en enhet med en unik verdi. En deviceID som dette vil forhindre at serveren prøver å levere en melding tilbake til enheten som sendte den i stedet for den tiltenkte mottakeren.
lokal bg = display.newRect (0, 0, display.contentWidth, display.contentHeight) lokal logo = display.newImageRect ("logo.png", 172, 107) logo.x = display.contentWidth / 2 logo.y = ( display.contentHeight / 2) - 150
Deretter oppretter vi et bakgrunnsrektangel som gir vår app en fin, hvit bakgrunn. De neste 3 linjene vil vise en logo i den øvre delen av skjermen.
lokal titleLabel = ui.newLabel bounds = 15, 5, 290, 55, tekst = "Melding", font = native.systemFontBold, textColor = 12, 12, 100, 255, størrelse = 24, align = " center " titleLabel: setReferencePoint (display.TopCenterReferencePoint) titleLabel.y = logo.y + 60
Ovennevnte kode bruker brukerveiledningens tilgang til de opprinnelige skjermkomponentene for enheten. I dette tilfellet viser vi bare ordet "Melding" i en mørk blå nyanse. Omfanget av denne artikkelen inkluderer ikke alle intrikatene til det opprinnelige skjermbiblioteket, så jeg foreslår at du tar en titt på Corona-siden hvis du er ny i SDK. Y-koordinatene blir satt til 60 piksler større enn plasseringen av logoen vi nettopp har vist.
if isSimulator then - Simulator (simulere tekstField-området) textField = display.newRect (20, titleLabel.y + 60, 280, 30) textField: setFillColor (200, 200, 200) annet lokalt funksjonsfeltHandler sendt inn = = event.phase) deretter native.setKeyboardFocus (nil) ende ende textField = native.newTextField (20, titleLabel.y + 60, 280, 30, fieldHandler) ende textField: setReferencePoint (display.TopCenterReferencePoint) textField.x = display.contentWidth / 2 textField.y = titleLabel.y + 60
En av begrensningene i simulatoren er at den ikke kan vise alle innbyggede komponenter av mobile enheter på riktig måte. For å forhindre at det kaster feil, oppdager vi om vi kjører appen i simulatoren og viser en grå boks i stedet for et inntastingsfelt. Dette vil hjelpe oss med vår posisjonering av elementene. Hvis appen ikke kjører i simulatoren, skal vi vise en innfødt "textField" -komponent som gjør at sluttbrukeren kan skrive en melding. FieldHandler tilbakeringing er nødvendig for å oppdage for en fase av "innsendt", eller med andre ord, brukeren trykker på "return" -knappen. Ved å fange dette arrangementet kan vi gjemme tastaturet etter at brukeren er ferdig med å skrive inn meldingen.
lokal removeKeyboard = funksjon (hendelse) - Skjul tastaturet native.setKeyboardFocus (nil) end bg: addEventListener ("trykk", fjern Keyboard)
Som en ekstra brukergrensesnittbonus kan vi legge til en hendelseslytter til vår hvite bakgrunn som venter på en "trykk" -hendelse. På denne måten, hvis brukeren tapper skjermen utenfor tastaturområdet, vil den fjerne fokus fra det og få det til å forsvinne.
lokal latitudeText = "" lokal longitudeText = "" hvis isSimulator deretter lokal alarm = native.showAlert ("Feil", "GPS ikke tilgjengelig i Simulator") ellers lokal stedHandler = funksjon (hendelse) latitudeText = string.format ('% .8f ', event.latitude) longitudeText = string.format ('% .8f ', event.longitude) avslutte Runtime: addEventListener ("location", locationHandler) avslutte
Nå på de gode greiene! Først oppdager vi om vi kjører i simulatoren og bare viser en feilmelding om at GPS ikke er tilgjengelig. Når vi kjører på enheten, oppretter vi en runtime lytter som kontinuerlig tar tak i posisjonen vår fra enhetens plasseringstjeneste og kaller vår locationHandler-metode med disse dataene. Vi konverterer dette ned til å ha 8 desimaler med nøyaktighet som burde være mer enn nøyaktige for vårt formål.
lokal getThump = funksjon (event) hvis event.isShake == true then local alert = native.showAlert ("Thump!", "Location:"? latitudeText? ","? longitudeText? "\ r \ nMessage:"? textField. tekst, "OK") system.vibrate () slutten Runtime: addEventListener ("accelerometer", getThump)
Til slutt vil vi opprette en annen runtime hendelse lytter som tar data fra enhetens akselerometer og sender den til metoden getThump. Innenfor denne metoden vil vi oppdage om hendelsen var en "shake" -hendelse. En shake-hendelse er et annet navn for hva som vil skje når vi "taster" to enheter sammen i håp om å sende en melding. Siden vi ikke har skrevet vår serverkomponent ennå, vil vi bare vise disse dataene i en varselboks for å vise at vår app jobber så langt. For å teste dette, kan du bare skrive en melding og gi enheten som kjører appen en riste.
Hold deg oppdatert på del II av denne serien neste uke, hvor vi skal takle server-sidefunksjonaliteten i Rails on Heroku!