Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • Savjet
  • Razvoj poslužiteljskog dijela mobilnih aplikacija. Razvoj poslužiteljske strane mobilnih aplikacija Kako funkcionira poslužiteljska strana aplikacija

Razvoj poslužiteljskog dijela mobilnih aplikacija. Razvoj poslužiteljske strane mobilnih aplikacija Kako funkcionira poslužiteljska strana aplikacija

488 Dio IV. Ajax u primjerima

botova i poziva poslužitelj koji će dinamički stvoriti podatke o odgovoru na temelju poslane vrijednosti niza upita. Prvi parametar funkcije LoaciXMLXSLTDoc() je URL PHP stranice koja generira XML dokument u kombinaciji s nizom upita generiranim referencom na vrijednosti polja HTML obrasca O. Drugi parametar je naziv XSLT datoteka koja se koristi u transformaciji XML podataka. Treći parametar koji zahtijeva funkcija LoadXMLXSLTDoc() je ID elementa div u koji bi se trebali smjestiti rezultati pretraživanja. Identifikator je naziv niza izlaznog elementa, a ne referenca objekta; u ovom slučaju, niz "rezultati" se koristi kao identifikator.

U sljedećoj fazi koristimo DOM metode za dodavanje indikatorske slike na web stranicu. Stvoren je element slike ©, a atribut izvora slike postavljen je na O. Ovaj kreirani element dodaje se u rezultat div ©. Na ovaj način, kada se naša funkcija pozove iz obrasca za obradu događaja onsubmit, slikovna datoteka se postavlja na stranicu. Općenito, važno je da korisnik pruži vizualnu povratnu informaciju - poruku ili sliku - koja pokazuje da je obrada u tijeku. Ovo će spriječiti korisnika da opetovano klikne gumb za prijavu hendikepa, misleći da se ništa ne događa (zapamtite, Ajax proces je "tihi" proces).

Posljednji korak je pozivanje funkcije LoadXMLXSLTDoc()®, koja pokreće proces slanja informacija na poslužitelj. Funkcija LoadXMLXSLTDoc(), opisana u odjeljku 12.4, upravlja pozivom objektu ContentLoader(), koji zahtijeva dokumente od poslužitelja. Određivanjem izlazne pozicije kao parametra (umjesto tvrdog kodiranja vrijednosti u funkciji LoadXMLXSLTDoc()), možemo ponovno upotrijebiti danu funkciju na jednoj stranici bez potrebe za dodavanjem više procedura ili if izjava za odvajanje funkcionalnosti. Stoga preusmjeravamo rezultate različitih upita za pretraživanje na različite dijelove stranice. Međutim, prije nego što sve to učinimo, pogledajmo kako stvoriti XML i XSLT dokumente na poslužitelju.

12.3. Kod aplikacijskog poslužitelja: RHP

U U ovom dijelu ćemo stvoriti dinamiku XML dokument koji koristi PHP, popularni skriptni jezik otvorenog koda (kao što znate, Ajax okvir je kompatibilan sa bilo kojim jezikom ili platformom na strani poslužitelja). XML dokument se generira dinamički iz skupa rezultata vraćenog kao odgovor na upit klijenta prema bazi podataka. Osim toga, pokazat ćemo kako stvoriti statički XSLT dokument koji se nalazi na poslužitelju i dohvaća se svaki put kada se zatraži dinamička datoteka. Oba navedena dokumenta nezavisno se vraćaju klijentu kada se objekt ContentLoader zatraži u dva odvojena zahtjeva (Ispis 12.7). XSLT kod transformira naš dinamički XML dokument na strani klijenta i proizvodi HTML tablicu koja se prikazuje korisniku.

Poglavlje 12 Pretraživanje uživo pomoću XSLT 489

12.3.1. Stvaranje XML dokumenta

Budući da koristimo XSLT, potreban nam je strukturirani XML dokument koji je jednostavan zapis informacija kako bi XSL datoteka mogla izvršiti standardnu ​​transformaciju. U ovom projektu stvorit ćemo dinamičku XML datoteku kada klijent zatraži PHP datoteku.

Razvoj XML strukture

Prije nego počnemo stvarati XML datoteku, moramo izraditi predložak za nju. Ovaj uzorak trebao bi odražavati strukturu podataka vraćenih pretraživanjem. U odabranoj izjavi o problemu (telefonskom imeniku) vratit ćemo naziv tvrtke, ime kontakta, državu i broj telefona. Ispis 12.3 prikazuje osnovni XML predložak koji sadrži četiri polja.

Listing 12.3. Osnovna XML datoteka

Naziv tvrtke Ime kontakta Ime države Broj telefona

Prvi element je imenik. Sljedeći je element unosa koji sadrži podelemente sa svim detaljima koji su povezani sa svim kontakt brojevima koji se nalaze u zahtjevu. Ako imamo pet rezultata, bit će pet ulaznih elemenata u XML dokumentu. Naziv tvrtke pojavljuje se u elementu tvrtke. Osim toga, dodali smo ime kontakta, naziv zemlje i broj telefona. Nismo ograničeni samo na navedena polja; Ovisno o tome koje informacije treba prikazati, polja se mogu dodavati ili uklanjati.

Ako se ne pronađu nikakvi rezultati, umjesto prikazivanja poruke upozorenja, možete stvoriti element koji prikazuje ove informacije korisniku. STO će nam olakšati vraćanje rezultata korisniku i neće zahtijevati dodatni kod u klijentskom dijelu aplikacije. Kôd u ispisu 12.4 u biti je isti kao kod u ispisu 12.3, ali ovaj put unosimo tekst u XML elemente koje želimo pokazati korisniku kako bismo označili da nisu pronađeni rezultati.

Listing 12.4. XML datoteka bez rezultata

Nema rezultata

// O Umjesto naziva tvrtke, prikazuje se "Nema rezultata". N/A

490 Dio IV. Ajax u primjerima

// © "N/A" prikazuje se umjesto preostalih polja

N/A

N/A

Pomoću ovog koda korisniku prikazujemo jedan redak koji pokazuje da traženi podaci nisu dostupni. Oznaka tvrtke O prikazuje informacije koje pokazuju da nema rezultata. U drugim deskriptorima, 0 govori korisniku da nema informacija. Ako ne želimo prikazati tekst "N/A" ("nije dostupno"), umjesto toga možemo dodati neprekinuti razmak koji će nam omogućiti prikaz ćelija tablice. Da uopće nismo dodali nikakve informacije, ćelije se ne bi pojavile u tablici.

Kao što vidite, XML format ima vrlo jednostavnu strukturu. Da je ova XML datoteka statična, korisniku bi bilo relativno lako dodati novog pretplatnika u datoteku. Budući da se stvara dinamički, trebat će nam petlja koja stvara XML dokument iz skupa rezultata.

