I den här handledningen kommer vi att lansera i en serie som tillåter två mobila enheter att överföra information med en "Bump" -behållning. Den här appen kräver en kombination av programmering på klientsidan och server-sida, och vi täcker alla steg för att koda båda aspekterna. Härifrån kommer den här appen med kärlek att kallas "Thump".
Huvudfunktionen för vår "Thump" -app kommer att vara tvärkommunikation av data via en mellanliggande webbserver. Handlingen med att dumpa två mobila enheter tillsammans kommer att visas för slutanvändaren som lokal enhet för enhetskommunikation, när webbservern faktiskt har behandlat datautbytet. Medan idén om lokal enhetskommunikation kan verka som den mest praktiska tillvägagångssätten i början, är den i praktiken fylld med plattformshängare och säkerhetsmardrömmar! Så istället använder vi en Rails-app som finns på Heroku-plattformen för att hantera mottagande av meddelanden från våra enheter och leverera meddelandet till dess avsedda mottagare.
Så här fungerar det är ganska intressant. Servern kommer i huvudsak att göra en uppskattning av vem den mest sannolika mottagaren av ett meddelande kommer att baseras på en kombination av GPS-koordinater och en servertidsstämpel. Genom att samtidigt (eller nära samtidigt) dumpa våra två enheter tillsammans skickar vi latitud och longitud information till servern så att det kan avgöra att våra två lokalt liknande enheter försökte kommunicera med varandra i något nära realtid. Enkelt, rätt?
Medan den här metoden inte är perfekt, ger det en statistisk sannolikhet för att våra två enheter hade för avsikt att kommunicera med varandra. Ett av de stora problemen med en tjänst som denna (och vår app är inget undantag) skulle vara en händelse som ett branschhow eller någonstans där massor av människor kanske försöker "kasta" alla på samma gång. Även om det kan vara osannolikt kan det eventuellt tillåta överföring av ett meddelande till en oavsiktlig mottagare.
Vi börjar med att skapa en del grundläggande funktioner för vår mobilapp. I vår main.lua-fil lägger vi till några viktiga kodlinjer för att komma igång.
lokala ui = kräver ('ui') system.setLocationAccuracy (10) local isSimulator = "simulator" == system.getInfo ("miljö") lokal deviceId = system.getInfo ("deviceID")
Den första raden kräver att vi inkluderar UI-biblioteket som starkt hjälper till att skapa inbyggda komponenter i Corona. Denna kod kommer att ingå i en källkods zip-fil som bifogas denna Mobiletuts + handledning. Därefter kommer vi att ange en tröskel för platsnoggrannhet för våra enheter. Vi behöver enheten för att försöka sitt bästa för att få oss till en plats inom en feltolerans på högst 10 meter. Om avståndet är större än detta riskerar vi att hämta oavsiktliga dumpningar från enheter som inte finns i närheten. För att göra det enklare när vi utvecklar, upptäcker vi om vår app körs i Corona-simulatorn eller på enheten. Detta kommer att vara att i första hand förhindra udda beteenden från funktioner som inte stöds av simulatorn. Slutligen måste vi identifiera en enhet med ett unikt värde. En deviceID så här förhindrar att servern försöker leverera ett meddelande tillbaka till enheten som skickade den istället för den avsedda mottagaren.
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
Därefter skapar vi en bakgrundsrektangel som ger vår app en fin, vit bakgrund. De nästa 3 raderna kommer att visa en logotyp i skärmens övre mittpunkt.
local titleLabel = ui.newLabel bounds = 15, 5, 290, 55, text = "Meddelande", typsnitt = native.systemFontBold, textColor = 12, 12, 100, 255, storlek = 24, align = " center " titleLabel: setReferencePoint (display.TopCenterReferencePoint) titleLabel.y = logo.y + 60
Ovanstående kod använder användargränssnittets tillgång till de inbyggda bildskärmskomponenterna för enheten. I det här fallet visar vi bara ordet "Meddelande" i en mörkblå nyans. Omfattningen av den här artikeln omfattar inte alla invecklingar i det ursprungliga visningsbiblioteket, så jag föreslår att du tittar på Corona-webbplatsen om du är ny på SDK. Y-koordinaterna ställs in till 60 pixlar större än positionen för logotypen som vi just visat.
if isSimulator then - Simulator (simulera textField-området) textField = display.newRect (20, titleLabel.y + 60, 280, 30) textField: setFillColor (200, 200, 200) annat lokalt funktionsfältHandlare (händelse) om skickat "== event.phase) sedan native.setKeyboardFocus (nil) slutet slutet textField = native.newTextField (20, titleLabel.y + 60, 280, 30, fieldHandler) sluttextField: setReferencePoint (display.TopCenterReferencePoint) textField.x = display.contentWidth / 2 textField.y = titleLabel.y + 60
En av begränsningarna i simulatorn är att den inte kan visa alla inbyggda komponenter på mobila enheter korrekt. För att förhindra att det kastar fel upptäcker vi om vi kör appen i simulatorn och visar en grå ruta istället för ett inmatningsfält. Detta kommer att hjälpa oss med vår positionering av elementen. Om appen inte körs i simulatorn kommer vi att visa en inbyggd "textField" -komponent som tillåter slutanvändaren att skriva ett meddelande. Fälthanterarens återuppringning är nödvändig för att detektera en fas av "inlämnad", eller med andra ord, användaren trycker på "return" -knappen. Genom att fånga den här händelsen kan vi gömma tangentbordet efter att användaren har slutat skriva sitt meddelande.
local removeKeyboard = funktion (händelse) - Dölj tangentbordet native.setKeyboardFocus (nil) slutet bg: addEventListener ("tryck", ta bort Keyboard)
Som en extra användargränssnitt bonus kan vi lägga till en händelse lyssnare till vår vita bakgrund som väntar på en "tap" händelse. På det här sättet, om användaren knackar på skärmen utanför tangentbordsområdet, tar det bort fokus från det och försvår det.
local latitudeText = "" local longitudeText = "" if isSimulator then local alert = native.showAlert ("Error", "GPS inte tillgänglig i Simulator") annars lokal platsHandler = funktion (händelse) latitudeText = string.format ('% .8f ', event.latitude) longitudeText = string.format ('% .8f ', event.longitude) avsluta Runtime: addEventListener ("location", locationHandler) avslutas
Nu på de bra sakerna! Först upptäcker vi om vi kör i simulatorn och helt enkelt visar ett felmeddelande om att GPS inte är tillgänglig. När vi kör på enheten skapar vi en runtime-lyssnare som kontinuerligt tar tag i vår plats från enhetens platstjänst och kallar vår locationHandler-metod med dessa data. Vi konverterar det här för att ha 8 decimaler av noggrannhet som borde vara mer än noggranna för våra ändamål.
local getThump = funktion (händelse) om event.isShake == true then local alert = native.showAlert ("Thump!", "Plats:"? latitudeText? ","? longitudeText? "\ r \ nMessage:"? textField. text, "OK") system.vibrate () slutet slutet Runtime: addEventListener ("accelerometer", getThump)
Slutligen kommer vi att skapa en annan runtime händelse lyssnare som tar data från enhetens accelerometer och skickar den till vår metod getThump. Inuti denna metod kommer vi att upptäcka om händelsen var en "shake" -händelse. En skaknings händelse är ett annat namn för vad som kommer att hända när vi "suger" två enheter tillsammans i hopp om att sända ett meddelande. Eftersom vi inte har skrivit vår serverkomponent ännu, visar vi bara dessa data i en varningsruta för att visa att vår app arbetar hittills. För att testa detta kan du helt enkelt skriva ett meddelande och ge enheten som kör appen en skaka.
Håll kontakten med del II i den här serien nästa vecka, där vi kommer att ta itu med serverfunktionen i Rails on Heroku!