+ All Categories
Home > Technology > Vývoj aplikací pro iOS

Vývoj aplikací pro iOS

Date post: 08-Jun-2015
Category:
Upload: petr-dvorak
View: 2,460 times
Download: 2 times
Share this document with a friend
Description:
Přednáška pokrývá úvod do mírně pokročilých oblastí vývoje pro iOS. - vícevláknové programování - práce s XML a JSON na iOS - datová persistence - MapKit a Core Location - Systémové dialogy - URL schémata
93
V!voj aplikací pro iOS FI MUNI, 22. 4. 2011
Transcript
Page 1: Vývoj aplikací pro iOS

V!voj aplikací pro iOSFI MUNI, 22. 4. 2011

Page 2: Vývoj aplikací pro iOS

Obsah - 1. část

• Vícevláknové aplikace

• Asynchronní provádění operací

• Bloky a GCD

Page 3: Vývoj aplikací pro iOS

Obsah - 2. část

• Práce s daty na iOS

• Zpracování XML a JSONu

• Persistence dat

Page 4: Vývoj aplikací pro iOS

Obsah - 2. část

• Polohové slu#by

• Core Location

• MapKit

Page 5: Vývoj aplikací pro iOS

Obsah - 3. část

• Systémové dialogy a komunikace mezi aplikacemi

• Získání fotografie a kontaktů• URL Schémata

Page 6: Vývoj aplikací pro iOS

Kdy# zbyde čas...

• Freestyle na témata

• Práce s UIWebView

• Lokalizace aplikací

Page 7: Vývoj aplikací pro iOS

Vícevláknové aplikace

Page 8: Vývoj aplikací pro iOS

Proč vlákna?

• Pomalé operace nesmí blokovat hlavní vlákno

• Operace UIKitu musí bě#et na hlavním vlákně

Page 9: Vývoj aplikací pro iOS

Pattern

• Dlouhotrvající operace - separátní vlákno

• Update UI - hlavní vlákno

Page 10: Vývoj aplikací pro iOS

NSThread

Page 11: Vývoj aplikací pro iOS

NSThread

• Nízkoúrovňová abstrakce nad vlákny

Page 12: Vývoj aplikací pro iOS

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];}

Page 13: Vývoj aplikací pro iOS

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];

Page 14: Vývoj aplikací pro iOS

Bloky

Page 15: Vývoj aplikací pro iOS

Bloky

• “blok” = “kousek kódu”

• "iroká "kála pou#ití v různ!ch částech SDK

• ~ Lambda, ~ anonymní

^

Page 16: Vývoj aplikací pro iOS

Bloky

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

^ void (void) { /* code */ }^ { /* code */ }

Page 17: Vývoj aplikací pro iOS

Bloky

typedef (void) (^myBlock_t)(int i)

void repeat (int times, myBlock_t block) { for (int i = 0; i < times; i++) block(i);}

Page 18: Vývoj aplikací pro iOS

Bloky

int const = 10;

myBlock_t iBlock = ^(int i) {

NSLog(@”%d”, i * const);

}

repeat(5, iBlock);

Page 19: Vývoj aplikací pro iOS

UIKit Animace

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

Page 20: Vývoj aplikací pro iOS

Bloky

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

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

Page 21: Vývoj aplikací pro iOS

GCD

Page 22: Vývoj aplikací pro iOS

GCD

• Práce s NSThread je ubíjející

• GCD (“Grand Central Dispatch”) práci zjednodu"uje

• jazyk C, funkce začínají na “dispatch_”

Page 23: Vývoj aplikací pro iOS

GCD

• Dispatch Queue

• fronta bloků (FIFO)

• jsou reference-counted

• dispatch_queue_create ! dispatch_release

Page 24: Vývoj aplikací pro iOS

GCD