Stvaranje dinamičkog XML dokumenta

Kao i uvijek, XML dokument stvaramo na poslužitelju. Pridržavajući se politike korištenja različitih jezika na strani poslužitelja u primjerima, kôd na strani poslužitelja za ovo poglavlje napisan je u PHP-u. Podsjetimo vas još jednom da se Ajax infrastruktura može kreirati korištenjem bilo kojeg poslužiteljskog jezika, a opisat ćemo samo sam princip implementacije poslužiteljskog koda, ne ulazeći u detalje. Dakle, ispis 12.5 prikazuje kod za poslužiteljsku stranu aplikacije. Kod uzima parametar niza upita i generira višestruke rezultate upita baze podataka. Zatim iteriramo kroz skup rezultata, stvarajući element u XML datoteci prema predlošku prikazanom u ispisu 12.4 za svaki telefonski broj vraćen kao odgovor na upit.

Listing 12.5. Skripta phoneXML.php: generiranje XML dokumenta na poslužitelju

// O Deklarirajte MIME vrstu zaglavlje ("Tip sadržaja: tekst/xml"); jeka("\n");

// © Povežite se s bazom podataka

$db = mysql__connect("localhost", "ajax", "action"); rnysql_select_db("ajax",$db);

$result = mysql_query("SELECT *

FROM Contacts WHERE ContactName poput "%". // © Ispunite zahtjev

$_GET["q"] ."%"",$db); ?>

// O Provjerite rezultate

if ($myrow = mysgl_fetch_array($result)) ( do (

// © Prođite kroz više rezultata

Poglavlje 12. Pretraživanje uživo pomoću XSLT 491

001">

)while ($myrow - mysql_fetch_array($result)); )drugo(

12.3.2. Stvaranje XSLT dokumenta

Koristeći XSLT, naša XML datoteka može se transformirati u prekrasnu HTML tablicu s nekoliko redaka koda. XSLT dokument omogućuje podudaranje uzoraka ako je potrebno za prikaz podataka u bilo kojem potrebnom formatu. U podudaranju predložaka, struktura predloška se koristi za prikaz podataka. U isto vrijeme prolazimo kroz čvorove stabla

492 Dio IV. Ajax u primjerima

wa izvor koristeći XSLT. XSLT dokument uzima strukturiranu XML datoteku i pretvara je u format koji je lako pregledavati, ažurirati i mijenjati. U našem slučaju XSLT dokument definiran je statički.

XSLT struktura

XSLT transformacija sadrži pravila za prevođenje izvornog stabla u odredišno stablo. Cijeli XSLT proces odnosi se na usklađivanje s predloškom strukture. Kada elementi izvornog stabla odgovaraju navedenoj strukturi, ciljno stablo se stvara prema predlošku dokumenta.

Struktura konačnog stabla ne mora biti povezana sa strukturom izvornog. Stoga se izvorna XML datoteka može pretvoriti u bilo koji potrebni format. Nije potrebno koristiti samo tablični prikaz skupa podataka.

XSLT transformacija naziva se listom stilova jer definira stil rezultirajućeg stabla. Stilska tablica sadrži pravila predloška koja se sastoje od dva dijela. Prvi dio je predložak strukture s kojim se uspoređuju čvorovi izvornog stabla. Nakon pronalaska podudaranja, XSLT procesor koristi drugi dio - predložak koji sadrži deskriptore za izgradnju izvornog stabla.

Stvaranje XSLT dokumenta

Generiranje XSLT transformacije za ovaj projekt je relativno jednostavno. Budući da ćemo dobiti stol, nije potrebno uparivanje otmjenih uzoraka; jednostavno ćemo sekvencijalno proći kroz sve čvorove elemenata izvornog stabla. U nastavku ćemo dizajnirati predložak koji generira HTML tablicu s četiri stupca. Odgovarajuća XSLT datoteka za ovaj projekt prikazana je u ispisu 12.6.

i Listing 12.6. XSLT datoteka

"ISO-8859-l"?>

// O Postavite XML verziju i kodiranje

// © Postavite XSLT imenski prostor"http://www.w3.org/1999/XSL/Transform">

// © Postavite pravila predloška

// O Dodaj element tablice

// © Stvorite redak naslova

Poglavlje 12 Pretraživanje uživo pomoću XSLT 493

// 0 Redovno prođite kroz elemente telefonskog imenika

select="phonebook/entry"> // © Format izlaz

Društvo Kontakt Zemlja Telefon

Kada kreirate XSLT transformaciju, morate navesti XML kodiranje i verziju te navesti XSLT imenski prostor. Prostor imena definira pravila i specifikacije s kojima dokument mora biti u skladu. Elementi u prostoru imena XML prepoznaju se u izvornom dokumentu, ali se ne prepoznaju u dokumentu rezultata. Prefiks xsl koristi se za definiranje svih naših elemenata u prostoru imena XSLT. Zatim možete uspostaviti pravilo uzorka - potražite strukturu / © koja odgovara cijelom dokumentu.

Sada možemo početi stvarati predložak tablice koji prikazuje naše rezultate. Dodajemo tablicu deskriptora O, koja preslikava identifikator u tablicu. Nakon toga se unosi redak zaglavlja tablice © koji sadrži nazive stupaca koji korisniku pokazuju koji se podaci nalaze u tablici.

Sekvencijalnim prolaskom kroz mnoge čvorove izvornog stabla dobivamo preostale retke tablice. U ovom slučaju koristi se for-each petlja © koja u procesu obrade zapisa proizvodi čvorove koji se nalaze u imeniku/upisu.

Dok prelazimo stablom dokumenta, moramo odabrati vrijednosti stupaca. Za odabir vrijednosti iz čvorova koristi se operator value-of, koji izdvaja vrijednost XML elementa i dodaje ga u izlazni tok transformacije. Za navođenje XML elementa čiji tekst želimo ekstrahirati, koristimo atribut select uz naziv elementa. Nakon što generirate svoju XSLT datoteku i izradite kod za dinamičko generiranje XML dokumenta, možete dovršiti izradu JavaScript koda i vidjeti kako kombiniranje XSLT transformacije sa strukturiranom XML datotekom daje tablicu jednostavnu za pregled.

Sljedeći korak vraća nas na stranu klijenta, dohvaćajući datoteke koje su upravo stvorene pomoću HTTP odgovora.

Značajan dio moderne aplikacije za mobilne platforme(iOS, Android itd.) radi u tandemu s poslužiteljem. Aplikacija sa zastarjelim podacima gubi svoju korisnost. Stoga je važno osigurati da se podaci od poslužitelja do uređaja stalno ažuriraju. Ovo se odnosi na izvanmrežne aplikacije koje bi trebale raditi bez interneta. Za potpuno online aplikacije koje ne rade (ili su beskorisne) bez interneta (na primjer, Foursquare, Facebook) postoje specifičnosti koje su izvan opsega ovog članka.

Na primjeru jedne od naših offline aplikacija, reći ću vam koje smo pristupe koristili za sinkronizaciju podataka. U prvim verzijama razvili smo se jednostavne algoritme, a kasnije smo ih s iskustvom unaprijedili. U članku je prikazan sličan slijed - od jednostavnih očitih praksi do složenijih.

Treba pojasniti da se u članku govori o prijenosu podataka u samo jednom smjeru: od poslužitelja do uređaja. Ovdje je poslužitelj izvor podataka.

Opće odredbe za sve pristupe

Na primjer, razmotrit ćemo prijenos imenika posuđa ("posuđe") na uređaj. Pretpostavit ćemo da uređaj postavlja zahtjev na url “/service/dishes/update”, razmjena se odvija preko http protokola u JSON formatu ( www.json.org). Poslužitelj ima tablicu “jela” s poljima: id (identifikator zapisa), naziv (naziv jela), ažurirano (trenutak ažuriranja jela, bolje je odmah podržati vremensku zonu, “GGGG-MM-DDThh: mm:ssTZD”, na primjer, “1997 -07-16T19:20:30+01:00”), is_deleted (znak izbrisanog zapisa).

Napomena o prisutnosti posljednjeg polja. Prema zadanim postavkama, njegova je vrijednost 0. U aplikaciji u kojoj su entiteti sinkronizirani između klijenta i poslužitelja, ne preporučuje se fizičko brisanje podataka s poslužitelja (kako bi se izbjegle pogreške). Stoga su izbrisana jela postavljena na is_deleted = 1. Kada entitet s is_deleted = 1 stigne na uređaj, briše se s uređaja.

S bilo kojim pristupom, o kojem će biti riječi u nastavku, poslužitelj vraća JSON niz objekata (koji može biti prazan) uređajima:

[
(iskaznica: ,Ime: , ažurirano: ,je izbrisano: },…
]

Primjer odgovora poslužitelja:

[
(id: 5625, ime: "Kruh", ažurirano: "2013-01-06 06:23:12", je Izbrisano: 0),
(id: 23,name: "Kuhani griz",updated: "2013-02-01 14:44:21",isDeleted: 0),(

naziv: "Riblja čorba",

ažurirano: "2013-08-02 07:05:19",

Načela za ažuriranje podataka na uređaju

  1. Ako stigne element koji je na uređaju i isDeleted = 0, tada se ažurira
  2. Ako stigne element koji nije na uređaju i isDeleted = 0, tada se dodaje
  3. Ako je stigao element koji se nalazi na uređaju i isDeleted = 1, tada se briše
  4. Ako stigne element koji nije na uređaju i isDeleted = 1, tada se ništa ne radi

Pristup 1: Sve je uvijek sinkronizirano

Ovo je najjednostavniji način. Uređaj od poslužitelja traži popis jela, a poslužitelj šalje cijeli popis. Svaki put lista dolazi puna. Nije sortirano.

Primjer zahtjeva: null ili “()”

Prednosti:

  • Logika na serveru je jednostavna - uvijek sve poklanjamo
  • Logika na uređaju je jednostavna – uvijek sve prebrišemo

Mane:

  • ako često tražite popis (svakih 10 minuta), tada će biti puno internetskog prometa
  • ako rijetko tražite popis (jednom dnevno), tada će relevantnost podataka biti narušena

Područje primjene:

  • za aplikacije s malim prometom
  • prijenos podataka koji se vrlo rijetko mijenjaju (popis gradova, kategorija)
  • prijenos postavki aplikacije
  • na početku projekta za prvi prototip mobilne aplikacije

Pristup 2: Sinkroniziran je samo ažurirani

Uređaj zahtijeva popis jela ažuriran od prethodne sinkronizacije. Popis dolazi poredan prema "ažurirano" uzlaznim redoslijedom (neobavezno, ali praktično). Uređaj pohranjuje “updated” vrijednost za posljednje poslano jelo i na sljedeći zahtjev šalje je poslužitelju u parametru “lastUpdated”. Poslužitelj šalje popis jela koja su novija od “lastUpdated” (updated > lastUpdated). Na prvom zahtjevu poslužitelju, "lastUpdated" = null.

Primjer upita: (zadnje ažurirano: “2013-01-01 00:00:00”)

U dijagramu: "last_updated" je vrijednost koja je pohranjena na uređaju. Obično se na uređaju stvara zasebna tablica za pohranjivanje ovih "last_updated" vrijednosti za svaki entitet (jela, gradovi, organizacije itd.)

Ovaj pristup je pogodan za sinkronizaciju jednostavnih linearnih popisa čija su pravila za dolazak na uređaj ista za sve uređaje. Za selektivniju sinkronizaciju pogledajte “Pristup 5: Sinkronizacija uz znanje o tome što je već na uređaju.”

Obično ovaj pristup pokriva većinu potreba. Na uređaj dolaze samo novi podaci, možete se sinkronizirati barem svake minute - promet će biti mali. Međutim, postoje problemi povezani s ograničenjima mobilnih uređaja. To su memorija i procesor.

Pristup 3: Sinkronizacija u komadima

Mobilni uređaji imaju malo RAM-a. Ako u direktoriju ima 3000 jela, tada raščlanjivanje velikog json niza s poslužitelja u objekte na uređaju može uzrokovati nedostatak memorije. U tom slučaju aplikacija će se ili srušiti ili neće spremiti ovih 3000 jela. Ali čak i ako je uređaj uspio probaviti takav niz, izvedba aplikacije tijekom sinkronizacije u pozadini bit će niska (kašnjenja sučelja, neglatko pomicanje itd.) Stoga je potrebno zatražiti popis u manjim dijelovima.

Da bi to učinio, uređaj šalje drugi parametar ("količinu") koji određuje veličinu porcije. Popis se šalje obavezno razvrstan prema polju "ažurirano" uzlaznim redoslijedom. Uređaj, slično prethodnom pristupu, pamti “updated” vrijednost posljednjeg poslanog entiteta i prenosi je u polje “lastUpdated”. Ako je poslužitelj poslao točno isti broj entiteta, tada uređaj nastavlja sinkronizaciju i ponovno postavlja zahtjev, ali s ažuriranim "lastUpdated". Ako je poslužitelj poslao manje entiteta, to znači da više nema novih podataka i sinkronizacija završava.

U dijagramu: “last_updated” i “amount” su vrijednosti koje su pohranjene u Mobilna aplikacija. “last_item” – zadnji entitet (jelo) poslan sa servera. Sljedeći popis će biti zatražen noviji od ove vrijednosti.

Primjer zahtjeva: ( lastUpdated: “2013-01-01 00:00:00”, iznos: 100 )

Prednosti:

  • Uređaj prima onoliko podataka koliko može obraditi odjednom. Veličina porcije određena je praktičnim testovima. Jednostavni entiteti mogu se sinkronizirati 1000 odjednom. No također se događa da se entiteti s velikim brojem polja i složenom logikom obrade pohrane obično sinkroniziraju s najviše 5 komada.

Mane:

  • Ako postoji 250 jela s istim ažuriranjem, tada s količinom = 100 zadnjih 150 neće stići na uređaje. Ova situacija je sasvim stvarna i opisana je u sljedećem pristupu.

Pristup 4: Ispravna sinkronizacija u komadima

U prethodnom pristupu, moguće je da ako postoji 250 jela u tablici s istim "ažuriranim" (na primjer, "2013-01-10 12:34:56"), a veličina porcije je 100, tada samo doći će prvih 100 zapisa. Preostalih 150 bit će odsječeno zbog teškog uvjeta (ažurirano > lastUpdated). Zašto će se to dogoditi? Prilikom postavljanja upita za prvih 100 zapisa, lastUpdated bit će postavljen na “2013-01-10 12:34:56”, a sljedeći će upit imati uvjet (updated > “2013-01-10 12:34:56”). Čak ni ublažavanje uvjeta (ažurirano >= “2013-01-10 12:34:56”) neće pomoći, jer će uređaj tada beskrajno zahtijevati prvih 100 zapisa.

Situacija s istim "ažuriranim" nije tako rijetka. Na primjer, prilikom uvoza podataka iz tekstualne datoteke, polje "ažurirano" postavljeno je na NOW(). Uvoz datoteke s tisućama redaka može potrajati manje od sekunde. Također se može dogoditi da će cijeli imenik imati isti "ažuriran".

Da biste to popravili, trebate koristiti neku vrstu polja jela koje bi bilo jedinstveno barem u jednom trenutku ("ažurirano"). Polje “id” je jedinstveno u cijeloj tablici, pa ga dodatno koristite u sinkronizaciji.

Dakle, implementacija ovog pristupa izgleda ovako. Poslužitelj vraća popis poredan prema “updated” i “id”, a uređaji traže podatke pomoću “lastUpdated” i novog parametra “lastId”. Na poslužitelju je uvjet uzorkovanja kompliciraniji: ((ažurirano > lastUpdated) ILI (ažurirano = lastUpdated i id > lastId)).

U dijagramu: “last_updated”, “last_id” i “amount” su vrijednosti koje su pohranjene u mobilnoj aplikaciji. “last_item” – zadnji entitet (jelo) poslan sa servera. Sljedeći popis će biti zatražen noviji od ove vrijednosti.

Pristup 5: Sinkronizacija sa znanjem o tome što je već na uređaju

Prethodni pristupi ne uzimaju u obzir činjenicu da poslužitelj zapravo ne zna koliko su uspješno podaci spremljeni na uređaj. Uređaj možda jednostavno nije spremio neke od podataka zbog neobjašnjivih grešaka. Stoga bi bilo lijepo dobiti potvrdu od uređaja da su sva (ili ne sva) jela spremljena.

Osim toga, korisnik aplikacije može prilagoditi aplikaciju tako da mu treba samo dio podataka. Na primjer, korisnik želi sinkronizirati jela iz samo 2 grada od 10. Gore opisane sinkronizacije to ne mogu postići.

Ideja pristupa je sljedeća. Poslužitelj pohranjuje informacije o tome koja se jela nalaze na uređaju (u zasebnoj tablici “stored_item_list”). To bi jednostavno mogao biti popis parova "id – ažurirano". Ova tablica pohranjuje sve popise “id – ažurirano” parova jela za sve uređaje.

Uređaj šalje podatke o dostupnim jelima na uređaju (popis parova „id – ažurirano“) na poslužitelj zajedno sa zahtjevom za sinkronizaciju. Prilikom postavljanja zahtjeva poslužitelj provjerava koje posuđe treba biti na uređaju i koje je trenutno dostupno. Razlika se zatim šalje u uređaj.

Kako poslužitelj određuje koje posuđe treba biti na uređaju? U najjednostavnijem slučaju, poslužitelj postavlja zahtjev koji će vratiti popis parova “id – ažurirano” svih jela (na primjer, SELECT id, ažurirano FROM jela). U dijagramu se to radi metodom "WhatShouldBeOnDeviceMethod()". Ovo je nedostatak pristupa - poslužitelj mora izračunati (ponekad postavljajući teške SQL upite) što bi trebalo biti na uređaju.

Kako poslužitelj određuje koje se posuđe nalazi na uređaju? Upituje tablicu "stored_item_list" za ovaj uređaj i prima popis parova "id – ažurirano".

Analizom ova dva popisa poslužitelj odlučuje što treba poslati na uređaj, a što treba izbrisati. U dijagramu je to "delta_item_list". Stoga u zahtjevu nema “lastUpdated” i “lastId”; njihov zadatak obavljaju parovi “id – updated”.

Kako poslužitelj zna za dostupna jela na uređaju? U zahtjevu prema serveru dodan je novi parametar “items” koji sadrži popis id jela koja su poslana na uređaj u zadnjoj sinkronizaciji (“device_last_stored_item_list”). Naravno, možete poslati popis id-ova svih jela koja se nalaze na uređaju bez kompliciranja algoritma. Ali ako na uređaju ima 3000 jela i sva se šalju svaki put, tada će troškovi prometa biti vrlo visoki. U velikoj većini sinkronizacija, parametar "items" bit će prazan.

Poslužitelj mora stalno ažurirati svoj “stored_item_list” podacima koji dolaze s uređaja u parametru “items”.

Treba implementirati mehanizam za brisanje podataka poslužitelja u stored_item_list. Na primjer, nakon ponovne instalacije aplikacije na uređaju, poslužitelj će pretpostaviti da su podaci na uređaju još uvijek aktualni. Stoga, kada instalirate aplikaciju, uređaj mora na neki način obavijestiti poslužitelj kako bi izbrisao stored_item_list za ovaj uređaj. U našoj aplikaciji šaljemo dodatni parametar "clearCache" = 1 u ovom slučaju.

Zaključak

Sažeta tablica karakteristika ovih pristupa:

Pristup Količina prometa(5 – veliko) Složenost razvoja(5 – visoko) Upotreba memorije uređaja(5 – visoko) Ispravnost podataka na uređaju(5 – visoko) Možete odabrati određeni uređaj
1 Uvijek je sve sinkronizirano 5 1 5 5 Ne
2 Sinkronizira se samo ažurirani sadržaj 1 2 5 3 Ne
3 Sinkronizacija u komadima 1 3 1 3 Ne
4 Ispravna sinkronizacija u komadima 1 3 1 3 Ne
5 Sinkronizacija sa znanjem o tome što je već na uređaju 2 5 2 5 Da

“Ispravnost podataka uređaja” je vjerojatnost da uređaj ima sve podatke koje šalje poslužitelj. U slučaju pristupa br. 1 i br. 5, postoji 100% pouzdanost da uređaj ima sve podatke koji su mu potrebni. U drugim slučajevima nema takvog jamstva. To ne znači da se drugi pristupi ne mogu koristiti. Samo što ako se neki od podataka na uređaju izgube, onda to neće biti moguće popraviti s poslužitelja (a kamoli saznati o tome na strani poslužitelja).

Možda će uz neograničene internetske tarife i besplatni wifi problem ograničavanja prometa koji generira mobilna aplikacija postati manje relevantan. Ali za sada moramo pribjegavati svakojakim trikovima kako bismo došli do "pametnijih" pristupa koji mogu smanjiti mrežne troškove i povećati performanse aplikacija. Ovo ne funkcionira uvijek. Ponekad "što jednostavnije to bolje", ovisi o situaciji. Nadam se da ćete u ovom članku pronaći pristup koji će vam biti koristan.

Postoji iznenađujuće malo opisa sinkronizacije poslužitelja i Mobilni uredaji. Štoviše, postoje mnoge aplikacije koje rade prema ovoj shemi. Par linkova za zainteresirane.

SIGURNOSNE KOPIJE

Zašto su vam potrebne sigurnosne kopije na mobilnoj platformi?

Stručnjaci znaju koliko su mobilne aplikacije na 1C ponekad nepouzdane: pogreške se mogu pojaviti u bilo kojem trenutku, zbog čega će baze podataka korisnika jednostavno biti uništene. Istodobno, suočeni smo s nepouzdanošću samih uređaja: mogu se pokvariti, izgubiti, ukrasti, a korisnici žele sačuvati svoje podatke. A do verzije 8.3.9 nismo imali platformski mehanizam za spremanje sigurnosnih kopija.

Budući da korisnici prije nisu imali gumb "spremi kopiju", programeri aplikacije Boss morali su sami napraviti sigurnosne kopije. Kako smo to uspjeli?

Same podatke baze podataka spremamo u XML obliku.

Preporučljivo je ponuditi korisniku nekoliko opcija za pohranu kopija - prije svega, to je prikladno za klijente, mogu odabrati najbolju opciju za sebe: prenijeti u oblak, poslati na svoju e-poštu, spremiti na svoj uređaj.

Tako se programeri dodatno osiguravaju. Ako nešto pođe po zlu i mehanizam za stvaranje kopija na Google Driveu ili Yandex Driveu iznenada se pokvari, uvijek možete reći korisniku da se programer trenutno bavi pogreškom, ali u međuvremenu on može spremiti podatke na alternativni način . A korisnici su zadovoljni jer mogu biti sigurni u svoje podatke.

Obavezno moraju se usredotočiti na usluge u oblaku, jer ako je uređaj izgubljen ili pokvaren, a korisnik je spremio kopiju na isti uređaj, tada će podaci biti izgubljeni.

Također i mi Svakako podsjećamo korisnika na potrebu izrade sigurnosnih kopija.

Kako spremiti kopije ako se konfiguracija promijeni?

Kada govorimo o masovnom rješenju, aplikaciji koja se stalno mijenja, razvija i poboljšava, moramo voditi računa o ponašanju korisnika. Korisnik će možda htjeti vratiti sigurnosnu kopiju spremljenu u staroj verziji aplikacije koja nije sadržavala nikakve pojedinosti. I onda se postavlja zadatak: pročitati podatke, pa ispuniti podatke po logici ažuriranja sa stare verzije aplikacije. Kako to učiniti? Osim podataka, spremite i samu strukturu podataka, kako biste je kasnije znali čitati.

Postoji nekoliko opcija za pohranjivanje ove strukture podataka, uključujući pohranjivanje u samoj konfiguraciji. To jest, kada se izda svaka nova verzija, sačuvajte strukturu metapodataka prethodne verzije u rasporedu u konfiguraciji.

Ne treba zaboraviti da u mobilnoj aplikaciji konfiguracija ne treba samo rasti, moramo cijeniti prostor u njoj, moramo je učiniti što kompaktnijom. No, aplikacija se razvija i takvih će izgleda biti mnogo, a s vremenom će ih biti sve više.

Stoga je u slučaju mobilne aplikacije poželjniji drugi način - spremite strukturu metapodataka izravno u podatkovnu datoteku. Kao rezultat toga dobivamo ovu datoteku u koju prvo spremamo neke pomoćne podatke - konfiguracijsku verziju, konfiguracijski dijagram, granice niza, a zatim bilježimo same korisničke podatke u XML formatu. Štoviše, u odjeljku "Pomoćni podaci" datoteke možete pohraniti i druge važne podatke koji iz nekog razloga nisu mogli biti upisani u XML.

Uzimamo podatkovnu shemu koju smo spremili u datoteku i na temelju nje gradimo XDTO paket za čitanje datoteke. Sličan objekt kreiramo u bazi podataka, ispunimo ga, izvršimo dodatnu obradu prilikom ažuriranja i spremamo gotov objekt u bazu podataka.

Dolje na slici možete vidjeti savjet kako lijepo napisati XDTO model konfiguracijskih podataka. Tvrtka koja je izdala aplikaciju Boss eksperimentirala je s tim, pronašla nekoliko načina, ali se odlučila za ovu opciju za snimanje sheme metapodataka. Kada se otvori sama podatkovna datoteka, možete vidjeti uobičajeni strukturirani XML, čitljiv, koji navodi sve metapodatke aplikacije.

// Snimanje konfiguracijskog dijagrama ModelXDTO = FactoryXDTO.ExportModelXDTO("http://v8.1c.ru/8.1/data/enterprise/current-config"); FactoryXDTO.WriteXML(UploadFile, ModelXDTO); // Čitanje konfiguracijske sheme ModelXDTO = FactoryXDTO.ReadXML(ReadXML, FactoryXDTO.Type("http://v8.1c.ru/8.1/xdto","Model")); FactoryUnload = Nova tvornicaXDTO(ModelXDTO);

Kako biste zaštitili korisnika, morate ga ponovno pitati treba li vratiti sigurnosnu kopiju. Možda je samo eksperimentirao i pritiskao sve tipke u aplikaciji :) I sada može izgubiti trenutne podatke. Stoga pri izvođenju potencijalno “opasnih” radnji uvijek razjašnjavamo želi li on to doista i kako bi se to trebalo dogoditi. Korisnik mora biti svjestan svojih postupaka.

Mora postojati mehanizam za izradu sigurnosnih kopija kada govorimo o offline rješenju, kada korisnik ima sve podatke pohranjene isključivo na mobilnom uređaju: korisnik može izgubiti svoj uređaj, a onda će biti izgubljeni i podaci. I, čini se, ako aplikacija ne radi autonomno, već je povezana sa središnjim poslužiteljem, tada korisnik ne bi trebao imati takav problem, jer ako se uređaj izgubi, spojit će se na poslužitelj, primiti sve svoje podatke opet sa servera i sve će biti ok.

Međutim, korisnici sigurnosne kopije ne koriste uvijek na način na koji to od njih očekujemo :) Vrlo često ih koriste za jednostavno “vratljenje” podataka. Ovo je doista vrlo čudno ponašanje, ali korisnici mobilnih aplikacija su previše lijeni da shvate gdje su mogli pogriješiti prilikom unosa podataka, te jednostavno vrate podatke i ponovno unesu podatke za tekući dan. Nakon analize statistike rada s aplikacijom Boss, uvidjeli smo da je to normalna praksa i da je ovakvo ponašanje korisnika češće nego što smo mogli zamisliti.

A ako koristite sinkronizaciju s drugim uređajima, onda morate to riješiti. Ovdje postoji nekoliko rješenja:

  • prekinuti vezu s poslužiteljem, navodeći da će podaci na njemu ostati kakvi su bili, a kopija će se vratiti samo na korisnikov uređaj;
  • Korisniku je bolje dopustiti da vrati kopiju na svim uređajima odjednom, prethodno propisavši takve mehanizme.

Ovdje postoji još jedna stvar. Do sada smo sami spremali sigurnosne kopije, kontrolirali cijeli proces i hvatali radnje korisnika izravno u kodu kada je kliknuo gumb "spremi kopiju". Sve se to može naknadno obraditi. U platformi 8.3.9 postalo je moguće spremati sigurnosne kopije pomoću alata platforme. A korisnik to radi bez našeg znanja. Ako se koristi sinkronizacija sa središnjom bazom podataka, tada se takav scenarij mora obraditi. Moramo nekako saznati na našem poslužitelju da je korisnik vratio prethodno spremljenu kopiju i moramo mu dati neko rješenje. Ne možemo si priuštiti da podaci ne budu sinkronizirani.

ZAMJENICE

Kada govorimo o privatnom rješenju na mobilnoj platformi, obično imamo kupca koji, primjerice, želi koristiti mobilnu platformu za svoje prodajne agente i razmjenjivati ​​podatke sa središnjom bazom podataka. Ovdje je sve jednostavno: jedna baza podataka, nekoliko uređaja, postavite poslužitelj, postavite vezu s njim. Dakle, problem razmjene između uređaja je jednostavno riješen.

Ali ako govorimo o masovnoj aplikaciji, gdje postoji mnogo baza podataka, od kojih svaka ima puno korisnika, situacija postaje kompliciranija. Korisnici su preuzeli aplikaciju s marketa i žele se međusobno sinkronizirati. Na primjer, muž je skinuo aplikaciju za računovodstvo osobnih financija, a sada želi da se i njegova supruga poveže i rade zajedno u istoj aplikaciji. Mnogo je korisnika, aplikacija se razvija, raste i postoji potreba za velikim, velikim brojem baza podataka. Kako sve to organizirati? Korisnici neće osobno kontaktirati programere kako bi za njih izradili zasebnu bazu podataka i omogućili sinkronizaciju. Žele pritisnuti gumb i sve odmah proradi. U istom trenutku.

Kako nastaviti? Tu u pomoć dolazi mehanizam za razdvajanje podataka. Omogućuje organiziranje jedne baze podataka, gdje postoji jedna zajednička konfiguracija, ali u isto vrijeme, neograničen broj korisničkih baza podataka pohranjen je unutar jedne zajedničke baze podataka.

Najbolji dio je što korisnike možete dodavati dinamički, programski, bez našeg sudjelovanja. U stvarnosti korisnici jednostavno kliknu na gumb "registracija na poslužitelju" i sve se događa samo od sebe: na poslužitelju se stvara osobna baza podataka i on odmah može početi raditi u njoj.

Kako to učiniti? Prvo i najjednostavnije rješenje je napisati vlastitu bazu poslužitelja s ovim mehanizmom. Kada je naša tvrtka krenula s izradom aplikacije Boss i razmjene u njoj, u prvoj smo verziji napravili upravo to: napisali smo serversku bazu podataka s mehanizmom dijeljenja podataka. Sve je radilo, pogotovo jer nije bilo ništa komplicirano - separator baze je uobičajeni atribut.

Ali onda smo shvatili da ponovno izmišljamo kotač :) Zapravo, postoji gotovo rješenje, a ono već uzima u obzir točke o kojima još nismo ni razmišljali. Ovo je 1C:Fresh.

Ovdje se razmišlja o skalabilnosti usluge: što učiniti kada ima puno podataka i baza podataka, kako rasti uz sve to. Ovdje postoji točka o stvaranju sigurnosnih kopija područja podataka: to jest, ne izrađujemo samo sigurnosnu kopiju jedne opće baze podataka, izrađujemo kopije određenog korisnika. Štoviše, ondje je mehanizam takav da se kopije rade samo kada su stvarno potrebne. Ako se korisnik nije ulogirao u bazu tjedan dana, tada mu ne radimo kopije, jer se tu ništa nije promijenilo. Još jedna značajka Fresha je da usluga implementira mehanizam za smanjenje opterećenja na poslužitelju, a to je vrlo važno kada imate mnogo baza podataka.

Općenito, Fresh je nešto novo i zanimljivo za nas. Polako pokušavamo to shvatiti, ali većinom smo samo zadovoljni kako funkcionira.

Prijenos podataka. Kako to implementirati za razmjenu između uređaja

Platforma nudi dva mehanizma - SOAP i http usluge. Ovdje postoje nijanse o tome kako pristupiti tim uslugama kada je uključen mehanizam za odvajanje podataka. Konkretno, trebate dodati parametre koji označavaju određeni broj područja kojem pristupate, jer platforma ne može odrediti kojoj bazi podataka pristupiti s korisničkim imenom. Osim toga, isti korisnik može raditi s više baza podataka unutar jedne baze (vidi sliku).

Što se tiče usluga, aplikacija Boss provodi trenutnu razmjenu: jedan korisnik unosi podatke, a drugi ih prima. Korisnici mobilnih aplikacija navikli su da se sve događa trenutno, pa smo razmišljali koju je uslugu bolje koristiti - SOAP ili http. Brzina veze odigrala je ključnu ulogu. U httpu je brzina povezivanja puno veća, a pri spajanju preko SOAP-a dobivamo opis usluge koji je težak i dugo se učitava. Platforma ima način pohranjivanja opisa usluge, ali zbog parametara koje dinamički dodajemo, ne možemo koristiti WS poveznice. Osim toga, prema našem iskustvu, pristup http uslugama je praktičniji i fleksibilniji.

Dakle, naš cilj je implementirati razmjenu u stvarnom vremenu. Odnosno, trudimo se da ne bude tako da korisnik mora negdje otići, kliknuti na neki gumb, razmišljati koliko su mu podaci ažurni, treba li ih ažurirati... Podaci korisnika trebaju uvijek biti gore. -do danas. Toliko su navikli na to kada rade u instant messengerima - jedan je poslao podatke, drugi ih je odmah primio. Sve se događa trenutno. Isto vrijedi i za aplikacije vezane uz poslovanje: jedan prodavač je završio prodaju, drugi mora odmah vidjeti trenutno stanje bez poduzimanja bilo kakve radnje.

Zato aplikacija Boss koristi pozadinske poslove za razmjene. Nakon svakog unosa podataka u bazu, pokreće se pozadinski posao koji inicira razmjenu. Prvi dio je slanje podataka na poslužitelj. Tada bi drugi uređaji trebali znati da postoje novi podaci. Za to koristimo PUSH obavijesti. Ova shema već radi i radi prilično brzo.

Ali htjeli smo to učiniti još brže, jer radimo u stvarnom vremenu i u pravilu nemamo puno podataka. Imamo mali XML, ali u isto vrijeme šaljemo poruku s tim podacima s prvog uređaja na poslužitelj, poslužitelj šalje PUSH drugom uređaju, a zatim drugi uređaj nakon što primi PUSH inicira razmjenu sa svoje strane , kontaktira poslužitelj i traži podatke, prima te podatke i zatim šalje odgovor da su podaci primljeni. Dugo je to vrijeme, ali bilo je vrlo malo podataka.

Pitali smo se kako bi se taj proces mogao ubrzati.

Da bismo to učinili, otkrili smo što PUSH sadrži i kako se također može koristiti. Ispostavilo se da PUSH sadrži polja kao što su podaci i tekst. U dokumentaciji za iOS i Android navedena su ograničenja veličine PUSH poruka, no nama se to nije učinilo dovoljno i htjeli smo to sami shvatiti iskustvom. A provjerili smo da je za iOS zbroj dopuštenih znakova 981, a za Android 3832 znaka. U potonjem slučaju, ograničenje se može koristiti; jedan ili više objekata baze podataka mogu se ugurati u takav volumen. A onda su programeri tvrtke malo promijenili shemu. Kada nema puno podataka, šaljemo ih s jednog uređaja, primamo na server, tamo pakiramo u PUSH i šaljemo direktno na drugi uređaj. Shema je postala kraća, a razmjena se počela odvijati još brže :)

