SlideShare a Scribd company logo
1 of 93
Download to read offline
V!voj aplikací pro iOS
      FI MUNI, 22. 4. 2011
Obsah - 1. část

• Vícevláknové aplikace
 • Asynchronní provádění operací
 • Bloky a GCD
Obsah - 2. část

• Práce s daty na iOS
 • Zpracování XML a JSONu
 • Persistence dat
Obsah - 2. část

• Polohové slu#by
 • Core Location
 • MapKit
Obsah - 3. část

• Systémové dialogy a komunikace mezi aplikacemi
 • Získání fotografie a kontaktů
 • URL Schémata
Kdy# zbyde čas...

• Freestyle na témata
 • Práce s UIWebView
 • Lokalizace aplikací
Vícevláknové aplikace
Proč vlákna?


• Pomalé operace nesmí blokovat hlavní vlákno
• Operace UIKitu musí bě#et na hlavním vlákně
Pattern


• Dlouhotrvající operace - separátní vlákno
• Update UI - hlavní vlákno
NSThread
NSThread


• Nízkoúrovňová abstrakce nad vlákny
NSThread
 - (void) detachAsyncOperation {
    [NSThread detachNewThreadSelector:@selector(operation:)
                toTarget:self
                withObject:contextData];
 }
 - (void) operation:(id)contextData {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    // slow code here
    [self performSelectorOnMainThread:@selector(updateUI:)
          withObject:contextData
          waitUntilDone:NO];
    [pool release];
 }
NSThread

 NSThread *thread = [[NSThread alloc] initWithTarget:self
                                          selector:@selector(operation:)
                                          object:context];
 [thread setThreadPriority:1.0]; // [0.0, 1.0], 1.0 = highest
 [thread start];
 ...
 [thread cancel];
 ...
 [thread release];
Bloky
Bloky

^
• “blok” = “kousek kódu”
• "iroká "kála pou#ití v různ!ch částech SDK
• ~ Lambda, ~ anonymní
Bloky

 ^ BOOL (int a, int b) { /* code */ }


 ^ void (void) { /* code */ }
 ^ { /* code */ }
Bloky
 typedef (void) (^myBlock_t)(int i)


 void repeat (int times, myBlock_t block) {
    for (int i = 0; i < times; i++) block(i);
 }
Bloky
 int const = 10;
 myBlock_t iBlock = ^(int i) {
     NSLog(@”%d”, i * const);
 }
 repeat(5, iBlock);
UIKit Animace

 imageView.alpha = 0.0;
 [UIView animateWithDuration:1.0 animations:^{
     imageView.alpha = 1.0;
 } completion:^(BOOL finished) {
     // some completion code, possibly cleanup
 }];
Bloky

 NSSet *iSet = [NSSet set];
 // ... add objects to the set

 [set objectsPassingTest:^(id obj, BOOL *stop) {
     return [self testValue:id]; // custom comparison
 }];
GCD
GCD

• Práce s NSThread je ubíjející
• GCD (“Grand Central Dispatch”) práci
  zjednodu"uje
• jazyk C, funkce začínají na “dispatch_”
GCD

• Dispatch Queue
 • fronta bloků (FIFO)
 • jsou reference-counted
 • dispatch_queue_create ! dispatch_release
GCD

dispatch_async(queue, ^ {
    // some slow code
});
GCD
dispatch_async(network_queue, ^ {
    // some slow code
    dispatch_async(main_queue, ^{
        // update UI
    });
});
GCD

• Dispatch Queue
 • dispatch_get_main_queue()
 • dispatch_get_global_queue(priority, 0);
 • dispatch_queue_create("eu.inmite.net", NULL);
GCD

• Dispatch Semaphore
 • dispatch_semaphore_create
 • dispatch_semaphore_wait
 • dispatch_semaphore_signal
GCD

•
                               4
  Dispatch Semaphore
 • dispatch_semaphore_create   3



 • dispatch_semaphore_wait
                               2



 • dispatch_semaphore_signal
                               1
GCD

• Dispatch Semaphore
 • dispatch_semaphore_create
 • dispatch_semaphore_wait
                               2



 • dispatch_semaphore_signal
                               1
GCD

• Dispatch Semaphore
 • dispatch_semaphore_create
 • dispatch_semaphore_wait
 • dispatch_semaphore_signal
                               !
GCD

•
                               4
  Dispatch Semaphore
 • dispatch_semaphore_create   3



 • dispatch_semaphore_wait
                               2



 • dispatch_semaphore_signal
                               1
GCD

• Dispatch Source
 • reakce na systémové události
 • soubory, sockety, timer, ...
Singleton
Singleton Pattern

 // within class Foo
 + (Foo*) getDefault {
    static Foo *inst = nil;
    if (!inst) {
        inst = [[Foo alloc] init]; // create the instance
    }
    return inst;
 }
Singleton Pattern
 // within class Foo
 + (Foo*) getDefault {
    static Foo *inst = nil;
    @synchronized (self) {
       if (!inst) {
           inst = [[Foo alloc] init]; // create the instance
       }
    }
    return inst;
 }
Singleton Pattern
 // within class Foo
 + (Foo*) getDefault {
    static Foo *inst = nil;
    if (!inst) {
        @synchronized (self) {
           if (!inst) {
               inst = [[Foo alloc] init]; // create the instance




                                                                   ???
           }
        }
    }
    return inst;
 }
Singleton Pattern
 // within class Foo
 + (Foo*) getDefault {
    static Foo volatile *inst = nil;
    if (!inst) {
        @synchronized (self) {
           if (!inst) {
               Foo *tmp = [[Foo alloc] init]; // create the instance
               OSMemoryBarrier();
               inst = foo;
           }
        }
    }
    OSMemoryBarrier();
    return inst;
 }
Singleton Pattern

 // within class Foo
 + (Foo*) getDefault {
    static dispatch_once_t pred;
    static Foo *inst;
    dispatch_once(&pred, ^ { inst = [[Foo alloc] init] });
    return inst;
 }
Operation Queues
NSOperation

• Abstrakce nad “operací”
• Určeno pro subclassování
• KVO compliant
NSOperation
• Informace o stavu operace
 •  isCancelled, isFinished, isExecuting, ...
• Mo#nost nastavení priority
• Závislosti operací
 • [op1 addDependency:op2];