dispatch_async(queue, ^ { // some slow code});

Page 25: Vývoj aplikací pro iOS

GCD

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

Page 26: Vývoj aplikací pro iOS

GCD

• Dispatch Queue

• dispatch_get_main_queue()

• dispatch_get_global_queue(priority, 0);

• dispatch_queue_create("eu.inmite.net", NULL);

Page 32: Vývoj aplikací pro iOS

GCD

• Dispatch Source

• reakce na systémové události

• soubory, sockety, timer, ...

Page 33: Vývoj aplikací pro iOS

Singleton

Page 34: Vývoj aplikací pro iOS

Singleton Pattern

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

Page 35: Vývoj aplikací pro iOS

Singleton Pattern

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

Page 36: Vývoj aplikací pro iOS

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;} ???

Page 37: Vývoj aplikací pro iOS

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;}

Page 38: Vývoj aplikací pro iOS

Singleton Pattern

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

Page 39: Vývoj aplikací pro iOS

Operation Queues

Page 40: Vývoj aplikací pro iOS

NSOperation

• Abstrakce nad “operací”

• Určeno pro subclassování

• KVO compliant

Page 41: Vývoj aplikací pro iOS

NSOperation

• Informace o stavu operace

• isCancelled, isFinished, isExecuting, ...

• Mo#nost nastavení priority

• Závislosti operací

• [op1 addDependency:op2];

Page 42: Vývoj aplikací pro iOS

NSOperation

• main - kód, kter! se má vykonat

• start - spustí operaci

• cancel - nastaví příznak zru"ení

Page 43: Vývoj aplikací pro iOS

NSOperation

• K dispozici podtřídy

• NSInvocationOperation

• NSBlockOperation

Page 44: Vývoj aplikací pro iOS

NSInvocationOperation

• Operace vycházející ze selektoru

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

Page 45: Vývoj aplikací pro iOS

NSBlockOperation

• Operace přijímající blok

[NSBlockOperation blockOperationWithBlock:^{ // some code...}];

Page 46: Vývoj aplikací pro iOS

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;}

Page 47: Vývoj aplikací pro iOS

NSOperationQueue

• Snadné spou"tění instancí NSOperation

• Jedna NSOperationQueue instance ~ funkčnost

• Mo#nost nastavit počet paralelních operací

Page 48: Vývoj aplikací pro iOS

Spu"tění operace

[queue addOperation:anOperation];

Page 49: Vývoj aplikací pro iOS

NSOperationQueue

[NSOperationQueue mainQueue];

[NSOperationQueue currentQueue];

Page 50: Vývoj aplikací pro iOS

Práce s daty na iOS

Page 51: Vývoj aplikací pro iOS

ZpracováníXML a JSON

Page 52: Vývoj aplikací pro iOS

XML

• SAX - NSXMLParser

• součást Apple iOS SDK

• DOM - TouchXML, KissXML, ...

• XML ! Strom

Page 53: Vývoj aplikací pro iOS

Touch XML

• Modified BSD Licence

• DOM parser + XPath, XML Namespaces

• https://github.com/TouchCode/TouchXML

Page 54: Vývoj aplikací pro iOS

JSON

• JavaScript Object Notation

• JSON Framework

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

Page 55: Vývoj aplikací pro iOS

JSON Framework

• New BSD Licence

• JSON parser a generator

• http://stig.github.com/json-framework/

Page 56: Vývoj aplikací pro iOS

Persistence dat

Page 57: Vývoj aplikací pro iOS

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”

Page 58: Vývoj aplikací pro iOS

iOS Filesystem

• Documents

• slo#ka pro u#ivatelské dokumenty

• zálohuje se do iTunes

Page 59: Vývoj aplikací pro iOS

iOS Filesystem

• Caches

• slo#ka pro soubory cache

• nezálohuje se do iTunes

Page 60: Vývoj aplikací pro iOS

iOS Filesystem

• Temp

• slo#ka pro dočasné soubory

• nezálohuje se do iTunes

Page 61: Vývoj aplikací pro iOS

iOS Filesystem

// temporary directoryNSString *tmpDir = NSTemporaryDirectory();

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

NSString *path = [cacheDir stringByAppendingPathComponent:fileName];

Page 62: Vývoj aplikací pro iOS

Property list

• formát pro objektovou persistenci

• dvě varianty: XML a binární varianta (Apple)

Page 63: Vývoj aplikací pro iOS

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>

Page 64: Vývoj aplikací pro iOS

Property list

• NSArray, NSDictionary

• lze zapisovat a číst z plistu

Page 65: Vývoj aplikací pro iOS

NSCoding

• Protokol pro serializaci objektu

• encodeWithCoder

• decodeWithCoder

Page 66: Vývoj aplikací pro iOS

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"];}

Page 67: Vývoj aplikací pro iOS

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;}