Važna točka u korištenju PUSH-a je da ne iritiramo korisnike.

Vrlo je lako riješiti se ove situacije: samo nemojte korisniku slati puno PUSH poruka :) Ako trenutno radi u aplikaciji, možete slati puno poruka. Kada je platforma pokrenuta, korisnik ne vidi PUSH, sve se događa automatski. Ali kada je aplikacija zatvorena, klijent ima mnogo nepročitanih poruka. Stoga se ni pod kojim okolnostima ne smije poslati sljedeći PUSH dok se od uređaja ne dobije odgovor da je aplikacija pokrenuta, aktivna i da je prethodni PUSH već obrađen.

Još jedna nijansa razmjene je rad putem weba. Moramo koristiti asinkroniju što je više moguće. Ne možete raditi kao i obično - napisali ste kod - pozvali funkciju - pričekali da se izvrši - dobili odgovor - i sve je u redu. Ako radite putem weba, i dalje ćete se susresti s određenim ograničenjima, na primjer, nestabilnim internetom, vremenskim ograničenjima pri izvođenju dugotrajnih operacija. Stoga je potrebno unaprijed razmisliti o arhitekturi.

Na primjeru registracije uređaja pogledajmo što se događa u aplikaciji kada se korisnik želi registrirati. Neko vrijeme vodi evidenciju, unio je dosta podataka, ali onda želi da i prodavač radi s tom bazom podataka. Korisnik klikne na gumb "registracija". U početku je sve bilo vrlo jednostavno: uzeli smo njegove podatke, snimili ih na server i, molim vas, možete raditi i povezivati ​​korisnike. Ali onda smo naišli na situaciju u kojoj su baze podataka nekih korisnika na njihovim uređajima već značajno porasle do trenutka kada su se registrirali. I ova shema više nije funkcionirala, jer... Dok se cijela baza podataka snimala na poslužitelju, veza je istekla ili je internet jednostavno nestao. Stoga smo jedan sinkroni poziv zamijenili s mnogo kratkih. Danas se podaci dijele, a ne prenose svi odjednom. Ni u kojem slučaju ne čekamo dok poslužitelj obrađuje i upisuje podatke. Poslali smo podatke, dobili odgovor da su podaci primljeni i prekinuli vezu. Povremeno je potrebno izvršiti prozivanje poslužitelja kako bi saznali što se tamo događa i kako, au međuvremenu se na poslužitelju odvija pozadinski posao koji bilježi primljene podatke. To rezultira velikim brojem poziva poslužitelja, ali imamo jamstvo da će sve proći u redu. A niti vremensko ograničenje niti nestabilnost interneta neće vas spriječiti da učitate sve podatke na poslužitelj.

