message:Completați toate cîmpurile de pe pagina delegate:nil cancelButtonTitle:OK otherButtonTitles:nil, nil show [309143]

4 Documentarea produsului realizat

4.1 [anonimizat] o realizare impresionantă în domeniul de design industrial și de inginerie hardware. [anonimizat], Apple nu ne permite accesul direct la orice din acest hardware. [anonimizat]-ul are loc exclusiv printr-o [anonimizat]. Aceste straturi alcătuiesc ceea ce este cunoscut ca un sistem de operare. [anonimizat].

În scopul de a obține o mai bună înțelegere a [anonimizat], [anonimizat] a dezvolta aplicații pentru iPhone.

4.1.1 iPhone OS devine iOS

Înainte de lansarea iPad în 2010, sistemul de operare care rulează pe iPhone a fost, [anonimizat]. [anonimizat] a făcut prea mult sens pentru a numi iPad OS. [anonimizat] a [anonimizat]. Având în vedere predilecție Apple pentru nume prefixate cu litera "i" (iTunes, iBookstore, iMac, etc), alegerea logică a fost, desigur, iOS. [anonimizat], [anonimizat] (Apple, [anonimizat], are o predilecție pentru ignorarea mărci). Atunci când se efectuează o [anonimizat], să fie pregătit pentru a [anonimizat]-a face cu iOS Apple.

4.1.2 O privire de ansamblu a iOS 6. [anonimizat]-[anonimizat] a hardware-ul subiacent.

Aceste straturi de sistem de operare pot fi prezentată schematic după cum este ilustrat în Figura 3.1

Figura 3.1- Straturi de sistem

Unele diagrame concepute pentru a descrie grafic software stiva iOS arată un box suplimentar poziționat deasupra stratului de Cocoa Touch pentru a indica aplicațiile care rulează pe dispozitiv. [anonimizat], deoarece acest lucru ar sugera că singura interfață de care dispune aplicația este Cocoa Touch. În practică, o aplicație poate apela direct pe oricare dintre straturile de stivă de a efectua sarcini de pe dispozitivul fizic.

Asta a supus, [anonimizat] a sistemului de operare să ofere un nivel tot mai mare de abstractizare departe de complexitatea de a [anonimizat]. [anonimizat], uita-te întotdeauna pentru soluții pentru obiectivele de programare în cadrele situate în straturile de nivel superior iOS înainte de a [anonimizat]. [anonimizat], [anonimizat] a atinge obiectivul scop. Și, [anonimizat]-uri.

Acum, [anonimizat] mai în detaliu la serviciile furnizate de fiecare strat și cadrele corespunzătoare care fac aceste servicii disponibile pentru noi, în calitate de dezvoltatori de aplicații.

3.1.3 Cocoa Touch Layer

Stratul de cacao Touch se află în partea de sus a stivei iOS și conține cadrele care sunt cel mai frecvent utilizate de către dezvoltatorii de aplicații pentru iPhone. Cocoa Touch este scris în Objective-C în primul rând, se bazează pe standardul API-ul Mac OS X de cacao și a fost extins și modificat pentru a satisface nevoile de hardware-ul iPhone.

Stratul de cacao Touch oferă următoarele cadre pentru dezvoltarea iPhone app.

Cadru UIKit (UIKit.framework). Cadrul UIKit este un vast și bogat de caracteristici bazate pe interfață de programare Objective-C. Este, fără îndoială, cadrul cu care veți petrece cel mai mult timp de lucru. Cărți întregi ar putea, și, probabil, va fi scris, cu privire la cadrul de UIKit singur. Unele dintre caracteristicile cheie ale UIKit sunt după cum urmează:

utilizator de crearea și gestionarea interfață (câmpuri text, butoane, etichete, culori, fonturi, etc);

managementul ciclului de viață de aplicare;

de manipulare eveniment de aplicare (de exemplu, ecran tactil interacțiune cu utilizatorul);

multitasking;

imprimarea fără fir ;

de protecție a datelor prin criptare ;

cut, copy, paste și funcționalitate;

web și de conținut a textului de prezentare și de gestionare a;

push notificare în legătură cu Serviciul Push Notification ;

notificări locale (un mecanism prin care o aplicație care rulează în fundal poate câștiga atenția utilizatorului);

accesibilitate;

accelerometru, baterie, senzor de proximitate, camera foto și interacțiune bibliotecă;

touch screen gest de recunoaștere;

partajarea de fișiere (capacitatea de a face dosare stocate pe dispozitiv disponibil prin iTunes);

la egal la egal albastru dinte bazat la egal la egal conectivitatea între dispozitive;

conectarea la ecrane externe.

Harta Kit Framework (MapKit.framework). Sunt șanse ca avem nevoie pentru a utiliza aplicația Hărți de mai multe ori, fie pentru a obține o hartă a unei anumite zone sau pentru a genera direcții de conducere pentru a ajunge la destinația dvs. destinate.Harta Framework Kit oferă o interfață de programare, care vă permite să construiască hartă pe baza capacități în propriile aplicații. Acest lucru ne permite afișa hărți derulant pentru orice locatie, afișa harta corespunzătoare localizarea geografică actuală a dispozitivului și adnota pe hartă într-o varietate de moduri.

Push Notification Service. Push Notification Service permite aplicații pentru a notifica utilizatorii unui eveniment, chiar în cazul în care cererea nu se execută în prezent pe dispozitiv. De la introducerea acestui serviciu a fost cel mai frecvent utilizate de către aplicațiile bazate pe știri. De obicei, atunci când nu este o veste de rupere serviciul va genera un mesaj de pe dispozitivul cu titlul de știri și oferă utilizatorului opțiunea de a încărca aplicația de știri corespunzător pentru a citi mai multe detalii. Această alertă este de obicei însoțit de o alertă audio și vibrații ale dispozitivului. Această caracteristică ar trebui să fie utilizate cu moderație, pentru a evita enervant utilizatorului cu întreruperi frecvente.

Mesajul UI Framework (MessageUI.framework). Mesajul UI Framework oferă tot ce ai nevoie pentru a permite utilizatorilor pentru a compune și a trimite mesaje e-mail din cadrul aplicației dumneavoastră. De fapt, cadrul prevede chiar și elementele de interfață de utilizator prin care utilizatorul intră e-mail adresare informații și conținutul mesajului. Alternativ, aceste informații pot fi pre-definit în cererea dumneavoastră și apoi afișat pentru utilizator să editeze și să aprobe înainte de a trimite.