NSOperation

• main - kód, kter! se má vykonat
• start - spustí operaci
• cancel - nastaví příznak zru"ení
NSOperation


• K dispozici podtřídy
 • NSInvocationOperation
 • NSBlockOperation
NSInvocationOperation

•   Operace vycházející ze selektoru

 [[NSInvocationOperation alloc]
                        initWithTarget:target
                                selector:selector
                                  object:context];
NSBlockOperation

• Operace přijímající blok
 [NSBlockOperation blockOperationWithBlock:^{
     // some code...
 }];
Spu"tění operace
 - (BOOL)performOperation:(NSOperation*)anOp {
     BOOL ranIt = NO;
     if ([anOp isReady] && ![anOp isCancelled]) {
         if (![anOp isConcurrent]) [anOp start]; else [NSThread
               detachNewThreadSelector:@selector(start) toTarget:anOp withObject:nil];
         ranIt = YES;
     } else if ([anOp isCancelled]) {
         [self willChangeValueForKey:@"isFinished"];
         [self willChangeValueForKey:@"isExecuting"];
         executing = NO;
         finished = YES;
         [self didChangeValueForKey:@"isExecuting"];
         [self didChangeValueForKey:@"isFinished"];
         ranIt = YES;
    }
    return ranIt;
 }
NSOperationQueue

• Snadné spou"tění instancí NSOperation
• Jedna NSOperationQueue instance ~ funkčnost
• Mo#nost nastavit počet paralelních operací
Spu"tění operace


 [queue addOperation:anOperation];
NSOperationQueue


 [NSOperationQueue mainQueue];
 [NSOperationQueue currentQueue];
Práce s daty na iOS
Zpracování
XML a JSON
XML

• SAX - NSXMLParser
 • součást Apple iOS SDK
• DOM - TouchXML, KissXML, ...
 • XML ! Strom
Touch XML

• Modified BSD Licence
• DOM parser + XPath, XML Namespaces
• https://github.com/TouchCode/TouchXML
JSON
•JavaScript Object Notation
• JSON Framework

   {
       "id": 1,
       "name": "Foo",
       "price": 123,
       "tags": ["Bar","Eek"]
   }
JSON Framework

• New BSD Licence
• JSON parser a generator
• http://stig.github.com/json-framework/
Persistence dat
iOS Filesystem

• Aplikace jsou omezené na svůj sandbox
 • Nemohou číst ani psát mimo něj
• Ka#dá aplikace má svůj “Home directory”
iOS Filesystem

• Documents
 • slo#ka pro u#ivatelské dokumenty
 • zálohuje se do iTunes
iOS Filesystem

• Caches
 • slo#ka pro soubory cache
 • nezálohuje se do iTunes
iOS Filesystem

• Temp
 • slo#ka pro dočasné soubory
 • nezálohuje se do iTunes
iOS Filesystem

 // temporary directory
 NSString *tmpDir = NSTemporaryDirectory();

 // documents or caches directory
 // NSDocuentsDirectory, NSCachesDirectory
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,
 NSUserDomainMask,YES);
 NSString *cacheDir = [paths objectAtIndex:0];

 NSString *path = [cacheDir stringByAppendingPathComponent:fileName];
Property list


• formát pro objektovou persistenci
• dvě varianty: XML a binární varianta (Apple)
Property list
 <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
       "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
   <key>title</key>
   <string>Blue socks</string>
   <key>are_new</key>
   <true/>
   <key>colors</key>
   <array>
       <string>blue</string>
   </array>
 </dict>
 </plist>
Property list


• NSArray, NSDictionary
 • lze zapisovat a číst z plistu
NSCoding

•Protokol pro serializaci objektu
 • encodeWithCoder
 • decodeWithCoder
NSCoding
 - (void)encodeWithCoder:(NSCoder *)encoder {
    // [super initWithCoder:coder]; for subclasses
    [encoder encodeObject:[self title] forKey:@"title"];
    [encoder encodeObject:[self description] forKey:@"description"];
    [encoder encodeObject:[self fullContent] forKey:@"fullcontent"];
    [encoder encodeObject:[self href] forKey:@"href"];
    [encoder encodeObject:[self locationStr] forKey:@"locationstr"];
    [encoder encodeObject:[self imageURL] forKey:@"imageurl"];
    [encoder encodeBool:[self read] forKey:@"read"];
 }
NSCoding
 - (id)initWithCoder:(NSCoder *)decoder {
     // [super initWithDecoder:decoder]; for subclasses
     if (self = [super init]) {
         [self setTitle:[decoder decodeObjectForKey:@"title"]];
         [self setDescription:[decoder decodeObjectForKey:@"description"]];
         [self setFullContent:[decoder decodeObjectForKey:@"fullcontent"]];
         [self setHref:[decoder decodeObjectForKey:@"href"]];
         [self setLocationStr:[decoder decodeObjectForKey:@"locationstr"]];
         [self setImageURL:[decoder decodeObjectForKey:@"imageurl"]];
         [self setRead:[decoder decodeBoolForKey:@"read"]];
     }
     return self;
 }
NSKeyedArchiver


 BOOL success
      = [NSKeyedArchiver archiveRootObject:self
                                     toFile:path];
NSKeyedUnarchiver


 MyModel *model
          = (MyModel*)[NSKeyedUnarchiver
                    unarchiveObjectWithFile:path];
NSUserDefaults

•   Místo pro ukládání u#ivatelského nastavení
    aplikace
• Pod pokličkou je PList
NSUserDefaults

 NSUserDefaults * userDefaults
                      = [NSUserDefaults standardUserDefaults];

 [userDefaults setValue:@”Blue socks” forKey:@”title”];
 [userDefaults setBool:YES forKey:@”are_new”];
 [userDefaults synchronize];

 NSString *title = [userDefaults valueForKey:@”title”];
 BOOL are_new = [userDefaults boolForKey:@”are_new”];
NSUserDefaults
• Mo#nost registrace do aplikace “Settings”
 • Soubor “Settings.bundle”
 • PSTextFieldSpecifier, PSToggleSwitchSpecifier,
   PSSliderSpecifier, ...
 • pouze “deklarativní nastavení”
SQLite3

• Light-weight SQL implementace
• Vhodná pro mobilní zařízení
• Součástí Apple iOS SDK
• Implementace v C, existují wrappery
FMDB