NADOPUNE

Razmjena između uređaja s različitim verzijama aplikacije

Budući da govorimo o masovnoj aplikaciji koja je puštena na tržišta, moramo uzeti u obzir neke značajke procesa ažuriranja i razmjene podataka.

Ako ste izdali aplikaciju za jedno poduzeće i odlučite je ažurirati, tada obično jednostavno date naredbu tako da svi zaposlenici jednoglasno instaliraju novu aplikaciju. To se ne može učiniti s korisnicima koji su aplikaciju preuzeli s marketa. Ne možete im uopće govoriti što da rade. Na primjer, rade u aplikaciji i ne žele je ažurirati ni sada ni ikada. Nemaju auto-update, pa je sasvim česta situacija kada je više uređaja spojeno na središnju bazu, a svi imaju različite verzije. Još jedan razlog za ovu pojavu je vrijeme objave na tržištima: različito je za iOS i Android. Često implementiramo ključne stvari, na primjer, ispravljanje kritičnih grešaka, i ne želimo čekati da iOS provjeri novu verziju dva tjedna; želimo objaviti ažuriranje odmah, barem samo za Android.

Nemamo pravo zapovijedati korisnicima. Ako žele, ažuriraju, a ako ne, ne rade ništa. Na slici je prikazan omjer instalacija aplikacije Boss po verzijama na GooglePlayu, kao i statistika s našeg servera - stvarni omjer verzija aplikacija koje su instalirane na uređajima koji su razmjenjivali podatke sa serverom u proteklom tjednu. Ovo je set s kojim trebate raditi. To su različite verzije i različiti metapodaci. I moramo organizirati normalnu razmjenu u ovom slučaju :)