Agenda UI Framework (AddressUI.framework). Avînd în vedere că o funcție cheie de iPhone este ca un dispozitiv de comunicare și asistent digital nu ar trebui să vină ca prea mult de o surpriză faptul că un cadru întreg este dedicat pentru integrarea datelor de agendă în propriile aplicații. Scopul principal al cadrului este de a vă permite să acces, afișare, edita și introduceți informațiile de contact din agenda iPhone de la în propria aplicație.

Joc Kit Framework (GameKit.framework). Joc Kit Framework oferă conectivitate egal la egal de comunicații de voce între mai multe dispozitive și utilizatori care să permită celor care rulează în același aplicație pentru a interacționa. Când această funcție a fost introdusă pentru prima dată a fost anticipat de Apple, care ar fi în primul rând utilizate în jocuri multi-player (prin urmare, alegerea numelui), dar aplicațiile posibile pentru această caracteristică se extind în mod clar dincolo de dezvoltare de jocuri.

iAd Framework (iAd.framework). Scopul Cadrului IAD este de a permite dezvoltatorilor de a include publicitatea banner în cadrul aplicațiilor lor. Toate anunțurile sunt deservite de serviciu de anunțuri proprii Apple.

Event Kit UI Framework (EventKit.framework). Event Kit UI Framework a fost introdus în iOS 4 și este prevăzut pentru a permite calendar și memento evenimente pentru a fi accesate și editate dintr-o aplicație.

Accounts Framework (Accounts.framework). iOS 5 a introdus conceptul de conturi de sistem. Acestea permit, în esență, informațiile de cont pentru alte servicii pentru a fi stocate pe dispozitivul iOS și accesate de la codul aplicație. În prezent, conturile de sistem sunt limitate la conturi de Twitter, cu toate că alte servicii, cum ar fi Facebook va apărea probabil în viitoarele versiuni iOS. Scopul Cadrului de Conturi este de a oferi un API care permite aplicațiilor să acceseze și să gestioneze aceste conturi de sistem.

Social Framework (Social.framework). Cadrul Social permite integrarea Twitter, Facebook și Sina Weibo pentru a fi adăugate la aplicații. Cadrul funcționează împreună Cadrul de Conturi pentru a avea acces la informațiile de cont de rețea socială a utilizatorului.

4.1.4 IOS Media Layer

Rolul stratului de mass-media este de a oferi iOS cu audio, video, animație și capabilități grafice. Ca și în alte straturi care cuprinde stiva iOS, stratul de mass-media cuprinde un număr de cadre care pot fi utilizate în dezvoltarea de aplicații pentru iPhone. În această secțiune ne vom uita la fiecare una, la rândul său.

Core Video Framework (CoreVideo.framework). Cadrul Video Core oferă suport buffer pentru cadrul Core Media. În timp ce acest lucru poate fi utilizată de către dezvoltatorii de aplicații, nu este de obicei necesar să se utilizeze acest cadru.

Core Text Framework (CoreText.framework). Core Text Framework este un API C bazate pe concepute pentru a facilita manipularea cerințelor avansate de aspect de text și de randare font.

Image I/O Framework (ImageIO.framework). Image I/O Framework al cărui scop este de a facilita importul și exportul de date de imagine și de metadate imagine, a fost introdus în iOS 4. Cadrul suportă o gamă largă de formate de imagine, inclusiv PNG, JPEG, TIFF și GIF

Assets Library Framework (AssetsLibrary.framework). Activele Biblioteca oferă un mecanism pentru localizarea și recuperarea fișierelor video și foto aflate pe dispozitivul iPhone. În plus față de accesul la imagini și clipuri video existente, acest cadru ne permite, de asemenea, noi fotografii și clipuri video pentru a fi salvate în albumul aparatului foto standard.

Core Graphics Framework (CoreGraphics.framework). Cadrul iOS Core Graphics (altfel cunoscut ca API Quartz 2D) oferă un ușor de două motor de randare dimensional. Caracteristici ale acestui cadru se numără crearea de documente PDF și de prezentare, vector pe bază de desen, straturi transparente, bazate pe cale desen, randare anti-alias, manipulare de culoare și de management, de redare a imaginii și degradeuri. Cei familiarizați cu API-ul Quartz 2D care rulează pe MacOS X vor fi încântați să afle că punerea în aplicare a acestui API este aceeași pe iOS.

Core Image Framework (CoreImage.framework). Un nou cadru introdus cu iOS 5 oferă un set de filtrare video și de imagine și de manipulare capabilități pentru dezvoltatorii de aplicații.

Quartz Core Framework (QuartzCore.framework). Scopul cadrului de cuarț de bază este de a oferi functionalitate de animație de pe iPhone. Acesta oferă fundamentul pentru majoritatea efectelor vizuale și animație folosite de către cadrul UIKit și oferă o interfață de programare Objective-C pe baza pentru crearea de animație specializat în aplicații pentru iPhone.

OpenGL ES framework (OpenGLES.framework). Timp de mulți ani, standardul industriei pentru 2D și 3D de înaltă performanță grafică de desen a fost OpenGL. Inițial dezvoltat de acum defunct Silicon Graphics, Inc (SGI), în anii 1990, în formă de GL, versiunea deschisa a acestei tehnologii (OpenGL), este acum în grija unui consorțiu non-profit care cuprinde o serie de companii importante, inclusiv la Apple , Inc, Intel, Motorola și ARM Holdings.

OpenGL pentru Embedded Systems (ES) este o versiune mai usoara a caietului de sarcini complet OpenGL conceput special pentru dispozitive mai mici, cum ar fi iPhone. iOS 3 sau mai suportă atât OpenGL ES 1.1 și 2.0 pe anumite modele de iPhone (cum ar fi iPhone 3GS și iPhone 4). Versiunile anterioare de iOS și modele de aparate mai vechi sprijini numai OpenGL ES versiunea 1.1.

GLKit Framework (GLKit.framework). Cadrul GLKit este un API Objective-C pe baza proiectat pentru a ușura sarcina de a crea aplicații bazate pe OpenGL ES.

NewsstandKit Framework (NewsstandKit.framework). Cererea standul de ziare este o caracteristică nouă de iOS 5 și este conceput ca o locație centrală pentru ca utilizatorii să aibă acces la ziare și reviste. Cadrul NewsstandKit permite dezvoltarea de aplicatii care utilizeaza acest nou serviciu.