• MIT Licence
• Light-weight Objective-C wrapper nad SQLite
• https://github.com/ccgus/fmdb
CoreData
• Ře"ení Apple pro management modelu (object
  graph) a persistenci dat
 • podobné ORM (ale není to ORM)
• Pod pokličkou SQLite
• Vizuální tvorba modelu
CoreData
Polohové slu#by
MapKit Framework
MKMapView

• Implementace online Google Map
• Podpora pro různé typy map
• Poměrně omezená, ale stačí
MKAnnotation

• Protokol
• Model pro “napínáčky” na mapě
• anotace se přidá do mapy, vrací svou pozici a
  titulek
MKAnnotationView

• View anotace na mapě (“napínáček”)
• Pou#ívá concept reusable identifikátoru
• MKPinAnnotationView
CLLocationManager

• Zji"tění aktuální polohy zařízení
• Umo#ňuje nastavit po#adovanou přesnost
• Dodává pravidelně update pozice
Systémové dialogy
Systémové dialogy


• Aplikace v SandBoxu
• Definované API pro funkce telefonu
Image Picker


• Fotoaparát, galerie telefonu
• UIImagePickerViewController
Person Picker


• Volba kontaktů
• ABPeoplePickerNavigationController
URL Schémata
URL Schémata


• Způsob, jak spou"tět jiné aplikace
• Umo#ňuje předávat “malá data”
URL Schémata


 if ([[UIApplication sharedApplication] canOpenURL:url]) {
     [[UIApplication sharedApplication] openURL:url];
 }
URL Schémata
• http://www.abc.com/ - Safari
 • nebo Google Maps,YouTube či iTunes
• mailto:mail@example.com - Mail
• tel:777123456 - Phone
• sms:777123456 - SMS
URL Schémata

• Aplikace mů#e registrovat své URL schéma
• Jiná aplikace ji mů#e spustit
• Rejstřík: http://handleopenurl.com/
Facebook

• Autentizace pou#ívá custom URL schéma
• Facebook SDK for iPhone
 • https://github.com/facebook/facebook-ios-sdk
Děkuji
 @inmite

More Related Content

What's hot

Czech Sun Training Day 2009 - Solaris
Czech Sun Training Day 2009 - SolarisCzech Sun Training Day 2009 - Solaris
Czech Sun Training Day 2009 - SolarisMartin Cerveny
 
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)Martin Zeman
 
Nette framework - How to compile an extensible di container
Nette framework - How to compile an extensible di containerNette framework - How to compile an extensible di container
Nette framework - How to compile an extensible di containerFilip Procházka
 

What's hot (6)

Doctrine ORM & model
Doctrine ORM & modelDoctrine ORM & model
Doctrine ORM & model
 
Czech Sun Training Day 2009 - Solaris
Czech Sun Training Day 2009 - SolarisCzech Sun Training Day 2009 - Solaris
Czech Sun Training Day 2009 - Solaris
 
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
 
ES6 generátory
ES6 generátoryES6 generátory
ES6 generátory
 
Nette framework - How to compile an extensible di container
Nette framework - How to compile an extensible di containerNette framework - How to compile an extensible di container
Nette framework - How to compile an extensible di container
 
Kdyby/Redis
Kdyby/RedisKdyby/Redis
Kdyby/Redis
 

Viewers also liked

Prezentace brunch 2011_mashup_9.3
Prezentace brunch 2011_mashup_9.3Prezentace brunch 2011_mashup_9.3
Prezentace brunch 2011_mashup_9.3sabreweb
 
NWA - Network World Alliance - Vie at home
NWA - Network World Alliance - Vie at homeNWA - Network World Alliance - Vie at home
NWA - Network World Alliance - Vie at homeTibor Seszták
 
České e-knihy a tipy k akvizici e-knih
České e-knihy a tipy k akvizici e-knihČeské e-knihy a tipy k akvizici e-knih
České e-knihy a tipy k akvizici e-knihJiri Pavlik
 
Analyzuj a proveď
Analyzuj a proveďAnalyzuj a proveď
Analyzuj a proveďEdolo s.r.o.
 
20101124 Aplikované nástroje SW inženýra
20101124 Aplikované nástroje SW inženýra20101124 Aplikované nástroje SW inženýra
20101124 Aplikované nástroje SW inženýraJiří Mareš
 
Karel Tinl - Jak na papir a web
Karel Tinl - Jak na papir a webKarel Tinl - Jak na papir a web
Karel Tinl - Jak na papir a webAVOprezentace
 
Jak napsat dobry odborny clanek
Jak napsat dobry odborny clanekJak napsat dobry odborny clanek
Jak napsat dobry odborny clanekCEINVE
 
Prototypování v Groovy a Grails
Prototypování v Groovy a GrailsPrototypování v Groovy a Grails
Prototypování v Groovy a GrailsVít Kotačka
 

Viewers also liked (9)

Prezentace brunch 2011_mashup_9.3
Prezentace brunch 2011_mashup_9.3Prezentace brunch 2011_mashup_9.3
Prezentace brunch 2011_mashup_9.3
 
Graphic
GraphicGraphic
Graphic
 
NWA - Network World Alliance - Vie at home
NWA - Network World Alliance - Vie at homeNWA - Network World Alliance - Vie at home
NWA - Network World Alliance - Vie at home
 
České e-knihy a tipy k akvizici e-knih
České e-knihy a tipy k akvizici e-knihČeské e-knihy a tipy k akvizici e-knih
České e-knihy a tipy k akvizici e-knih
 
Analyzuj a proveď
Analyzuj a proveďAnalyzuj a proveď
Analyzuj a proveď
 
20101124 Aplikované nástroje SW inženýra
20101124 Aplikované nástroje SW inženýra20101124 Aplikované nástroje SW inženýra
20101124 Aplikované nástroje SW inženýra
 
Karel Tinl - Jak na papir a web
Karel Tinl - Jak na papir a webKarel Tinl - Jak na papir a web
Karel Tinl - Jak na papir a web
 
Jak napsat dobry odborny clanek
Jak napsat dobry odborny clanekJak napsat dobry odborny clanek
Jak napsat dobry odborny clanek
 