Programeri se suočavaju sa sljedećim zadacima:

  • Ovo sve treba raditi. Korisnici se ne bi trebali osjećati nelagodno jer su zaboravili izvršiti ažuriranje. Oni to uopće ne bi trebali primijetiti. Ažurirano - postalo je bolje, dobro, dobro.
  • Moramo osigurati sigurnost podataka. Na primjer, jedan korisnik ima imenik i nove podatke, ali drugi ih još nema. Štoviše, ako korisnik koji nema nove podatke promijeni nešto na svom uređaju, tada podaci ne bi trebali biti izgubljeni na drugim uređajima.
  • Moramo osigurati ažuriranje podataka kada prijeđemo na novu verziju. Kada korisnik odluči da je spreman za nadogradnju, automatski bi trebao imati sve nove informacije koje nije imao samo zato što je imao staru verziju.

Kako smo to uspjeli?

1. Koristimo 2 plana razmjene na poslužitelju. Prvi je za dijeljenje između uređaja, a drugi za ažuriranja. Na primjer, korisniku smo poslali priručnik, ali on nema mjerne jedinice, odnosno nepotpune podatke. Ovo moramo zapamtiti. A kada se ažurira, moramo mu poslati sve podatke koje nije imao. Zbog toga vam je potreban drugi plan razmjene.