Page 68: Vývoj aplikací pro iOS

NSKeyedArchiver

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

Page 69: Vývoj aplikací pro iOS

NSKeyedUnarchiver

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

Page 70: Vývoj aplikací pro iOS

NSUserDefaults

• Místo pro ukládání u#ivatelského nastavení aplikace

• Pod pokličkou je PList

Page 71: Vývoj aplikací pro iOS

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”];

Page 72: Vývoj aplikací pro iOS

NSUserDefaults

• Mo#nost registrace do aplikace “Settings”

• Soubor “Settings.bundle”

• PSTextFieldSpecifier, PSToggleSwitchSpecifier, PSSliderSpecifier, ...

• pouze “deklarativní nastavení”

Page 73: Vývoj aplikací pro iOS

SQLite3

• Light-weight SQL implementace

• Vhodná pro mobilní zařízení

• Součástí Apple iOS SDK

• Implementace v C, existují wrappery

Page 74: Vývoj aplikací pro iOS

FMDB

• MIT Licence

• Light-weight Objective-C wrapper nad SQLite

• https://github.com/ccgus/fmdb

Page 75: Vývoj aplikací pro iOS

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

Page 76: Vývoj aplikací pro iOS

CoreData

Page 77: Vývoj aplikací pro iOS

Polohové slu#by

Page 78: Vývoj aplikací pro iOS

MapKit Framework

Page 79: Vývoj aplikací pro iOS

MKMapView

• Implementace online Google Map

• Podpora pro různé typy map

• Poměrně omezená, ale stačí

Page 80: Vývoj aplikací pro iOS

MKAnnotation

• Protokol

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

titulek

Page 81: Vývoj aplikací pro iOS

MKAnnotationView

• View anotace na mapě (“napínáček”)

• Pou#ívá concept reusable identifikátoru

• MKPinAnnotationView

Page 82: Vývoj aplikací pro iOS

CLLocationManager

• Zji"tění aktuální polohy zařízení

• Umo#ňuje nastavit po#adovanou přesnost

• Dodává pravidelně update pozice

Page 83: Vývoj aplikací pro iOS

Systémové dialogy

Page 84: Vývoj aplikací pro iOS

Systémové dialogy

• Aplikace v SandBoxu

• Definované API pro funkce telefonu

Page 85: Vývoj aplikací pro iOS

Image Picker

• Fotoaparát, galerie telefonu

• UIImagePickerViewController

Page 86: Vývoj aplikací pro iOS

Person Picker

• Volba kontaktů• ABPeoplePickerNavigationController

Page 87: Vývoj aplikací pro iOS

URL Schémata

Page 88: Vývoj aplikací pro iOS

URL Schémata

• Způsob, jak spou"tět jiné aplikace

• Umo#ňuje předávat “malá data”

Page 89: Vývoj aplikací pro iOS

URL Schémata

if ([[UIApplication sharedApplication] canOpenURL:url]) { [[UIApplication sharedApplication] openURL:url];}

Page 90: Vývoj aplikací pro iOS

URL Schémata

• http://www.abc.com/ - Safari

• nebo Google Maps, YouTube či iTunes

• mailto:[email protected] - Mail

• tel:777123456 - Phone

• sms:777123456 - SMS

Page 91: Vývoj aplikací pro iOS

URL Schémata

• Aplikace mů#e registrovat své URL schéma

• Jiná aplikace ji mů#e spustit

• Rejstřík: http://handleopenurl.com/

Page 92: Vývoj aplikací pro iOS

Facebook

• Autentizace pou#ívá custom URL schéma

• Facebook SDK for iPhone

• https://github.com/facebook/facebook-ios-sdk

Page 93: Vývoj aplikací pro iOS

Děkuji@inmite


Recommended