Prototypování v Groovy a Grails
Prototypování v Groovy a GrailsPrototypování v Groovy a Grails
Prototypování v Groovy a Grails
 

Similar to Vývoj aplikací pro iOS

ClojureScript
ClojureScriptClojureScript
ClojureScriptjakubkoci
 
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)Péhápkaři
 
.NET v SQL Serveru
.NET v SQL Serveru.NET v SQL Serveru
.NET v SQL ServeruJan Drozen
 
Smalltalk prakticky [CZ]
Smalltalk prakticky [CZ]Smalltalk prakticky [CZ]
Smalltalk prakticky [CZ]Tomáš Kukol
 
DevLove 移行勉強会
DevLove 移行勉強会DevLove 移行勉強会
DevLove 移行勉強会Yozo SATO
 
Spring framework - J2EE S Lidskou Tvari
Spring framework - J2EE S Lidskou TvariSpring framework - J2EE S Lidskou Tvari
Spring framework - J2EE S Lidskou TvariRoman Pichlík
 
Sphinxsearch by Pavel Severýn
Sphinxsearch by Pavel SeverýnSphinxsearch by Pavel Severýn
Sphinxsearch by Pavel SeverýnJaroslav Kubíček
 
Ladění iOS aplikací nejen v Xcode [For Mobile červen 2013]
Ladění iOS aplikací nejen v Xcode [For Mobile červen 2013]Ladění iOS aplikací nejen v Xcode [For Mobile červen 2013]
Ladění iOS aplikací nejen v Xcode [For Mobile červen 2013]Kuba Břečka
 
Keyup presentation about Gulp
Keyup presentation about GulpKeyup presentation about Gulp
Keyup presentation about GulpKeyup
 
Mikro­kontrolér s Wi-Fi za $3! nejen pro IOT
Mikro­kontrolér s Wi-Fi za $3! nejen pro IOTMikro­kontrolér s Wi-Fi za $3! nejen pro IOT
Mikro­kontrolér s Wi-Fi za $3! nejen pro IOTAdam Hořčica
 
Czech Oracle Solaris Administrators Day 2011 - Solaris Express (OpenSolaris)
Czech Oracle Solaris Administrators Day 2011 - Solaris Express (OpenSolaris)Czech Oracle Solaris Administrators Day 2011 - Solaris Express (OpenSolaris)
Czech Oracle Solaris Administrators Day 2011 - Solaris Express (OpenSolaris)Martin Cerveny
 
Dependency injection v .Net Frameworku
Dependency injection v .Net FrameworkuDependency injection v .Net Frameworku
Dependency injection v .Net FrameworkuRené Stein
 
Slovak Sun Training Day 2010 - OpenSolaris
Slovak Sun Training Day 2010 - OpenSolarisSlovak Sun Training Day 2010 - OpenSolaris
Slovak Sun Training Day 2010 - OpenSolarisMartin Cerveny
 
JavaScript v GTM - Measure Camp Brno 2017
JavaScript v GTM - Measure Camp Brno 2017JavaScript v GTM - Measure Camp Brno 2017
JavaScript v GTM - Measure Camp Brno 2017Michal Blažek
 
Easymock
EasymockEasymock
EasymockKeyup
 
Arduino naplno (Arduino Day 2015)
Arduino naplno (Arduino Day 2015)Arduino naplno (Arduino Day 2015)
Arduino naplno (Arduino Day 2015)Adam Hořčica
 

Similar to Vývoj aplikací pro iOS (20)

201502.ReinIT.Dev
201502.ReinIT.Dev201502.ReinIT.Dev
201502.ReinIT.Dev
 
ClojureScript
ClojureScriptClojureScript
ClojureScript
 
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
 
.NET v SQL Serveru
.NET v SQL Serveru.NET v SQL Serveru
.NET v SQL Serveru
 
Shibboleth v Praxi - DSpace (Vlastimil Krejčíř)
Shibboleth v Praxi - DSpace (Vlastimil Krejčíř)Shibboleth v Praxi - DSpace (Vlastimil Krejčíř)
Shibboleth v Praxi - DSpace (Vlastimil Krejčíř)
 
Smalltalk prakticky [CZ]
Smalltalk prakticky [CZ]Smalltalk prakticky [CZ]
Smalltalk prakticky [CZ]
 
DevLove 移行勉強会
DevLove 移行勉強会DevLove 移行勉強会
DevLove 移行勉強会
 
Django
DjangoDjango
Django
 
Spring framework - J2EE S Lidskou Tvari
Spring framework - J2EE S Lidskou TvariSpring framework - J2EE S Lidskou Tvari
Spring framework - J2EE S Lidskou Tvari
 
Sphinxsearch by Pavel Severýn
Sphinxsearch by Pavel SeverýnSphinxsearch by Pavel Severýn
Sphinxsearch by Pavel Severýn
 
Ladění iOS aplikací nejen v Xcode [For Mobile červen 2013]
Ladění iOS aplikací nejen v Xcode [For Mobile červen 2013]Ladění iOS aplikací nejen v Xcode [For Mobile červen 2013]
Ladění iOS aplikací nejen v Xcode [For Mobile červen 2013]
 
Keyup presentation about Gulp
Keyup presentation about GulpKeyup presentation about Gulp
Keyup presentation about Gulp
 
Mikro­kontrolér s Wi-Fi za $3! nejen pro IOT
Mikro­kontrolér s Wi-Fi za $3! nejen pro IOTMikro­kontrolér s Wi-Fi za $3! nejen pro IOT
Mikro­kontrolér s Wi-Fi za $3! nejen pro IOT
 
Google App Engine
Google App EngineGoogle App Engine
Google App Engine
 
Czech Oracle Solaris Administrators Day 2011 - Solaris Express (OpenSolaris)
Czech Oracle Solaris Administrators Day 2011 - Solaris Express (OpenSolaris)Czech Oracle Solaris Administrators Day 2011 - Solaris Express (OpenSolaris)
Czech Oracle Solaris Administrators Day 2011 - Solaris Express (OpenSolaris)
 
Dependency injection v .Net Frameworku
Dependency injection v .Net FrameworkuDependency injection v .Net Frameworku
Dependency injection v .Net Frameworku
 
Slovak Sun Training Day 2010 - OpenSolaris
Slovak Sun Training Day 2010 - OpenSolarisSlovak Sun Training Day 2010 - OpenSolaris
Slovak Sun Training Day 2010 - OpenSolaris
 