2. Za pisanje i čitanje objekata koristimo isti mehanizam koji se koristi za sigurnosne kopije, odnosno spremamo verziju metapodataka. U ovom slučaju radimo s poslužiteljem i možemo si priuštiti dodavanje bilo čega što želimo izravno u konfiguraciju, tako da jednostavno dodajemo sheme metapodataka konfiguraciji u obliku izgleda kako se aplikacija razvija.

Kako pratiti masivne pogreške tijekom razmjene i na poslužitelju

Prvo morate kontrolirati dostupnost samog poslužitelja. To se događa s poslužiteljima - ruše se. Nismo izmislili ništa posebno za praćenje, već smo jednostavno pronašli bota u telegramu koji vrišti ako nešto nije u redu. Svake minute provjerava performanse poslužitelja, a ako iznenada poslužitelj bude nedostupan, počinje vrištati, administratori to vide i podižu poslužitelj.

Također prikupljamo zapisnike grešaka iz dnevnika. Ništa previše otmjeno - samo prikupljamo zapisnike pogrešaka svaka tri sata, šaljemo ih e-poštom i povremeno ih pregledavamo. To pomaže vidjeti uobičajene probleme i neke iznimne situacije. Nije teško pregledavati e-poštu, pratiti i brzo ispravljati pogreške. Ali to vam omogućuje da brzo identificirate i riješite probleme koji mogu rasti kako rastu baze podataka.