iOS Audio Support. iOS este capabil de a susține audio in AAC, Apple Lossless (ALAC), A-lege, IMA / ADPCM, Linear PCM, μ-law, DVI / Intel IMA ADPCM, Microsoft GSM 6.10 și formate AES3-2003, prin sprijinul acordat de către următoarele cadre.

3.1.5 The iOS Core Services Layer

Stratul de iOS Core Services furnizează o mare parte din temelia pe care straturile referire anterior sunt construite și este format din următoarele cadre.

Address Book Framework (AddressBook.framework). Cadrul Address Book oferă acces programatic la baza de date de contact iPhone Address Book permite aplicații pentru a prelua și modifica intrările de contact

CFNetwork Framework (CFNetwork.framework). Cadrul CFNetwork oferă o interfață bazată pe C la TCP / IP stiva de protocoale de rețea și acces de nivel scăzut la prize BSD. Acest lucru permite cod aplicație să fie scris că lucrează cu HTTP, FTP și servere de nume de domeniu și de a stabili conexiuni securizate și criptate folosind Secure Sockets Layer (SSL) sau Transport Layer Security (TLS).

Core Data Framework (CoreData.framework). Acest cadru este prevăzută pentru a facilita crearea de modelare a datelor și de stocare în aplicații Model-View-Controller (MVC) bazate pe. Utilizarea cadrului de date de bază reduce semnificativ cantitatea de cod care trebuie să fie scrise pentru a efectua sarcini comune atunci când se lucrează cu date structurate în cadrul unei aplicații.

Core Foundation Framework (CoreFoundation.framework). Cadrul Fundația Core este un cadru C-based, care oferă funcționalitatea de bază, cum ar fi tipurile de date, manipulare șir, prime de gestionare a datelor de bloc, manipularea URL-ul, fire și bucle alerga, data și ori, manipulare XML de bază și de port și socket comunicare. Capabilități XML suplimentare față de cele incluse în acest cadru sunt furnizate prin intermediul bibliotecii libxml2.Deși acest lucru este o interfață C-based, cele mai multe dintre capacitățile cadrul Fundației Core sunt de asemenea disponibile cu Objective-C ambalaje prin Cadrul Foundation.

Core Media Framework (CoreMedia.framework). Cadrul Core Media este temelia nivel inferior pe care este construit stratul de Fundația AV. În timp ce majoritatea sarcinilor audio și video poate, și într-adevăr ar trebui să fie efectuate, folosind nivelul superior cadru Fundația AV, accesul este, de asemenea, prevăzut pentru situațiile în care se cere un control de nivel mai scăzut de aplicație dezvoltator iOS.

Core Telephony Framework (CoreTelephony.framework). Este prevăzută cadrul iOS Core de telefonie pentru a permite aplicații pentru a interoga dispozitivul pentru informații despre furnizorul de servicii de telefon mobil curent și de a primi notificări de evenimente legate de telefonie.

EventKit Framework (EventKit.framework)

Un API concepute pentru a oferi aplicații cu acces la calendar, memento-uri și alarmele de pe dispozitiv.

4.2 Descrierea codului aplicației

Pentru vizualizarea datelor:

@implementation MainMenuViewController