JavaScript v GTM - Measure Camp Brno 2017
JavaScript v GTM - Measure Camp Brno 2017JavaScript v GTM - Measure Camp Brno 2017
JavaScript v GTM - Measure Camp Brno 2017
 
Easymock
EasymockEasymock
Easymock
 
Arduino naplno (Arduino Day 2015)
Arduino naplno (Arduino Day 2015)Arduino naplno (Arduino Day 2015)
Arduino naplno (Arduino Day 2015)
 

More from Petr Dvorak

Czech Banks are Under Attack, Clients Lose Money.
Czech Banks are Under Attack, Clients Lose Money.Czech Banks are Under Attack, Clients Lose Money.
Czech Banks are Under Attack, Clients Lose Money.Petr Dvorak
 
Innovations on Banking - Digital Banking Security in the Age of Open Banking
Innovations on Banking - Digital Banking Security in the Age of Open BankingInnovations on Banking - Digital Banking Security in the Age of Open Banking
Innovations on Banking - Digital Banking Security in the Age of Open BankingPetr Dvorak
 
mDevCamp 2016 - Zingly, or how to design multi-banking app
mDevCamp 2016 - Zingly, or how to design multi-banking appmDevCamp 2016 - Zingly, or how to design multi-banking app
mDevCamp 2016 - Zingly, or how to design multi-banking appPetr Dvorak
 
Jak vypadá ideální bankovní API?
Jak vypadá ideální bankovní API? Jak vypadá ideální bankovní API?
Jak vypadá ideální bankovní API? Petr Dvorak
 
Smart Cards and Devices Forum 2016 - Bezpečnost multi-banking mobilních aplikací
Smart Cards and Devices Forum 2016 - Bezpečnost multi-banking mobilních aplikacíSmart Cards and Devices Forum 2016 - Bezpečnost multi-banking mobilních aplikací
Smart Cards and Devices Forum 2016 - Bezpečnost multi-banking mobilních aplikacíPetr Dvorak
 
Bankovní API ve světě
Bankovní API ve světěBankovní API ve světě
Bankovní API ve světěPetr Dvorak
 
PSD2 a bankovní API: Top 5 mýtů, které dnes slyšíte
PSD2 a bankovní API: Top 5 mýtů, které dnes slyšítePSD2 a bankovní API: Top 5 mýtů, které dnes slyšíte
PSD2 a bankovní API: Top 5 mýtů, které dnes slyšítePetr Dvorak
 
Představení Zingly API Serveru a popis integrace
Představení Zingly API Serveru a popis integracePředstavení Zingly API Serveru a popis integrace
Představení Zingly API Serveru a popis integracePetr Dvorak
 
Lime - PowerAuth 2.0 and mobile QRToken introduction
Lime - PowerAuth 2.0 and mobile QRToken introductionLime - PowerAuth 2.0 and mobile QRToken introduction
Lime - PowerAuth 2.0 and mobile QRToken introductionPetr Dvorak
 
Lime - Push notifications. The big way.
Lime - Push notifications. The big way.Lime - Push notifications. The big way.
Lime - Push notifications. The big way.Petr Dvorak
 
Zingly - Dopad multi-bankingu a otevřených bankovních API do obchodního fungo...
Zingly - Dopad multi-bankingu a otevřených bankovních API do obchodního fungo...Zingly - Dopad multi-bankingu a otevřených bankovních API do obchodního fungo...
Zingly - Dopad multi-bankingu a otevřených bankovních API do obchodního fungo...Petr Dvorak
 
Co musí banka udělat pro zapojení do Zingly?
Co musí banka udělat pro zapojení do Zingly?Co musí banka udělat pro zapojení do Zingly?
Co musí banka udělat pro zapojení do Zingly?Petr Dvorak
 
Bezpečnost Zingly a detaily protokolu PowerAuth 2.0
Bezpečnost Zingly a detaily protokolu PowerAuth 2.0Bezpečnost Zingly a detaily protokolu PowerAuth 2.0
Bezpečnost Zingly a detaily protokolu PowerAuth 2.0Petr Dvorak
 
Zingly - Single app for all banks
Zingly - Single app for all banksZingly - Single app for all banks
Zingly - Single app for all banksPetr Dvorak
 
Fashiontech 2015 - iBeacon: Co to je a k čemu je to dobré?
Fashiontech 2015 - iBeacon: Co to je a k čemu je to dobré?Fashiontech 2015 - iBeacon: Co to je a k čemu je to dobré?
Fashiontech 2015 - iBeacon: Co to je a k čemu je to dobré?Petr Dvorak
 
Webinář: Co je to iBeacon a proč by vás to mělo zajímat?
Webinář: Co je to iBeacon a proč by vás to mělo zajímat?Webinář: Co je to iBeacon a proč by vás to mělo zajímat?
Webinář: Co je to iBeacon a proč by vás to mělo zajímat?Petr Dvorak
 
Chytré telefony v ČR - H1/2015
Chytré telefony v ČR -  H1/2015Chytré telefony v ČR -  H1/2015
Chytré telefony v ČR - H1/2015Petr Dvorak
 
What are "virtual beacons"?
What are "virtual beacons"?What are "virtual beacons"?
What are "virtual beacons"?Petr Dvorak
 
mDevCamp 2015 - iBeacon aneb jak ochytřit vaše aplikace o kontext uživatele
mDevCamp 2015 - iBeacon aneb jak ochytřit vaše aplikace o kontext uživatelemDevCamp 2015 - iBeacon aneb jak ochytřit vaše aplikace o kontext uživatele
mDevCamp 2015 - iBeacon aneb jak ochytřit vaše aplikace o kontext uživatelePetr Dvorak
 
iCON DEV - iBeacon, aneb jak ochytřit vaše aplikace o kontext uživatele
iCON DEV - iBeacon, aneb jak ochytřit vaše aplikace o kontext uživateleiCON DEV - iBeacon, aneb jak ochytřit vaše aplikace o kontext uživatele
iCON DEV - iBeacon, aneb jak ochytřit vaše aplikace o kontext uživatelePetr Dvorak
 

More from Petr Dvorak (20)