Još jedna važna stvar je da korisniku date priliku da se "žali". To poboljšava naš status u njihovim očima i spašava nas. Postoje korisnici, kako ih zovemo, “histeričari”, koji nam i na najmanju pogrešku počnu slati hrpu poruka e-poštom da ništa ne radi, baza se ne učitava, sve je užasno loše. Ali ponekad nas stvarno spase, jer ponekad pronađu greške koje drugi nekim čudom još nisu otkrili, ozbiljne greške.

Korisnik se ne treba bojati. Ne zastrašujuće poruke ili bilo što drugo. Treba im sve lijepo objasniti i pozvati da se žale. I obećavamo da ćemo sve riješiti. Tada su korisnici sretni, jer vide da su zbrinuti i odmah vjeruju da će im se pomoći :)

Ovaj je članak napisan na temelju rezultata izvješća danog na konferenciji INFOSTART EVENT 2016 DEVELOPER. Više članaka možete pročitati.

U 2020. pozivamo sve da sudjeluju na 7 regionalnih susreta, kao i na obljetničkom INFOSTART EVENT 2020 u Moskvi.

Offline je prošlost, danas je biti online neophodan. Barem za suvremeni poslovni svijet. Prezentacije robnih marki proizvoda i usluga, online naručivanje i dostava, održavanje baze kupaca, komunikacija s klijentima i još mnogo toga – sve je to jednostavno nemoguće bez online prisutnosti. Ako trebate aplikaciju, morate imati Front-end (web sučelje) i Back-End (poslužiteljska strana vaše aplikacije). A ako želite moći uređivati ​​sadržaj svoje aplikacije bez uključivanja programera, trebat će vam dobra administratorska ploča.