– (void)viewDidLoad {

[super viewDidLoad];

_adminButton.layer.cornerRadius = 10.0;

_adminButton.layer.borderColor = _clientButton.titleLabel.textColor.CGColor;

_adminButton.layer.borderWidth = 1.0;

_clientButton.layer.cornerRadius = 10.0;

_clientButton.layer.borderColor = _clientButton.titleLabel.textColor.CGColor;

_clientButton.layer.borderWidth = 1.0;

Pentru rezervare:

(IBAction)rezervare:(id)sender

{

if ([_numeTextField.text isEqualToString:@""] ||

[_model.text isEqualToString:@""] ||

[_telefonTextField.text isEqualToString:@""] ||

[_numarTextField.text isEqualToString:@""]

)

{

[[[UIAlertView alloc] initWithTitle:@"" message:@"Completați toate cîmpurile de pe pagina" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show];

return;

}

if ([_endDate timeIntervalSince1970] – [_beginDate timeIntervalSince1970] < 3600)

{

[[[UIAlertView alloc] initWithTitle:@"" message:@"Perioada de timp incorectă. Rezervarea poate fi efectuată pentru minim 1 oră" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show];

return;

}

Pentru scanarea codului rezerării:

(IBAction)showRezervationsList:(id)sender

{

ListaDeRezervariAdministrareViewController * rezervationList = [ListaDeRezervariAdministrareViewController new];

rezervationList.parcId = _parcId;

rezervationList.titleString = @"Rezervări";

[self.navigationController pushViewController:rezervationList animated:YES];

}

– (IBAction)showInregistrariList:(id)sender

{

ListaDeRezervariAdministrareViewController * rezervationList = [ListaDeRezervariAdministrareViewController new];

rezervationList.CarWashId = _CarWashId;

rezervationList.titleString = @"Înregistrări";

[self.navigationController pushViewController:rezervationList animated:YES];

}

Pentru vizualizarea codului QR:

@implementation QRCodeReaderView

– (id)initWithFrame:(CGRect)frame

{

if ((self = [super initWithFrame:frame])) {

[self addOverlay];

}

return self;

}

– (void)drawRect:(CGRect)rect

{

CGRect innerRect = CGRectInset(rect, 50, 50);

CGFloat minSize = MIN(innerRect.size.width, innerRect.size.height);

if (innerRect.size.width != minSize) {

innerRect.origin.x += (innerRect.size.width – minSize) / 2;

innerRect.size.width = minSize;

}

else if (innerRect.size.height != minSize) {

innerRect.origin.y += (innerRect.size.height – minSize) / 2;

innerRect.size.height = minSize;

}

CGRect offsetRect = CGRectOffset(innerRect, 0, 15);

_overlay.path = [UIBezierPath bezierPathWithRoundedRect:offsetRect cornerRadius:5].CGPath;

}

Pentru vizualizarea listei rezervărilor:

@implementation ListaDeRezervariViewController

-(void)removeRezervareFromList:(int)tag

{

NSMutableArray * arr = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"toateRezervarile"]];

[arr removeObjectAtIndex:tag];

[_rezervariArray removeObjectAtIndex:tag];

[[NSUserDefaults standardUserDefaults] setObject:arr forKey:@"toateRezervarile"];

[[NSUserDefaults standardUserDefaults] synchronize];

[_photosTableView reloadData];

}

– (IBAction)back:(id)sender

{

[self.navigationController popViewControllerAnimated:YES];

}

– (void)viewDidLoad {

[super viewDidLoad];

NSArray * arr = [[NSUserDefaults standardUserDefaults] objectForKey:@"toateRezervarile"];

if (arr == nil)

{

_rezervariArray = [NSMutableArray new];

}

else

{

_rezervariArray = [NSMutableArray new];

[_rezervariArray addObjectsFromArray:arr];

}

[_photosTableView registerNib:[UINib nibWithNibName:@"RezervariPersonaleCell" bundle:nil] forCellReuseIdentifier:@"RezervariPersonaleCell"];

// Do any additional setup after loading the view from its nib.

}

– (void)didReceiveMemoryWarning

{

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

-(void)viewDidAppear:(BOOL)animated

{

PFQuery *query = [PFQuery queryWithClassName:@"ListaCarWash"];

NSArray * objectsArray = [query findObjects];

[objectsArray enumerateObjectsUsingBlock:^(PFObject *obj, NSUInteger idx, BOOL *stop)

{

NSArray * totalRezervari = obj[@"rezervari"];

NSArray * totalInregistrari = obj[@"inregistrari"];

for (int i = 0; i < _rezervariArray.count; i++)

{

NSString* rezervareStr = _rezervariArray[i][@"infoText"];

NSString * CarWashName = [rezervareStr componentsSeparatedByString:@"\n"][0];

if ([CarWashName isEqualToString:obj[@"name"]])

{

if([totalRezervari containsObject:rezervareStr] == NO && [totalInregistrari containsObject:rezervareStr] == NO)

{

NSMutableDictionary * rezervareDict = [NSMutableDictionary dictionaryWithDictionary:_rezervariArray[i]];

rezervareDict[@"expirat"] = @(YES);

[_rezervariArray replaceObjectAtIndex:i withObject:rezervareDict];

}

}

}

}];

[_photosTableView reloadData];

}

4.3 Descrierea aplicației

Aplicația CarWash este destinată tuturor doritorilor care doresc să rezerveze un loc în spălătoriile de automobile a municipiului Chișinău.

În figura 4.2 este prezentat logo-ul aplicației.

Figura 4.2 – Logo-ul aplicației

Aplicația "CarWash" este o aplicație care permite deservirea clienților care au nevoie de o spălătorile de automobile în apropiere de locul unde se află sau de locul unde se va deplasa. Aceasta presupune de a rezerva din timp un loc în spălătorie, cît și administrarea unității economice din punctul de vedere a înregistrării unităților de transport sau a clienților care au rezervat loc.

În figura 3.3 este prezentată interfața aplicației.

Figura 4.3– Interfața aplicației

În continuare vom descrie aplicația pe compartimente, adică modulele aplicației.

Compartimentul rezervare. În acest compartiment este arătată harta cu parcările amplasate pe teritoriul orasului (2), cît și poziția curentă a utilizatorului (1). Utilizatorii pot cu ușurință să aleagă un loc de parcare selectînd una din acest parcări.

În figura 4.4 sunt reprezentate spălătoriile auto disponibile.

Figura 4.4 – Lista cu spălătoriile disponibile

După selectarea unei spălătorii se descrie situația la moment. Aceasta presupune locurile libere, preț. Pe lîngă aceasta se prezintă adresa la care se află parcarea în cauză, și denumirea ei.

În figura 4.5 este prezent un exemplu.

Figura 4.5 – Informația despre spălătoria selectată

De asemenea, se poate de vizualizat și datele despre alte spălătorii disponibile în raza aflării utilizatorului.

Butonul “Rezervare”. Butonul “Rezervare” are funcția de a rezerva un loc în unitatea selectată anterior. Acesta deschide o pagina nouă în care este nevoie de a completa un blanc cu diferite date despre utilizator, automobil.

În figura 4.6 este prezentat modelul de rezervare a unui loc.

Figura 4.6 – Rezervarea unui loc

După ce a fost introdusă informația în pagină, apăsam iarăși butonul rezervare pentru a trimite confirmarea despre rezervarea la baza de date a parcării. Totodată aceasta presupune și achitarea rezervării (aceasta ramine pe viitor). Programul generează un QR cod care va fi salvat în compartimentul lista de rezervări de la pagina anterioară și va fi prezentat la intrarea în spălătorie pentru a confirma că rezervarea a fost efectuată.

În figura 4.7 este prezentat modelul QR codului de rezervare.

Figura 4.7 – Confirmarea rezervării

Odată ajunși la locul destinației, prin intermediul unui QR-scanner, codul generat este scanat pentru a confirma că anume utilizatorul dat a rezervat un loc în spălătorie și are dreptul să îl utilizeze conform datelor prezentate anterior.

Butonul “Detalii”. Butonul “Detalii” din figura 4.8 ne arată diverse locuri publice ce se află în apropiere de spălătorie auto pentru a ne orienta cu ușurință în teritoriu.

Figura 4.7 – Amplasarea edificiilor în apropierea spălătoriei

Butonul “Lista de rezervări”. Butonul “Lista de rezervări” din figura 4.8 ne arată toate rezervările efectuate pînă la moment de către utilizator și presupune prezentarea lor sub forma QR cod la intrare în parcare. Rezervările care au fost deja utilizate sau expirate se vor însemna cu culoarea roșie și nu vor mai putea fi utilizate. Utilizatorul le poate păstra pentru orice eventualitate, sau să le șteargă dacă nu are nevoie de ele.

În figura 4.8 sunt prezentate rezervările ale utilizatorului.

Figura 4.8 – Rezervările utilizatorului

Compartimentul administrator. În acest compartiment este arătată harta cu spălătoriile amplasate pe teritoriul orașului (2), cît și poziția curenta a utilizatorului (1). Administratorul poate sa selecteze parcarea pe care o administrează și să efectueze înregistrări în baza QR codului prezentat de utilizator la sosire.

În figura 4.9 este prezentată interfața aplicației pentru modulul administratorului.

Figura 4.9 – Administrarea parcărilor

La selectare apare forma de logare ca administrator al parcării care presupune o parola de acces și detaliile info ale CarWash.

Pentru a putea accesa datele unei unități este necesar de a utiliza datele de administrator.

În figura 4.10 este prezentat un exemplu de administrare a parcării.

Figura 4.10 – Logarea la baza de date cu parcări

După logare se deschide pagina de administrare care este presupusa cu un scaner, care va scana QR codurile clienților care au efectuat rezervarea. Pentru a porni scanerul apăsăm butonul „Verifică rezervarea”.

În figura 4.11 este prezentată interfața aplicației pentru verificarea rezervărilor.

După scanare pagina de administrare verifică validitatea rezervării și cere înregistrarea mașinii în baza de date a parcării.

Figura 4.11 – Verificarea rezervărilor

Figura 4.12 – Administrarea datelor

Dacă această rezervare a fost deja înregistrată în baza de înregistrări (locuri ocupate) programul va presupune că clientul vrea să părăsească teritoriul parcării și este nevoie de eliberat automobilul cît și ștergerea înregistrării din baza de date .

După apăsarea butonului de eliberare a locului, înregistrarea și QR codul clientului devin nevalide. Dacă ne uităm în lista de rezervări a clientului observam că rezervarea dată nu mai poate fi folosită (figura 4.13).

Figura 4.13 – Anularea rezărvării

5 Argumentarea economică a proiectului

Introducere

Analiza sistemică constă în apropierea succesivă de rezultatele necesare și conține următoarele etape:

formalizarea sarcinii;

cercetarea;

analiza;

rațiuni anteriore (concordanța);

confirmare (verificare experimentală);

rațiune definitivă și implementarea rezultatelor obținute.

Deci, metodele analizei sistemice prevăd numai implementarea anumitor modele în procesul analizei sistemice și în felul acesta metodele se reduc la modelare și simulare.

Analiza sistemică în deosebire de cele descrise mai sus își concentrează atenția la aspectele metodologice ale soluționării problemelor.

5.1 Plan calendaristic

Pentru elaborarea proiectului va fi necesar de patru luni, pe parcursul acestui timp se va coopera periodic cu viitorii utilizatori ai sistemului pentru a afla opiniile lor privitor la funcționalitățile sistemului. Planul calendaristic include informația referitoare la executarea în timp a acțiunilor planificate. Rezultatele planificării sunt reflectate în tabelul 5.1.

Tabelul 5.1- Planul calendaristic

Continuarea tabelului 5.1

Din tabelul de mai sus sau obținut urmatoarele date: fond efectiv de timp necesar elaborarii proiectului va constitui 71 zile.

Din acest tabel se poate de determinat planul calendaristic al sistemului. Care include informația referitoare la executarea în timp a acțiunilor planificate, denumirea acțiunilor, numărul persoanelor implicate, resursele utilizate și unele notițe la acțiuni.

5.2 Analiza SWOT

Pentru identificarea raționalității proiectului e necesar să fie efectuată analiza mediului intern și extern al proiectului.

Pentru aceasta se propune metoda generală denumită Analiza SWOT, care constă în evaluarea punctelor forte și punctelor slabe ai mediului intern și extern al proiectului.

Astfel, elementele ale analizei SWOT sunt:

– Strengths (punctele forte);

– Weaknesses (punctele slabe);

– Opportunities (oportunități);

– Threats (riscuri).

Punctele forte/slabe reprezintă factori ai mediului intern, care contribuie sau dimpotriva îngreunează procesul de elaborare și implementare a proiectului.

Analiza SWOT este un proces foarte simplu care poate oferi o întelegere foarte profundă a problemelor potențiale și critice, care pot afecta un proiect [12].

În tabelul 5.2 este prezentată Analiza SWOT.

Tabelul 5.2 – Analiza SWOT

Pentru a diminua influența factorului intern negativ asupra proiectului, se acordă mai mult timp studierii recomandărilor și regulamentelor din domeniu. De asemenea, se acordă mai mult timp procesului de proiectare a algoritmilor legați nemijlocit de regulamentele corespunzătoare.

Pentru a diminua influența factorului extern negativ asupra proiectului, sistemul a fost realizat în unul din cele mai moderne limbaje existente la momentul actual. Acest limbaj este Java, care permite ca programul creat să fie compatibil cu toate sistemele de operare populare. De asemenea, la proiectarea algoritmilor s-a ținut cont de viteza de execuție a acestor algoritmi, cît și de resurse de calculator necesare pentru execuția algoritmilor. La proiectarea algoritmilor s-a ținut cont și de respectarea recomandărilor și regulamentelor existente în domeniu.

5.3 Argumentarea economică

Toate proiectele, indiferent de mărimea lor, timpul de realizare și numărul de copii necesită anumite cheltuieli care trebuiesc argumentate în costul proiectului. Pentru aceasta se efectuează o argumentare economică a proiectului care conține cheltuieli materiale și nemateriale.

Cheltuieli materiale directe

În tabelul 5.3 sunt prezentate consumurile materiale directe.

Tabelul 5.3 – Active materiale directe

Retribuirea muncii

Pentru realizarea proiectului dat sunt implicate mai multe persoane efectuând diferite acțiuni a proiectului fiind remunerați din bugetul proiectului.

Cheltuieli privind retribuirea muncii

Salariul de bază se plătește în lei pe zile. Programatorul se remunerează cu 200 lei pe zi, iar testerul cu 150. Conducătorul de proiect se remunerează cu 250 lei pe zi. Evaluarea cheltuielilor pe salariu de bază este dată în tabelul următor. Evaluarea salariului de bază.

Tabelul 5.4-Cheltuieli pentru retribuirea muncii.

Suma contribuțiilor în Fondul Social:

FS = Frm × Tfs (5.1)

unde: Frm –fondul de retribuire a muncii;

Tfs – tariful contribuțiilor de asigurări sociale de stat obligatorii, se aprobă fiecare an de Legea Bugetului asigurărilor sociale de stat și este 23%;

FS = 14750 lei × 23% = 3392,5 lei

Suma contribuțiilor pentru Asigurarea Medicală:

AM = Frm × Cam (5.2)

unde: Cam – tariful primei de asigurare obligatorie de asistență medicală, se aprobă fiecare an de Legea Republicii Moldova „Privind fondurile asigurării obligatorii de asistență medicală” și este egal cu 4,5%.

AM = 14750 lei × 4,5% = 663,75 lei

Suma cheltuielilor privind retribuirea muncii:

Suma cheltuielilor = Frm + FS + AM (5.3)

Suma cheltuielilor privind retribuirea muncii:

Suma cheltuielilor = 14750 + 3392,5 + 663,75 = 18783,75 lei

Astfel utilizam cotele de impozitare actuale pe 2018 vom calcula venitul net anual și respectiv suma impozitului pe venit transferat la bugetul de stat.

Calculam reținerile în fondul social FS și contribuții asigurări medicale (FAM)

FP = 52800 × 6% = 3168 lei

FAM = 52800 × 4,5% = 2376 lei

Urmează calculul venitului impozabil:

VI = VB – FP – FAM – SP – SiP – SM, (5.4)

Unde:

VI – venitul impozabil;

VB – venitul brut;

FP – fondul de pensionare (asigurări sociale);

FAM – fondul de Asigurare Medicală;

SP – scutirea personală;

SiP – scutirea pentru persoana întreținută;

SM – scutirea personală majoră

VI = 52800 – 10128 – 3168 – 2376 = 37128 lei

Se calculează suma venitului net aplicînd cotele de impozitare in vigoare:

VN = VB – IV – FP – FAM, (5.5)

unde:

VB – venitul brut;

IV – impozit pe venit;

FP – fondul de pensionare (asigurări sociale);

FAM – fondul de Asigurare Medicală.

În final, venitul net va fi:

VN = 52800 – 3946,8 – 3168 – 2376 = 43309,2 lei

Cheltuieli indirecte

În acest compartiment vom enunța totalul cheltuielilor indirecte pe articole necesare la elaborarea proiectului. Toate cheltuielile sunt incluse în tabelul 4.5.

Tabelul 5.5 – Cheltuieli indirecte

Calculul Fondului de Amortizare. Amortizarea activelor materiale si nemateriale utilizate în proiect reprezintă un element al costului de elaborare a proiectului. În acest scop vom aplica următoarea formula de calcul al fondului de amortizare:

FA = (MFi / T ) × T1 (5.4)

unde: MFi – valoarea inițială (de intrare) AMTL.

T – termen de funcționare utilă a activului.

T1 – durata proiectului.

Vom prezenta informația în tabelul 5.6.

Tabelul 5.6 – FA activelor materiale pe termen lung.

În tabelul 5.7 sunt prezentate amortizările activelor nemateriale pe termen lung

Tabelul 5.7 – Amortizarea activelor nemateriale pe termen lung

Fondul total de amortizare a AMTL si ANTL pe durata proiectului vor constitui 1000 lei. Durata efectiva de calcul amortizării am luat în calcul ca 2 luni calendaristice.

5.4 Prețul de cost

Pentru a determina costul proiectului vom însuma toate categoriile de cheltuieli suportate pe parcursul elaborării care le vom însuma în tabelul 5.8.

Tabelul 5.8 – Costul proiectului

În figura 5.1 este prezentată structura cheltuielilor pe articole.

Figura 5.1 – Structura cheltuielilor

5.5 Calculul rezultatelor financiare

Ca marja de profit in rezultatul elaborării proiectului vom planifica în mărime de 10%. Astfel vom obține:

Preț brut = Preț de cost + Marja Profit; (5.6)

De aici – profitul brut pe unitate va constitui:

PB = 23963,25 × 10% = 2396,32 lei

Preț brut pentru o unitate de produs:

Preț brut =23963,25 + 2396,32 = 26359,57 lei

Ip = 2396,32 × 12% = 283,55 lei

Valoarea profitului net la elaborarea proiectului va alcătui:

PN = Pb – Ip (5.7)

PN = 2911,76 – 203,82 = 2707,94 lei

Tabelul rezultatelor financiare sunt indicate în tabelul 5.9.

Tabelul 5.9 – Rezultate financiare

Concluzii

Oamenii preferă din ce în ce mai mult gadget-urile mobile în locul desktopurilor sau laptopurilor. În cazul în care dorim mai multă flexibilitate pentru angajați sau atragerea de clienți prin canale noi, atunci ai nevoie de dezvoltarea unor aplicații mobile. Au aparut gadgeturi mobile cu cele mai diverse forme, rezoluții sau sisteme de operare. Toate acestea nu ar trebui să aibă repercusiuni negative asupra experienței utilizatorilor indiferent sistemul de operare utilizat: iOS, Android, Windows Mobile sau Symbian.

Dacă metodele tradiționale au separat modelarea datelor de modelarea funcțiilor, obținînd astfel două tipuri de structuri distincte, structuri de date și structuri funcționale, metodele orientate obiect propun modelarea concomitentă a datelor și funcțiilor obținînd ierarhii de clase de obiecte care înglobează atît date cît și comportament.

Executând această lucrare de diplomă am încercat să redau cît mai amănunțit ideile de bază ale proiectului ce au fost implementate în modelarea și proiectarea aplicației prin intermediul limbajelor de programare și proiectare alese.

Principala problemă a fost implementarea cerințelor care apăreau spontan fie de la început, fie spre finele realizării viitorului sistem în etapa de proiectare și implementare, pe care le-am parcurs în proiect.

Schemele și diagramele create mi-au ajutat nemijlocit la generarea codului sursă pe baza cărui m-am condus în etapa de codare a proiectului și de implementare, pentru a putea crea mulțimea de pachete și module, care spre fine au fost unite într-un tot întreg.

În concluzie putem menționa că o aplicație trebuie să pună în valoare toate performanțele gadgeturilor mobile: touchscreen, aparat foto, sunet, accelerometru sau senzor de înclinare. Procesul de dezvoltare al unei aplicații mobile împinge limitele principiilor de ergonomie și uzabilitate.

Bibliografie

Modelarea dinamică [resursă electronică]. – Regim de acces: http://inf.ucv.ro/~giurca/courses/CB3105/resources/Modelarea%20Dinamica.pdf

Ticudean Mircea, Obiect Orientarea [Resursă electronică] – Regim de acces: http://www.liis.ro/~doinah/informatica/POO/obiecte.html

Florescu Vasile Fundamente teoretice si practice. – București: Infomega, 2002

Е. Бенькович, Ю.Б. Колесов, Ю.Б.Сениченков Практическое моделирование динамических систем [Text]: Учебное пособие.- СПб.: БХВ-Петербург, 2002 г. – 464 с. – ISBN: 5-94157-099-6

WAP Технологии. [resursă electronică] – Regim de acces: http://www.numeric.ru/m3gate/technology/r_index.htm

В. Бройдо, О. Ильина Вычислительные системы, сети и телекоммуникации [text]. 3-е изд. .- Спб.: Питер, 2008. –768 с.:ил.

Martin Fowler, UML distllied, Addison-Wesley, 2000, 1, 40-317

Benjamin/Cummings Publishing Company, Inc. 1994. 589 p.// Русский перевод: Г.Буч. Объектно-ориентированный анализ и проектирование: с примерами приложений на C++. – Москва: Бином, Невский диалект, 1998, 560 с., ил.

J. Rumbaugh, M. Blacha, W.Premerlani, Eddy F. Lorensen Object-Oriented Modeling and Design. Prentice-Hall, Inc., 1991

A Rational Approach to Software Development Using Rational Rose 4.0 [resursă electronică]. – Mod de accesare: http://www.rational.com/support/techpapers/ roseapproach/. 1997

G. Booch, Jim Rumbaugh, Ivar Jacobson The Unified Modeling Language User Guide: Addison-Wesley Publishing Co., 1999, 512 p.

Ivar Jacobson, G. Booch, Jim Rumbaugh The Unified Software Development Process: Addison-Wesley Publishing Co., 1999, 512 p

C (limbaj de programare) [resursă electronică] – Regim de acces: http://ro.wikipedia.org/wiki/C_(limbaj_de_programare)

Învățăm objective C. partea I [resursă electronică] – Regim de acces: http://imotuts.com/ro/view/Invatam__Objective__C_Partea_1

Învățăm objective C. partea II [resursă electronică] – Regim de acces: http://imotuts.com/ro/view/Invatam__Objective_C__Partea_2_

Programarea în Mac OS X. [resursă electronică] – Regim de acces: http://www.macuser.ro/index.php/wiki/Programare/

Anexa A

Codul sursă

#import "AdministratorViewController.h"

#import "DataLoader.h"

#import <CoreLocation/CoreLocation.h>

#import <MapKit/MapKit.h>

#import "DetailsViewController.h"

#import "RezervareViewController.h"

#import "ScanViewController.h"

#import <Parse/Parse.h>

#import "CarWashAnnotationView.h"

@interface AdministratorViewController ()<CLLocationManagerDelegate,MKMapViewDelegate,UITextFieldDelegate>

@property (weak, nonatomic) IBOutlet UILabel *adressLabel;

@property (weak, nonatomic) IBOutlet UILabel *nameLabel;

@property (weak, nonatomic) IBOutlet UITextField *passwordTextField;

@property (weak, nonatomic) IBOutlet UIButton *logareButton;

@property (weak, nonatomic) IBOutlet MKMapView *placeMap;

@property (strong, nonatomic) CLLocationManager *locationManager;

@property (nonatomic,strong) NSString* selectedCarWashDetails;

@property (weak, nonatomic) IBOutlet UIView *logareView;

@property (assign, nonatomic) NSString* CarWashId;

@property (assign, nonatomic) BOOL mapLoaded;

@end

@implementation AdministratorViewController

-(BOOL)textFieldShouldReturn:(UITextField *)textField

{

textField.text = @"";

[textField resignFirstResponder];

[self administreaza:nil];

return YES;

}

– (IBAction)closeLogView:(UIButton*)sender

{

_passwordTextField.text = @"";

[_passwordTextField resignFirstResponder];

_logareView.hidden = YES;

}

– (IBAction)back:(id)sender

{

[self.navigationController popViewControllerAnimated:YES];

}

– (void)viewDidLoad

{

[super viewDidLoad];

MKCoordinateRegion region = _placeMap.region;

region.span.longitudeDelta = 0.1;

region.span.latitudeDelta = 0.1;

[_placeMap setRegion:region animated:YES];

_logareButton.layer.cornerRadius = 5.0;

_logareButton.layer.borderColor = _logareButton.titleLabel.textColor.CGColor;

_logareButton.layer.borderWidth = 1.0;

// Do any additional setup after loading the view from its nib.

}

-(void)viewDidAppear:(BOOL)animated

{

}

– (IBAction)administreaza:(id)sender

{

ScanViewController * scan = [ScanViewController new];

scan.CarWashId = _CarWashId;

[self.navigationController pushViewController:scan animated:YES];

[_passwordTextField resignFirstResponder];

}

-(void)viewWillAppear:(BOOL)animated

{

if (_locationManager == nil)

{

_locationManager = [CLLocationManager new];

}

_locationManager.delegate = self;

[_locationManager stopUpdatingLocation];

if ([_locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])

{

[_locationManager requestAlwaysAuthorization];

}

_logareView.hidden = YES;

[_locationManager startUpdatingLocation];

}

– (void)didReceiveMemoryWarning

{

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

– (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

{

[self locationManager:manager didUpdateLocations:@[newLocation]];

}

– (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

{

CLLocation * location = [locations firstObject];

_locationManager.delegate = nil;

CLLocationCoordinate2D coordinates = location.coordinate;

[self loadVenueInfo:coordinates];

}

– (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

{

}

– (IBAction)handleMap:(UITapGestureRecognizer *)sender

{

// CGPoint touchPoint = [sender locationInView:_placeMap];

// CLLocationCoordinate2D coordinates = [_placeMap convertPoint:touchPoint toCoordinateFromView:_placeMap];

// [self loadVenueInfo:coordinates];

}

-(void)loadVenueInfo:(CLLocationCoordinate2D)coordinates

{

MKCoordinateRegion region = _placeMap.region;

region.center = coordinates;

[_placeMap setRegion:region animated:YES];

}

-(void)mapViewDidFinishLoadingMap:(MKMapView *)mapView

{

PFQuery *query = [PFQuery queryWithClassName:@"ListaCarWash"];

NSArray * objectsArray = [query findObjects];

[mapView removeAnnotations:mapView.annotations];

[objectsArray enumerateObjectsUsingBlock:^(PFObject *obj, NSUInteger idx, BOOL *stop)

{

double latitude = [obj[@"latitude"] doubleValue];

double longitude = [obj[@"longitude"] doubleValue];

CLLocationCoordinate2D coordinates = CLLocationCoordinate2DMake(latitude, longitude);

MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];

[annotation setCoordinate:coordinates];

annotation.title = obj[@"name"];

annotation.subtitle = obj[@"address"];

annotation.accessibilityValue = obj.objectId;

[mapView addAnnotation:annotation];

}];

}

– (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation

{

// If it's the user location, just return nil.

if ([annotation isKindOfClass:[MKUserLocation class]])

return nil;

// Handle any custom annotations.

if ([annotation isKindOfClass:[MKPointAnnotation class]])

{

// Try to dequeue an existing pin view first.

CarWashAnnotationView *pinView = (CarWashAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"CarWashAnnotationView"];

if (!pinView)

{

// If an existing pin view was not available, create one.

pinView = [[NSBundle mainBundle] loadNibNamed:@"CarWashAnnotationView" owner:nil options:nil][0];

pinView.frame = CGRectMake(0, 0, 140, 50);

pinView.annotationTitle.text = [annotation title];

pinView.canShowCallout = YES;

// pinView.image = [UIImage imageNamed:@"pinImage.png"];

pinView.calloutOffset = CGPointMake(0, 0);

// Add a detail disclosure button to the callout.

UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

pinView.rightCalloutAccessoryView = rightButton;

// Add an image to the left callout.

} else {

pinView.annotation = annotation;

}

return pinView;

}

return nil;

}

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view

{

MKPointAnnotation *annotation = view.annotation;

NSString *parcId = annotation.accessibilityValue;

PFQuery *query = [PFQuery queryWithClassName:@"ListaCarWash"];

_parcId = parcId;

[query getObjectInBackgroundWithId:parcId block:^(PFObject *object, NSError *error)

{

_logareView.hidden = NO;

_nameLabel.text = object[@"name"];

_adressLabel.text = object[@"address"];

}];

}

@end

@implementation QRCodeReader

– (id)initWithMetadataObjectTypes:(NSArray *)metadataObjectTypes

{

if ((self = [super init])) {

_metadataObjectTypes = metadataObjectTypes;

[self setupAVComponents];

[self configureDefaultComponents];

}

return self;

}

+ (instancetype)readerWithMetadataObjectTypes:(NSArray *)metadataObjectTypes

{

return [[self alloc] initWithMetadataObjectTypes:metadataObjectTypes];

}

#pragma mark – Initializing the AV Components

– (void)setupAVComponents

{

self.defaultDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

if (_defaultDevice) {

self.defaultDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:_defaultDevice error:nil];

self.metadataOutput = [[AVCaptureMetadataOutput alloc] init];

self.session = [[AVCaptureSession alloc] init];

self.previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];

for (AVCaptureDevice *device in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]) {

if (device.position == AVCaptureDevicePositionFront) {

self.frontDevice = device;

}

}

if (_frontDevice) {

self.frontDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:_frontDevice error:nil];

}

}

}

– (void)configureDefaultComponents

{

[_session addOutput:_metadataOutput];

if (_defaultDeviceInput) {

[_session addInput:_defaultDeviceInput];

}

[_metadataOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

[_metadataOutput setMetadataObjectTypes:_metadataObjectTypes];

[_previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];

}

– (void)switchDeviceInput

{

if (_frontDeviceInput) {

[_session beginConfiguration];

AVCaptureDeviceInput *currentInput = [_session.inputs firstObject];

[_session removeInput:currentInput];

AVCaptureDeviceInput *newDeviceInput = (currentInput.device.position == AVCaptureDevicePositionFront) ? _defaultDeviceInput : _frontDeviceInput;

[_session addInput:newDeviceInput];

[_session commitConfiguration];

}

}

– (BOOL)hasFrontDevice

{

return _frontDevice != nil;

}

#pragma mark – Controlling Reader

– (void)startScanning

{

if (![self.session isRunning]) {

[self.session startRunning];

}

}

– (void)stopScanning

{

if ([self.session isRunning]) {

[self.session stopRunning];

}

}

– (BOOL)running {

return self.session.running;

}

#pragma mark – Managing the Orientation

+ (AVCaptureVideoOrientation)videoOrientationFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

{

switch (interfaceOrientation) {

case UIInterfaceOrientationLandscapeLeft:

return AVCaptureVideoOrientationLandscapeLeft;

case UIInterfaceOrientationLandscapeRight:

return AVCaptureVideoOrientationLandscapeRight;

case UIInterfaceOrientationPortrait:

return AVCaptureVideoOrientationPortrait;

default:

return AVCaptureVideoOrientationPortraitUpsideDown;

}

}

#pragma mark – Checking the Reader Availabilities

+ (BOOL)isAvailable

{

@autoreleasepool {

AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

if (!captureDevice) {

return NO;

}

NSError *error;

AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];

if (!deviceInput || error) {

return NO;

}

return YES;

}

}

+ (BOOL)supportsMetadataObjectTypes:(NSArray *)metadataObjectTypes

{

if (![self isAvailable]) {

return NO;

}

@autoreleasepool {

// Setup components

AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:nil];

AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];

AVCaptureSession *session = [[AVCaptureSession alloc] init];

[session addInput:deviceInput];

[session addOutput:output];

if (metadataObjectTypes == nil || metadataObjectTypes.count == 0) {

// Check the QRCode metadata object type by default

metadataObjectTypes = @[AVMetadataObjectTypeQRCode];

}

for (NSString *metadataObjectType in metadataObjectTypes) {

if (![output.availableMetadataObjectTypes containsObject:metadataObjectType]) {

return NO;

}

}

return YES;

}

}

#pragma mark – Managing the Block

– (void)setCompletionWithBlock:(void (^) (NSString *resultAsString))completionBlock

{

self.completionBlock = completionBlock;

}

#pragma mark – AVCaptureMetadataOutputObjects Delegate Methods

– (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection

{

for (AVMetadataObject *current in metadataObjects) {

if ([current isKindOfClass:[AVMetadataMachineReadableCodeObject class]]

&& [_metadataObjectTypes containsObject:current.type]) {

NSString *scannedResult = [(AVMetadataMachineReadableCodeObject *) current stringValue];

if (_completionBlock) {

_completionBlock(scannedResult);

}

break;

}

}

}

@end

end

@implementation RezervariPersonaleCell

– (id)initWithFrame:(CGRect)frame

{

self = [super initWithFrame:frame];

if (self) {

// Initialization code

}

return self;

}

– (IBAction)deleteRezervationFromList:(id)sender

{

[_target removeRezervareFromList:self.tag];

}

// Only override drawRect: if you perform custom drawing.

// An empty implementation adversely affects performance during animation.

– (void)drawRect:(CGRect)rect

{

CGRect frame = self.bounds;

frame.origin.x = 10;

frame.origin.y = 10;

frame.size.width = frame.size.width – 20;

frame.size.height = frame.size.height – 20;

_backView.frame = frame;

self.backView.layer.borderColor = _titleLabel.textColor.CGColor;

self.backView.layer.borderWidth = 1.0;

self.backView.layer.cornerRadius = 4.0;

self.clipsToBounds = YES;

}

@end

Similar Posts