Czech Banks are Under Attack, Clients Lose Money.
Czech Banks are Under Attack, Clients Lose Money.Czech Banks are Under Attack, Clients Lose Money.
Czech Banks are Under Attack, Clients Lose Money.
 
Innovations on Banking - Digital Banking Security in the Age of Open Banking
Innovations on Banking - Digital Banking Security in the Age of Open BankingInnovations on Banking - Digital Banking Security in the Age of Open Banking
Innovations on Banking - Digital Banking Security in the Age of Open Banking
 
mDevCamp 2016 - Zingly, or how to design multi-banking app
mDevCamp 2016 - Zingly, or how to design multi-banking appmDevCamp 2016 - Zingly, or how to design multi-banking app
mDevCamp 2016 - Zingly, or how to design multi-banking app
 
Jak vypadá ideální bankovní API?
Jak vypadá ideální bankovní API? Jak vypadá ideální bankovní API?
Jak vypadá ideální bankovní API?
 
Smart Cards and Devices Forum 2016 - Bezpečnost multi-banking mobilních aplikací
Smart Cards and Devices Forum 2016 - Bezpečnost multi-banking mobilních aplikacíSmart Cards and Devices Forum 2016 - Bezpečnost multi-banking mobilních aplikací
Smart Cards and Devices Forum 2016 - Bezpečnost multi-banking mobilních aplikací
 
Bankovní API ve světě
Bankovní API ve světěBankovní API ve světě
Bankovní API ve světě
 
PSD2 a bankovní API: Top 5 mýtů, které dnes slyšíte
PSD2 a bankovní API: Top 5 mýtů, které dnes slyšítePSD2 a bankovní API: Top 5 mýtů, které dnes slyšíte
PSD2 a bankovní API: Top 5 mýtů, které dnes slyšíte
 
Představení Zingly API Serveru a popis integrace
Představení Zingly API Serveru a popis integracePředstavení Zingly API Serveru a popis integrace
Představení Zingly API Serveru a popis integrace
 
Lime - PowerAuth 2.0 and mobile QRToken introduction
Lime - PowerAuth 2.0 and mobile QRToken introductionLime - PowerAuth 2.0 and mobile QRToken introduction
Lime - PowerAuth 2.0 and mobile QRToken introduction
 
Lime - Push notifications. The big way.
Lime - Push notifications. The big way.Lime - Push notifications. The big way.
Lime - Push notifications. The big way.
 
Zingly - Dopad multi-bankingu a otevřených bankovních API do obchodního fungo...
Zingly - Dopad multi-bankingu a otevřených bankovních API do obchodního fungo...Zingly - Dopad multi-bankingu a otevřených bankovních API do obchodního fungo...
Zingly - Dopad multi-bankingu a otevřených bankovních API do obchodního fungo...
 
Co musí banka udělat pro zapojení do Zingly?
Co musí banka udělat pro zapojení do Zingly?Co musí banka udělat pro zapojení do Zingly?
Co musí banka udělat pro zapojení do Zingly?
 
Bezpečnost Zingly a detaily protokolu PowerAuth 2.0
Bezpečnost Zingly a detaily protokolu PowerAuth 2.0Bezpečnost Zingly a detaily protokolu PowerAuth 2.0
Bezpečnost Zingly a detaily protokolu PowerAuth 2.0
 
Zingly - Single app for all banks
Zingly - Single app for all banksZingly - Single app for all banks
Zingly - Single app for all banks
 
Fashiontech 2015 - iBeacon: Co to je a k čemu je to dobré?
Fashiontech 2015 - iBeacon: Co to je a k čemu je to dobré?Fashiontech 2015 - iBeacon: Co to je a k čemu je to dobré?
Fashiontech 2015 - iBeacon: Co to je a k čemu je to dobré?
 
Webinář: Co je to iBeacon a proč by vás to mělo zajímat?
Webinář: Co je to iBeacon a proč by vás to mělo zajímat?Webinář: Co je to iBeacon a proč by vás to mělo zajímat?
Webinář: Co je to iBeacon a proč by vás to mělo zajímat?
 
Chytré telefony v ČR - H1/2015
Chytré telefony v ČR -  H1/2015Chytré telefony v ČR -  H1/2015
Chytré telefony v ČR - H1/2015
 
What are "virtual beacons"?
What are "virtual beacons"?What are "virtual beacons"?
What are "virtual beacons"?
 
mDevCamp 2015 - iBeacon aneb jak ochytřit vaše aplikace o kontext uživatele
mDevCamp 2015 - iBeacon aneb jak ochytřit vaše aplikace o kontext uživatelemDevCamp 2015 - iBeacon aneb jak ochytřit vaše aplikace o kontext uživatele
mDevCamp 2015 - iBeacon aneb jak ochytřit vaše aplikace o kontext uživatele
 
iCON DEV - iBeacon, aneb jak ochytřit vaše aplikace o kontext uživatele
iCON DEV - iBeacon, aneb jak ochytřit vaše aplikace o kontext uživateleiCON DEV - iBeacon, aneb jak ochytřit vaše aplikace o kontext uživatele
iCON DEV - iBeacon, aneb jak ochytřit vaše aplikace o kontext uživatele
 