Dok se Front-end u industriji mobilnih aplikacija stvara pomoću tehnologija kao što su X-Code i Java, Back-end, gdje će biti pohranjena baza podataka i sva logika aplikacije, zahtijeva profesionalno poznavanje programskog jezika na strani poslužitelja. Dobar primjer je PHP, koji je možda najpopularniji programski jezik koji se koristi za razvoj gotovo svake pozadine. Ovo je neosporni lider.

Postoji mnogo aplikacija za PHP: statične i dinamičke web stranice + prilagođeni sustavi za upravljanje sadržajem, društvene mreže, specijalizirani CRM sustavi, softver za e-trgovinu i još mnogo toga. Naravno, postoje besplatni ili jeftini dijelovi poslužitelja i upravljačke ploče. Međutim, u mnogim slučajevima ne pružaju potrebnu razinu pogodnosti, prilagodbe i nadogradivosti.

Naši programeri rade s tehnologijama koje nam omogućuju implementaciju širokog spektra rješenja za različite poslovne ciljeve, potrebe i zahtjeve. Analiziramo sistemske zahtjeve za svaki projekt pojedinačno i primjenjujemo različite specijalizirane poslužiteljske softvere za optimalan rad vaše mobilne aplikacije.

Ako tražite tim koji vas može voditi do najpametnijeg i najisplativijeg rješenja za izradu aplikacije od nule ili ponovnu izgradnju postojeće za savršeno korisničko iskustvo, ne tražite dalje. Appsmob je spreman pomoći vam pronaći najbolje rješenje za vas.

Najbolji članci na temu