Vývoj aplikací pro iOS

  • 1. V!voj aplikací pro iOS FI MUNI, 22. 4. 2011
  • 2. Obsah - 1. část • Vícevláknové aplikace • Asynchronní provádění operací • Bloky a GCD
  • 3. Obsah - 2. část • Práce s daty na iOS • Zpracování XML a JSONu • Persistence dat
  • 4. Obsah - 2. část • Polohové slu#by • Core Location • MapKit
  • 5. Obsah - 3. část • Systémové dialogy a komunikace mezi aplikacemi • Získání fotografie a kontaktů • URL Schémata
  • 6. Kdy# zbyde čas... • Freestyle na témata • Práce s UIWebView • Lokalizace aplikací
  • 8. Proč vlákna? • Pomalé operace nesmí blokovat hlavní vlákno • Operace UIKitu musí bě#et na hlavním vlákně
  • 9. Pattern • Dlouhotrvající operace - separátní vlákno • Update UI - hlavní vlákno
  • 12. NSThread - (void) detachAsyncOperation { [NSThread detachNewThreadSelector:@selector(operation:) toTarget:self withObject:contextData]; } - (void) operation:(id)contextData { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // slow code here [self performSelectorOnMainThread:@selector(updateUI:) withObject:contextData waitUntilDone:NO]; [pool release]; }
  • 13. NSThread NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(operation:) object:context]; [thread setThreadPriority:1.0]; // [0.0, 1.0], 1.0 = highest [thread start]; ... [thread cancel]; ... [thread release];
  • 14. Bloky
  • 15. Bloky ^ • “blok” = “kousek kódu” • "iroká "kála pou#ití v různ!ch částech SDK • ~ Lambda, ~ anonymní
  • 16. Bloky ^ BOOL (int a, int b) { /* code */ } ^ void (void) { /* code */ } ^ { /* code */ }
  • 17. Bloky typedef (void) (^myBlock_t)(int i) void repeat (int times, myBlock_t block) { for (int i = 0; i < times; i++) block(i); }
  • 18. Bloky int const = 10; myBlock_t iBlock = ^(int i) { NSLog(@”%d”, i * const); } repeat(5, iBlock);
  • 19. UIKit Animace imageView.alpha = 0.0; [UIView animateWithDuration:1.0 animations:^{ imageView.alpha = 1.0; } completion:^(BOOL finished) { // some completion code, possibly cleanup }];
  • 20. Bloky NSSet *iSet = [NSSet set]; // ... add objects to the set [set objectsPassingTest:^(id obj, BOOL *stop) { return [self testValue:id]; // custom comparison }];
  • 21. GCD
  • 22. GCD • Práce s NSThread je ubíjející • GCD (“Grand Central Dispatch”) práci zjednodu"uje • jazyk C, funkce začínají na “dispatch_”
  • 23. GCD • Dispatch Queue • fronta bloků (FIFO) • jsou reference-counted • dispatch_queue_create ! dispatch_release
  • 24. GCD dispatch_async(queue, ^ { // some slow code });
  • 25. GCD dispatch_async(network_queue, ^ { // some slow code dispatch_async(main_queue, ^{ // update UI }); });
  • 26. GCD • Dispatch Queue • dispatch_get_main_queue() • dispatch_get_global_queue(priority, 0); • dispatch_queue_create("eu.inmite.net", NULL);
  • 27. GCD • Dispatch Semaphore • dispatch_semaphore_create • dispatch_semaphore_wait • dispatch_semaphore_signal
  • 28. GCD • 4 Dispatch Semaphore • dispatch_semaphore_create 3 • dispatch_semaphore_wait 2 • dispatch_semaphore_signal 1
  • 29. GCD • Dispatch Semaphore • dispatch_semaphore_create • dispatch_semaphore_wait 2 • dispatch_semaphore_signal 1
  • 30. GCD • Dispatch Semaphore • dispatch_semaphore_create • dispatch_semaphore_wait • dispatch_semaphore_signal !
  • 31. GCD • 4 Dispatch Semaphore • dispatch_semaphore_create 3 • dispatch_semaphore_wait 2 • dispatch_semaphore_signal 1
  • 32. GCD • Dispatch Source • reakce na systémové události • soubory, sockety, timer, ...
  • 34. Singleton Pattern // within class Foo + (Foo*) getDefault { static Foo *inst = nil; if (!inst) { inst = [[Foo alloc] init]; // create the instance } return inst; }
  • 35. Singleton Pattern // within class Foo + (Foo*) getDefault { static Foo *inst = nil; @synchronized (self) { if (!inst) { inst = [[Foo alloc] init]; // create the instance } } return inst; }
  • 36. Singleton Pattern // within class Foo + (Foo*) getDefault { static Foo *inst = nil; if (!inst) { @synchronized (self) { if (!inst) { inst = [[Foo alloc] init]; // create the instance ??? } } } return inst; }
  • 37. Singleton Pattern // within class Foo + (Foo*) getDefault { static Foo volatile *inst = nil; if (!inst) { @synchronized (self) { if (!inst) { Foo *tmp = [[Foo alloc] init]; // create the instance OSMemoryBarrier(); inst = foo; } } } OSMemoryBarrier(); return inst; }
  • 38. Singleton Pattern // within class Foo + (Foo*) getDefault { static dispatch_once_t pred; static Foo *inst; dispatch_once(&pred, ^ { inst = [[Foo alloc] init] }); return inst; }
  • 40. NSOperation • Abstrakce nad “operací” • Určeno pro subclassování • KVO compliant
  • 41. NSOperation • Informace o stavu operace • isCancelled, isFinished, isExecuting, ... • Mo#nost nastavení priority • Závislosti operací • [op1 addDependency:op2];
  • 42. NSOperation • main - kód, kter! se má vykonat • start - spustí operaci • cancel - nastaví příznak zru"ení
  • 43. NSOperation • K dispozici podtřídy • NSInvocationOperation • NSBlockOperation
  • 44. NSInvocationOperation • Operace vycházející ze selektoru [[NSInvocationOperation alloc] initWithTarget:target selector:selector object:context];
  • 45. NSBlockOperation • Operace přijímající blok [NSBlockOperation blockOperationWithBlock:^{ // some code... }];
  • 46. Spu"tění operace - (BOOL)performOperation:(NSOperation*)anOp { BOOL ranIt = NO; if ([anOp isReady] && ![anOp isCancelled]) { if (![anOp isConcurrent]) [anOp start]; else [NSThread detachNewThreadSelector:@selector(start) toTarget:anOp withObject:nil]; ranIt = YES; } else if ([anOp isCancelled]) { [self willChangeValueForKey:@"isFinished"]; [self willChangeValueForKey:@"isExecuting"]; executing = NO; finished = YES; [self didChangeValueForKey:@"isExecuting"]; [self didChangeValueForKey:@"isFinished"]; ranIt = YES; } return ranIt; }
  • 47. NSOperationQueue • Snadné spou"tění instancí NSOperation • Jedna NSOperationQueue instance ~ funkčnost • Mo#nost nastavit počet paralelních operací
  • 48. Spu"tění operace [queue addOperation:anOperation];
  • 49. NSOperationQueue [NSOperationQueue mainQueue]; [NSOperationQueue currentQueue];
  • 50. Práce s daty na iOS
  • 52. XML • SAX - NSXMLParser • součást Apple iOS SDK • DOM - TouchXML, KissXML, ... • XML ! Strom
  • 53. Touch XML • Modified BSD Licence • DOM parser + XPath, XML Namespaces • https://github.com/TouchCode/TouchXML
  • 54. JSON •JavaScript Object Notation • JSON Framework { "id": 1, "name": "Foo", "price": 123, "tags": ["Bar","Eek"] }
  • 55. JSON Framework • New BSD Licence • JSON parser a generator • http://stig.github.com/json-framework/
  • 57. iOS Filesystem • Aplikace jsou omezené na svůj sandbox • Nemohou číst ani psát mimo něj • Ka#dá aplikace má svůj “Home directory”
  • 58. iOS Filesystem • Documents • slo#ka pro u#ivatelské dokumenty • zálohuje se do iTunes
  • 59. iOS Filesystem • Caches • slo#ka pro soubory cache • nezálohuje se do iTunes
  • 60. iOS Filesystem • Temp • slo#ka pro dočasné soubory • nezálohuje se do iTunes
  • 61. iOS Filesystem // temporary directory NSString *tmpDir = NSTemporaryDirectory(); // documents or caches directory // NSDocuentsDirectory, NSCachesDirectory NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask,YES); NSString *cacheDir = [paths objectAtIndex:0]; NSString *path = [cacheDir stringByAppendingPathComponent:fileName];
  • 62. Property list • formát pro objektovou persistenci • dvě varianty: XML a binární varianta (Apple)
  • 63. Property list <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>title</key> <string>Blue socks</string> <key>are_new</key> <true/> <key>colors</key> <array> <string>blue</string> </array> </dict> </plist>
  • 64. Property list • NSArray, NSDictionary • lze zapisovat a číst z plistu
  • 65. NSCoding •Protokol pro serializaci objektu • encodeWithCoder • decodeWithCoder
  • 66. NSCoding - (void)encodeWithCoder:(NSCoder *)encoder { // [super initWithCoder:coder]; for subclasses [encoder encodeObject:[self title] forKey:@"title"]; [encoder encodeObject:[self description] forKey:@"description"]; [encoder encodeObject:[self fullContent] forKey:@"fullcontent"]; [encoder encodeObject:[self href] forKey:@"href"]; [encoder encodeObject:[self locationStr] forKey:@"locationstr"]; [encoder encodeObject:[self imageURL] forKey:@"imageurl"]; [encoder encodeBool:[self read] forKey:@"read"]; }
  • 67. NSCoding - (id)initWithCoder:(NSCoder *)decoder { // [super initWithDecoder:decoder]; for subclasses if (self = [super init]) { [self setTitle:[decoder decodeObjectForKey:@"title"]]; [self setDescription:[decoder decodeObjectForKey:@"description"]]; [self setFullContent:[decoder decodeObjectForKey:@"fullcontent"]]; [self setHref:[decoder decodeObjectForKey:@"href"]]; [self setLocationStr:[decoder decodeObjectForKey:@"locationstr"]]; [self setImageURL:[decoder decodeObjectForKey:@"imageurl"]]; [self setRead:[decoder decodeBoolForKey:@"read"]]; } return self; }
  • 68. NSKeyedArchiver BOOL success = [NSKeyedArchiver archiveRootObject:self toFile:path];
  • 69. NSKeyedUnarchiver MyModel *model = (MyModel*)[NSKeyedUnarchiver unarchiveObjectWithFile:path];
  • 70. NSUserDefaults • Místo pro ukládání u#ivatelského nastavení aplikace • Pod pokličkou je PList
  • 71. NSUserDefaults NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setValue:@”Blue socks” forKey:@”title”]; [userDefaults setBool:YES forKey:@”are_new”]; [userDefaults synchronize]; NSString *title = [userDefaults valueForKey:@”title”]; BOOL are_new = [userDefaults boolForKey:@”are_new”];
  • 72. NSUserDefaults • Mo#nost registrace do aplikace “Settings” • Soubor “Settings.bundle” • PSTextFieldSpecifier, PSToggleSwitchSpecifier, PSSliderSpecifier, ... • pouze “deklarativní nastavení”
  • 73. SQLite3 • Light-weight SQL implementace • Vhodná pro mobilní zařízení • Součástí Apple iOS SDK • Implementace v C, existují wrappery
  • 74. FMDB • MIT Licence • Light-weight Objective-C wrapper nad SQLite • https://github.com/ccgus/fmdb
  • 75. CoreData • Ře"ení Apple pro management modelu (object graph) a persistenci dat • podobné ORM (ale není to ORM) • Pod pokličkou SQLite • Vizuální tvorba modelu
  • 79. MKMapView • Implementace online Google Map • Podpora pro různé typy map • Poměrně omezená, ale stačí
  • 80. MKAnnotation • Protokol • Model pro “napínáčky” na mapě • anotace se přidá do mapy, vrací svou pozici a titulek
  • 81. MKAnnotationView • View anotace na mapě (“napínáček”) • Pou#ívá concept reusable identifikátoru • MKPinAnnotationView
  • 82. CLLocationManager • Zji"tění aktuální polohy zařízení • Umo#ňuje nastavit po#adovanou přesnost • Dodává pravidelně update pozice
  • 84. Systémové dialogy • Aplikace v SandBoxu • Definované API pro funkce telefonu
  • 85. Image Picker • Fotoaparát, galerie telefonu • UIImagePickerViewController
  • 86. Person Picker • Volba kontaktů • ABPeoplePickerNavigationController
  • 88. URL Schémata • Způsob, jak spou"tět jiné aplikace • Umo#ňuje předávat “malá data”
  • 89. URL Schémata if ([[UIApplication sharedApplication] canOpenURL:url]) { [[UIApplication sharedApplication] openURL:url]; }
  • 90. URL Schémata • http://www.abc.com/ - Safari • nebo Google Maps,YouTube či iTunes • mailto:mail@example.com - Mail • tel:777123456 - Phone • sms:777123456 - SMS
  • 91. URL Schémata • Aplikace mů#e registrovat své URL schéma • Jiná aplikace ji mů#e spustit • Rejstřík: http://handleopenurl.com/
  • 92. Facebook • Autentizace pou#ívá custom URL schéma • Facebook SDK for iPhone • https://github.com/facebook/facebook-ios-sdk

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n
  111. \n
  112. \n
  113. \n