ios developer overview - devweek 2014

196
iOS Application Development iOS Developer Overview Paul Ardeleanu

Upload: hello24com

Post on 15-May-2015

745 views

Category:

Technology


0 download

DESCRIPTION

So, you're a developer, but you have never worked with iOS? In this session, Ardeleanu will provide a head start on how to plan, build, debug and release iOS 7 apps. The talk will cover a wide range of topics, including: the App Store ecosystem; the nature of an app; iOS 7's new UI and how to migrate from iOS 6; interface design; dev tools (Xcode – IDE, Simulator, Instruments – docs, etc); design patterns; debugging and optimisation; App Store and ad-hoc distribution; and what makes an app successfully.

TRANSCRIPT

Page 1: iOS Developer Overview - DevWeek 2014

iOS Application Development

iOS Developer OverviewPaul Ardeleanu

Page 2: iOS Developer Overview - DevWeek 2014
Page 3: iOS Developer Overview - DevWeek 2014

Assumptions…

You are:‣ a developer of sorts…

‣ have no or little exposure to iOS

‣ want to learn enough to become ‘dangerous’

Page 4: iOS Developer Overview - DevWeek 2014

The plan

‣ Why iOS?

‣ Tools

‣ Storyboarding

‣ Objective-C

‣ Design patterns

‣ Debug & Testing

‣ Ad-Hoc distribution

‣ Publishing in the app store

Page 5: iOS Developer Overview - DevWeek 2014

iOS Application Development

Why iOS?

Page 6: iOS Developer Overview - DevWeek 2014

iOS Application Development

Once upon a time…

Page 7: iOS Developer Overview - DevWeek 2014

… there were phoneshttp://www.flickr.com/photos/adrianblack/371301544/

Page 8: iOS Developer Overview - DevWeek 2014

Then the iPhone happened…

Page 9: iOS Developer Overview - DevWeek 2014

Before & after

https://twitter.com/JoshHelfferich

Page 10: iOS Developer Overview - DevWeek 2014

App Store

Page 11: iOS Developer Overview - DevWeek 2014

Global Phone Market Units shipped / quarter

© Asymco - used with permission

Page 12: iOS Developer Overview - DevWeek 2014

Smartphone shipments

© Asymco - used with permission

Page 13: iOS Developer Overview - DevWeek 2014

© Asymco - used with permission

Page 14: iOS Developer Overview - DevWeek 2014

iOS Application Development

Developer tools

Page 15: iOS Developer Overview - DevWeek 2014

Developer tools

Page 16: iOS Developer Overview - DevWeek 2014

Xcode

Page 17: iOS Developer Overview - DevWeek 2014

Xcode

Page 18: iOS Developer Overview - DevWeek 2014

iOS Simulator

Page 19: iOS Developer Overview - DevWeek 2014

Instruments

Page 20: iOS Developer Overview - DevWeek 2014

Instruments

Page 21: iOS Developer Overview - DevWeek 2014

CocoaPods.org

Page 22: iOS Developer Overview - DevWeek 2014

CocoaPods.org

Page 23: iOS Developer Overview - DevWeek 2014

Reveal

Page 24: iOS Developer Overview - DevWeek 2014

Documentation

Page 25: iOS Developer Overview - DevWeek 2014

Documentation

Page 26: iOS Developer Overview - DevWeek 2014

Documentation

Page 27: iOS Developer Overview - DevWeek 2014

Dash

Page 28: iOS Developer Overview - DevWeek 2014

Dash

Page 29: iOS Developer Overview - DevWeek 2014

Dash

Page 30: iOS Developer Overview - DevWeek 2014

iOS Application Development

Building great apps

Page 31: iOS Developer Overview - DevWeek 2014

Building great apps

‣ Constraints‣ small size

‣ limited hardware

‣ one screen at a time

‣ one application at a time *

‣ touch input

‣ Interaction‣ gestures

‣ shake

‣ orientation

‣ audio switch, volume buttons

‣ home & power buttons

Page 32: iOS Developer Overview - DevWeek 2014

List of features

too manyfeatures?

Filter

Yes

ApplicationDefinitionStatement

Appfeatures

User journeys

Wirefames

Prototype

Page 33: iOS Developer Overview - DevWeek 2014

Application Definition Statement

“A concise, concrete declaration of the app’s main purpose and its intended audience.”

https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/

Page 34: iOS Developer Overview - DevWeek 2014

Solve real problems

"An app must solve a user's problem clearly and elegantly."

Eric Hope, User Experience Evangelist, Apple

Page 35: iOS Developer Overview - DevWeek 2014

Delivery channels

‣ web app [dedicated]

‣ native app

‣ “hybrid” solutions

Page 36: iOS Developer Overview - DevWeek 2014

iOS Application Development

Storyboarding

Page 37: iOS Developer Overview - DevWeek 2014

What is Storyboarding

‣ Design the “screens” that compose your app => scenes

‣ Visually define the navigation between the scenes => segues

‣ Introduced in: iOS 5 & Xcode 4.2

Page 38: iOS Developer Overview - DevWeek 2014

Xcode 5 - default

Page 39: iOS Developer Overview - DevWeek 2014

Xcode 4 - optional

Page 40: iOS Developer Overview - DevWeek 2014

Main Storyboard

Page 41: iOS Developer Overview - DevWeek 2014

A simple app

Page 42: iOS Developer Overview - DevWeek 2014

Specialised View Controllers

‣ UITableViewController

‣ UINavigationController

‣ UITabBarController

‣ UICollectionView

Page 43: iOS Developer Overview - DevWeek 2014

UITableViewController

Page 44: iOS Developer Overview - DevWeek 2014

UINavigationController

Page 45: iOS Developer Overview - DevWeek 2014

UITabBarController

Page 46: iOS Developer Overview - DevWeek 2014

UIToolbar

Page 47: iOS Developer Overview - DevWeek 2014

UICollectionView

Page 48: iOS Developer Overview - DevWeek 2014

iOS 6 & 7

Page 49: iOS Developer Overview - DevWeek 2014

iPhone 3.5 vs 4-inch

Page 50: iOS Developer Overview - DevWeek 2014

iOS Application Development

Objective-C

Page 51: iOS Developer Overview - DevWeek 2014

What is Objective C

‣ Thin layer on top of C; strict superset of C

‣ Object-oriented programming language

‣ Inspired by SmallTalk

‣ Developed by Stepstone / NeXT Software / Apple

‣ The development language for Mac OSX & iOS devices

Page 52: iOS Developer Overview - DevWeek 2014

Object-Oriented Programminga programming paradigm that uses "objects"

!myCar

• Number of wheels

• Number of seats

• Colour

• Engine size

• Top speed

• Drive

• Brake

• Turn Left

• Beep

• Fill with petrol

MethodsProperties

Data + Behaviour

Page 53: iOS Developer Overview - DevWeek 2014

Vehicle classInterface .h Implementation .m

Vehicle.h Vehicle.m

@interface  Vehicle  {     int  wheels;         int  seats;      }  !-­‐  (void)drive;  -­‐  (void)setWheels:(int)n;  !@end

#import  "Vehicle.h"  !@implementation  Vehicle  !-­‐  (void)setWheels:(int)n  {     wheels  =  n;      }  !-­‐  (void)drive  {     …      }  !@end

Page 54: iOS Developer Overview - DevWeek 2014

Methods syntax

-­‐  (void)setWheels:(int)n;

return type name argument typeargument name

type

Page 55: iOS Developer Overview - DevWeek 2014

Multiple arguments

-­‐  (BOOL)application:(UIApplication  *)application  didFinishLaunchingWithOptions:(NSDictionary  *)launchOptions

application:didFinishLaunchingWithOptions:

The name of the method is:

Page 56: iOS Developer Overview - DevWeek 2014

Multiple arguments

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;

+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations;

Page 57: iOS Developer Overview - DevWeek 2014

Multiple arguments

[UIView animateWithDuration:1.0 delay:0.3 options:UIViewAnimationOptionCurveEaseIn animations:^{ // animations } completion:^(BOOL finished) { // completion block } ];

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;

Page 58: iOS Developer Overview - DevWeek 2014

Properties

@implementation  Vehicle  !-­‐  (int)wheels  {     return  wheels;      }  !-­‐  (void)setWheels:(int)n  {     wheels  =  n;      }  !@end

@interface  Vehicle  :  NSObject  {     int  wheels;      }  !-­‐  (int)wheels;  -­‐  (void)setWheels:(int)n;  !@end

@implementation  Vehicle  !!!@end

@interface  Vehicle  :  NSObject  {  !}  !@property  int  noWheels;  !@end

  int  numberWheels;    

@synthesize  numberWheels;

Page 59: iOS Developer Overview - DevWeek 2014

Properties & dot notation

Vehicle  *myCar  =  [Vehicle  new];  !myCar.wheels  =  5;  !myCar.wheels  

Page 60: iOS Developer Overview - DevWeek 2014

What is a method?

typedef  struct  objc_selector  *SEL;

!Vehicle  *myCar  =  [Vehicle  new];  ![myCar  drive];

objc_msgSend(myCar,  @selector(drive))

Page 61: iOS Developer Overview - DevWeek 2014

Sending a message

-­‐  (void)setWheels:  (int)n;

[myCar  setWheels:4];

objc_msgSend(myCar,  @selector(setWheels:),  4);

Page 62: iOS Developer Overview - DevWeek 2014

Sending a message!Vehicle  *myCar  =  nil;  ![myCar  drive];

  myCar  =  ...;             if  ([myCar  respondsToSelector:@selector(drive)])  {        [myCar  drive];       }  

Page 63: iOS Developer Overview - DevWeek 2014

InitialisersVehicle *myCar = [Vehicle new];

-­‐  (id)initWithWheels:(int)wheels  {     self  =  [super  init];         if  (nil  !=  self)  {          //  Custom  initialization          self.wheels  =  wheels;         }         return  self;      }

Vehicle *myCar = [[Vehicle alloc] initWithWheels:4];

Vehicle *myCar = [[Vehicle alloc] init];

Page 64: iOS Developer Overview - DevWeek 2014

InitialisersMultiple

@interface  Vehicle  :  NSObject  !@property  int  wheels;  @property  int  seats;  !-­‐  (id)initWithWheels:(int)wheels  andSeats:(int)seats;  -­‐  (id)initWithWheels:(int)wheels;  -­‐  (id)initWithSeats:(int)seats;  !@end

Page 65: iOS Developer Overview - DevWeek 2014

InitialisersMultiple

-­‐  (id)init  {     return  [self  initWithWheels:DefaultNumberWheels  andSeats:DefaultNumberSeats];      }  

#define  DefaultNumberWheels  4  #define  DefaultNumberSeats  5

-­‐  (id)initWithWheels:(int)wheels  andSeats:(int)seats{     self  =  [super  init];         if  (nil  !=  self)  {      

self.wheels  =  wheels;  self.seats  =  seats;  

  }         return  self;      }

-­‐  (id)initWithWheels:(int)wheels  {     return  [self  initWithWheels:wheels  andSeats:                                    ];      }

-­‐  (id)initWithNumberSeats:(int)seats  {     return  [self  initWithWheels:DefaultNumberWheels  andSeats:seats];      }

DefaultNumberSeats

Page 66: iOS Developer Overview - DevWeek 2014

Inheritance

@interface  Truck  :  Vehicle    !!!!!!!!!!!@end  

@interface  Vehicle  :  NSObject    !@property  int  wheels;  @property  int  seats;  !-­‐  (void)drive;  !@end -­‐  (void)checkLoad;  

-­‐  (void)loadWithWeight:(int)weight;  -­‐  (void)unload;

                                                     {     int  maxWeight;      }

@property  int  currentWeight;

Page 67: iOS Developer Overview - DevWeek 2014

InheritanceNSObject

NSPredicateNSArray

NSComparisonPredicateNSMutableArray

UIResponder

UIView

UIWindow UIControl

UIButton

UIGestureRecognizer

UIApplicationNSNumber

NSValue

Page 68: iOS Developer Overview - DevWeek 2014

instance

class

isa

superclass

superclass

metaclassisa

metaclassisa

superclass

NSObject

superclass

superclass

nil

metaclassisa

superclass

superclass

Page 69: iOS Developer Overview - DevWeek 2014

Polymorphism & Dynamic typing

Vehicle

Truck !

- (void)drive

Car !

- (void)drive

id  aVehicle;  !...  ![aVehicle  drive];

Page 70: iOS Developer Overview - DevWeek 2014

id‣ the generic object type

‣ can be used for object of any type

‣ the object class is determined at runtime (dynamic typing)

Vehicle  *aCar;

Static typing

id  aCar;

Dynamic typing

Page 71: iOS Developer Overview - DevWeek 2014

Introspection

NSObject

- (BOOL)isKindOfClass:(Class)aClass; - (BOOL)isMemberOfClass:(Class)aClass;

- (Class)superclass; - (Class)class;

- (BOOL)respondsToSelector:(SEL)aSelector;

Page 72: iOS Developer Overview - DevWeek 2014

Protocols

-­‐  (void)load;  -­‐  (void)unload;  -­‐  (float)getWeight;

@interface  Truck  :  Vehicle

@end

Page 73: iOS Developer Overview - DevWeek 2014

Protocols

-­‐  (void)load;  -­‐  (void)unload;  -­‐  (float)getWeight;

@implementation  Truck  !!!!!!!!!!!!!@end

-­‐  (void)load  {     ...      }  -­‐  (void)unload  {     ...      }  -­‐  (float)getWeight  {     ...      }  

@interface  Truck  :  Vehicle

@end

Page 74: iOS Developer Overview - DevWeek 2014

Protocols

-­‐  (void)load;  -­‐  (void)unload;  -­‐  (float)getWeight;

@interface  Truck  :  Vehicle

@end

@protocol  VehicleLoading

@end

<VehicleLoading>

Page 75: iOS Developer Overview - DevWeek 2014

Protocols

-­‐  (void)load;  -­‐  (void)unload;  -­‐  (float)getWeight;

@interface  Truck  :  Vehicle

@end

@protocol  VehicleLoading

@end

<VehicleLoading>

@implementation  Truck  !!!!!!!!!!!!!@end

-­‐  (void)load  {     ...        }  -­‐  (void)unload  {     ...        }  -­‐  (float)getWeight  {     ...        }  

Page 76: iOS Developer Overview - DevWeek 2014

Category

@interface  Vehicle  :  NSObject    !...  !-­‐  (void)drive;  -­‐  (void)brake;  !@end

!Vehicle  *myCar  =  [Vehicle  new];  

[myCar  steerLeft];

Page 77: iOS Developer Overview - DevWeek 2014

Category

@interface NSString : NSObject !!!!!!@end

Page 78: iOS Developer Overview - DevWeek 2014

@interface NSString : NSObject !!!!!!@end

Category

- (NSUInteger)wordCount;

Page 79: iOS Developer Overview - DevWeek 2014

Category

#import  "NSString.h"  !@interface  NSString  (H24Utils)  !-­‐  (NSUInteger)wordCount;  !@end

NSString+H24Utils.h NSString+H24Utils.m

Page 80: iOS Developer Overview - DevWeek 2014

Category

#import  "NSString.h"  !@interface  NSString  (H24Utils)  !-­‐  (NSUInteger)wordCount;  !@end

NSString+H24Utils.h NSString+H24Utils.m

#import  "NSString+H24Utils.h"  !@implementation  NSString  (H24Utils)  !-­‐  (NSUInteger)wordCount  {     …      }  !@end

Page 81: iOS Developer Overview - DevWeek 2014

Naming conventions

Classes

Objects

camelCase with capitalised first letter (a.k.a. Pascal case)

Prefixes

HelloWorldViewController  

camelCaseviewController,  myCar  

NSArray,  UIView  

Page 82: iOS Developer Overview - DevWeek 2014

BOOL data type

typedef  signed  char     BOOL;  !#define  YES  (BOOL)1  #define  NO    (BOOL)0

Page 83: iOS Developer Overview - DevWeek 2014

Blocks

void  (^sayHello)(NSString  *)  =  ^(NSString  *name)  {       NSLog(@“Hello  %@",  name);        };

NSString  *sayHello  =  @"Hello  World";

Page 84: iOS Developer Overview - DevWeek 2014

Blocks

void  (^sayHello)(NSString  *);  !sayHello  =  ^(NSString  *name)  {          NSLog(@"Hello  %@",  name);  };

void  (^sayHello)(NSString  *)  =  ^(NSString  *name)  {       NSLog(@“Hello  %@",  name);        };

Page 85: iOS Developer Overview - DevWeek 2014

Blocks@interface  Person  :  NSObject  !@property  NSString  *name;  !-­‐  (void)welcomeUserWithBlock:(void  (^)(NSString  *))theBlock;  !@end

@implementation  Person  !…  !-­‐  (void)welcomeUserWithBlock:(void  (^)(NSString  *))theBlock  {          theBlock(self.name);  }  !@end

Page 86: iOS Developer Overview - DevWeek 2014

Blocks

void  (^sayHello)(NSString  *)  =  ^(NSString  *name)  {       NSLog(@“Hello  %@",  name);        };

Person  *theUser  =  [[Person  alloc]  initWithName:@"Paul"];

[theUser  welcomeUserWithBlock:^(NSString  *name)  {            NSLog(@"Hello  %@",  name);  }];

[theUser  welcomeUserWithBlock:sayHello];

Page 87: iOS Developer Overview - DevWeek 2014

Blocks

Person  *theUser  =  [[Person  alloc]  initWithName:@"Paul"];

[theUser  welcomeUserWithBlock:^(NSString  *name)  {            NSLog(@"Hello  %@",  name);  }];

Page 88: iOS Developer Overview - DevWeek 2014

Block scope

!!Person  *theUser  =  [[Person  alloc]  initWithName:@"Paul"];  ![theUser  welcomeUserWithBlock:^(NSString  *name)  {            NSLog(@"Hello  %@",  name);  }];  

 message

Module09_02[8635:303] Hello Paul

NSString  *message  =  @"Hello  %@";

Page 89: iOS Developer Overview - DevWeek 2014

Block scopeNSString  *message  =  @"Hello  %@";  !!!!!!Person  *theUser  =  [[Person  alloc]  initWithName:@"Paul"];  ![theUser  welcomeUserWithBlock:^(NSString  *name)  {            NSLog(@"Hello  %@",  name);  }];  

 message

...  !if  (morning)  {          message  =  @"Good  morning  %@";  }

Module09_02[8693:303] Good morning Paul

Page 90: iOS Developer Overview - DevWeek 2014

Example

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello" message:@"Are you sure?" delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil]; [alert show];

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { ... }

Page 91: iOS Developer Overview - DevWeek 2014

Example

@interface  UIAlertView  (H24Blocks)  !!+  (UIAlertView*)  alertViewWithTitle:(NSString*)  title                                                                                                  message:(NSString*)  message                                        cancelButtonTitle:(NSString*)  cancelButtonTitle                                      otherButtonTitles:(NSArray*)  otherButtons                                                      onDismiss:(IndexBlock)  dismissed                                                                                              onCancel:(EmptyBlock)  cancelled;  !@end

Page 92: iOS Developer Overview - DevWeek 2014

Example

[UIAlertView  alertViewWithTitle:@"Hello"                                                  message:@"Hello  World"                              cancelButtonTitle:@"Cancel"                              otherButtonTitles:@[@"OK"]                                              onDismiss:^(int  buttonIndex)  {                                                      NSLog(@"Dismissed");                                              }  onCancel:^{                                                      NSLog(@"Cancelled");                                              }];

Page 93: iOS Developer Overview - DevWeek 2014

iOS Application Development

Design Patterns

Page 94: iOS Developer Overview - DevWeek 2014

Design Patterns

‣ Accessors Pattern‣ allows access to an object properties through simple methods

‣Anonymous Type Pattern‣ send message to objects of an uncertain (at compilation) type

‣2-stage Object Creation Pattern‣ alloc + init = new‣ allow custom initialisers

‣Outlets, targets & actions‣ configuration of and interaction with UI elements

Page 95: iOS Developer Overview - DevWeek 2014

MVC

Model

View Controller

Page 96: iOS Developer Overview - DevWeek 2014

MV[C]

Model

View Controller

Page 97: iOS Developer Overview - DevWeek 2014

[M]VC

Model

View Controller

Page 98: iOS Developer Overview - DevWeek 2014

[M]VC

Model

View Controller !View

Controller

Page 99: iOS Developer Overview - DevWeek 2014

MVC

Page 100: iOS Developer Overview - DevWeek 2014

MVC

Page 101: iOS Developer Overview - DevWeek 2014

Decorator pattern

‣ add bevaviour to an object

‣ without affecting the behaviour of other objects from the same class

Page 102: iOS Developer Overview - DevWeek 2014

Categories

‣ adds functionality to classes without the need to subclass

‣ group common methods and implement them across the relevant framework

‣ informal protocols (unimplemented methods)

‣ anonymous category (private methods)

Page 103: iOS Developer Overview - DevWeek 2014

Delegation

‣ a delegate is an object that works together with its delegator to solve a problem

‣ a delegate adds/changes the behaviour of the delegator (avoids subclassing)

‣ loose coupling

‣ a delegate is usually referenced using the anonymous type

@interface MyAppDelegate : NSObject <UIApplicationDelegate>

Page 104: iOS Developer Overview - DevWeek 2014

Observer pattern

‣ enables communication between objects

‣ no coupling

‣ one object notifies another object (registered as ‘listener’) when a change occurs

Page 105: iOS Developer Overview - DevWeek 2014

Notifications

‣ an object registers as observer

‣ when a notification is sent to the Notification Center, it is distributed to all listeners

[NSNotificationCenter  defaultCenter]

Page 106: iOS Developer Overview - DevWeek 2014

Notifications

[[NSNotificationCenter  defaultCenter]  addObserver:self                              selector:@selector(soSomething)          

                               name:@"H24CourseNotification"                                     object:nil];    

[[NSNotificationCenter  defaultCenter]  postNotificationName:@"H24CourseNotification"                                      object:nil];    

[[NSNotificationCenter  defaultCenter]  removeObserver:self];

Page 107: iOS Developer Overview - DevWeek 2014

Key-Value Observing

‣ KVC - Key Value Coding

‣ KVO - Key Value Observing

Page 108: iOS Developer Overview - DevWeek 2014

KVC@interface  Vehicle  :  NSObject

@end

Page 109: iOS Developer Overview - DevWeek 2014

KVC@interface  Vehicle  :  NSObject

@end

@property  NSString  *maker;

Page 110: iOS Developer Overview - DevWeek 2014

KVC@interface  Vehicle  :  NSObject

@end

myCar.maker  [myCar  maker]

myCar.maker  =  @"Ford";  [myCar  setMaker:@"Ford"];

@property  NSString  *maker;

Page 111: iOS Developer Overview - DevWeek 2014

KVC@interface  Vehicle  :  NSObject

@end

[myCar  valueForKey:@"maker"];  [myCar  setValue:@"Ford"  forKey:@"maker"];

myCar.maker  [myCar  maker]

myCar.maker  =  @"Ford";  [myCar  setMaker:@"Ford"];

@property  NSString  *maker;

Page 112: iOS Developer Overview - DevWeek 2014

KVC@interface  Vehicle  :  NSObject

@end

@property  User  *owner;

myCar.maker  [myCar  maker]

myCar.maker  =  @"Ford";  [myCar  setMaker:@"Ford"];

@property  NSString  *maker;

[myCar  valueForKey:@"maker"];  [myCar  setValue:@"Ford"  forKey:@"maker"];

Page 113: iOS Developer Overview - DevWeek 2014

KVC@interface  Vehicle  :  NSObject

@end

@property  User  *owner;

[myCar  valueForKeyPath:@"owner.firstName"]  [myCar  setValue:@"John"  forKeyPath:@"owner.firstName"];  

myCar.maker  [myCar  maker]

myCar.maker  =  @"Ford";  [myCar  setMaker:@"Ford"];

@property  NSString  *maker;

[myCar  valueForKey:@"maker"];  [myCar  setValue:@"Ford"  forKey:@"maker"];

Page 114: iOS Developer Overview - DevWeek 2014

KVO

[aVehicle  addObserver:self                        forKeyPath:@"owner"                              options:NSKeyValueObservingOptionNew                              context:nil];

options:(NSKeyValueObservingOptionNew  |  NSKeyValueObservingOptionOld)

Page 115: iOS Developer Overview - DevWeek 2014

KVO

- (void)observeValueForKeyPath:(NSString *)keyPath " ofObject:(id)object " change:(NSDictionary *)change " context:(void *)context

Page 116: iOS Developer Overview - DevWeek 2014

KVO

[vehicle  removeObserver:self  forKeyPath:@"owner"];

Page 117: iOS Developer Overview - DevWeek 2014

Key-Value Observing

‣ KVC - Key Value Coding

‣ KVO - Key Value Observing

Page 118: iOS Developer Overview - DevWeek 2014

Facade pattern

‣ simplified interface to a larger body of code

‣ subsystems accessed through a well defined entry point

‣ allows subsystems to change without affecting the overall functionality

Page 119: iOS Developer Overview - DevWeek 2014

UIImage+  (UIImage  *)imageWithContentsOfFile:(NSString  *)path

+  (UIImage  *)imageNamed:(NSString  *)name

Page 120: iOS Developer Overview - DevWeek 2014

Anatomy of an app

#import  <UIKit/UIKit.h>  !#import  "AppDelegate.h"  !int  main(int  argc,  char  *  argv[])  {          @autoreleasepool  {                  return  UIApplicationMain(argc,  argv,  nil,                                                                    NSStringFromClass([AppDelegate  class]));          }  }

main.m

Page 121: iOS Developer Overview - DevWeek 2014

iOS Application Development

App states

Page 122: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

App states

122

Active

Inactive

Running

Suspende

Running

Not running

Background

Page 123: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

No background

123

Page 124: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

App life cycle

124

Active

Inactive

Running

Suspended

iPhone OS 3 iOS 4

Running

Not running

Running

Not running

Background

Page 125: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

AppDelegate callbacks

‣ application:willFinishLaunchingWithOptions:

‣ application:didFinishLaunchingWithOptions:

‣ applicationDidBecomeActive:

‣ applicationWillResignActive:

‣ applicationDidEnterBackground:

‣ applicationWillEnterForeground:

‣ applicationWillTerminate:

125

Page 126: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

126

Active

Inactive

Running

Suspended

Page 127: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

App life cycle - app start

127

ForegroundActive

Inactive

BackgroundRunning

Suspended

Not running

1

Page 128: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

128

Active

Inactive

Running

Suspended

willFinishLaunchingWithOptions:

1

Page 129: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

129

Active

Inactive

Running

Suspended

2

willFinishLaunchingWithOptions:

1

Page 130: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

130

Active

Inactive

Running

Suspended

2

willFinishLaunchingWithOptions:

1

didFinishLaunchingWithOptions:

Page 131: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

131

Active

Inactive

Running

Suspended

2

willFinishLaunchingWithOptions:

1

didFinishLaunchingWithOptions:

applicationDidBecomeActive:

Page 132: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle - inactive

132

Active

Inactive

Running

Suspended

Page 133: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

133

Active

Inactive

Running

Suspended

Page 134: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

134

Active

Inactive

Running

Suspended

applicationDidResignActive:

Page 135: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

135

Active

Inactive

Running

Suspended

applicationDidResignActive:

Page 136: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

136

Active

Inactive

Running

Suspended

applicationDidResignActive:

applicationDidBecomeActive:

Page 137: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle - background

137

Active

Inactive

Running

Suspended

Page 138: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

138

Active

Inactive

Running

Suspended

1

Page 139: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

139

Active

Inactive

Running

Suspended

1

applicationDidResignActive:

Page 140: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

140

Active

Inactive

Running

Suspended

1

applicationDidResignActive:

2

Page 141: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

141

Active

Inactive

Running

Suspended

1

applicationDidResignActive:

2

applicationDidEnterBackground:

Page 142: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

142

Active

Inactive

Running

Suspended

1

applicationDidResignActive:

2

applicationDidEnterBackground:7

Page 143: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

143

Active

Inactive

Running

Suspended

1

applicationDidResignActive:

2

applicationDidEnterBackground:7 8

Page 144: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

144

Active

Inactive

Running

Suspended

1

applicationDidResignActive:

2

applicationDidEnterBackground:7 8

9

Page 145: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

145

Active

Inactive

Running

Suspended

1

applicationDidResignActive:

2

applicationDidEnterBackground:7 8

9

applicationDidEnterForeground:

Page 146: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

146

Active

Inactive

Running

Suspended

1

applicationDidResignActive:

2

applicationDidEnterBackground:7 8

9

10

applicationDidEnterForeground:

Page 147: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

147

Active

Inactive

Running

Suspended

1

applicationDidResignActive:

2

applicationDidEnterBackground:7 8

9

10

applicationDidEnterForeground:

applicationDidBecomeActive:

Page 148: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle - terminate

148

Active

Inactive

Running

Suspended

Page 149: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

149

Active

Inactive

Running

Suspended

Page 150: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

150

Active

Inactive

Running

Suspended

Page 151: iOS Developer Overview - DevWeek 2014

Slide Hello24 Ltd. (c) 2014

Foreground

Background

Not running

App life cycle

151

Active

Inactive

Running

Suspended

applicationWillTerminate:

Page 152: iOS Developer Overview - DevWeek 2014

iOS Application Development

Debug & Testing

Page 153: iOS Developer Overview - DevWeek 2014

Instruments

Page 154: iOS Developer Overview - DevWeek 2014

Instruments - Leaks

Page 155: iOS Developer Overview - DevWeek 2014

Instruments - Allocations

Page 156: iOS Developer Overview - DevWeek 2014

Instruments - Zombies

Page 157: iOS Developer Overview - DevWeek 2014

Instruments - Time Profiler

Page 158: iOS Developer Overview - DevWeek 2014

Instruments

Page 159: iOS Developer Overview - DevWeek 2014

Network Link Conditioner

Page 160: iOS Developer Overview - DevWeek 2014

Network Link Conditioner

Page 161: iOS Developer Overview - DevWeek 2014

Network Link Conditioner on device

Page 162: iOS Developer Overview - DevWeek 2014

Pony Debugger

Page 163: iOS Developer Overview - DevWeek 2014

Pony Debugger

[16:04:17] paul@Pro2x:project1 [502] $ ponyd serve --listen-interface=127.0.0.1PonyGateway starting. Listening on 127.0.0.1:9000

[17:14:22] paul@Pro2x:MyPony [516] $ pod installSetting up CocoaPods master repoSetup completed (read-only access)Analyzing dependenciesDownloading dependenciesInstalling PonyDebugger (0.3.1)Installing SocketRocket (0.3.1-beta2)Generating Pods projectIntegrating client project![!] From now on use `MyPony.xcworkspace`.[deprecated] I18n.enforce_available_locales will default to true in the future. If you really want to skip validation of your locale you can set I18n.enforce_available_locales = false to avoid this message.

Page 164: iOS Developer Overview - DevWeek 2014

Pony Debugger

       PDDebugger  *debugger  =  [PDDebugger  defaultInstance];          [debugger  connectToURL:[NSURL  URLWithString:@"ws://127.0.0.1:9000/device"]];          [debugger  forwardAllNetworkTraffic];                    [debugger  enableCoreDataDebugging];          [debugger  addManagedObjectContext:self.managedObjectContext  withName:@"MyPony"];                    [debugger  enableViewHierarchyDebugging];          [debugger  enableRemoteLogging];

Page 165: iOS Developer Overview - DevWeek 2014

Pony Debugger

Page 166: iOS Developer Overview - DevWeek 2014

Pony Debugger

Page 167: iOS Developer Overview - DevWeek 2014

Reveal

Page 168: iOS Developer Overview - DevWeek 2014

iOS Application Development

Ad-Hoc distribution

Page 169: iOS Developer Overview - DevWeek 2014

TestFlight

Page 170: iOS Developer Overview - DevWeek 2014

TestFlight

Page 171: iOS Developer Overview - DevWeek 2014

TestFlight

Page 172: iOS Developer Overview - DevWeek 2014

TestFlight

Page 173: iOS Developer Overview - DevWeek 2014

HockeyApp

Page 174: iOS Developer Overview - DevWeek 2014

HockeyApp

Page 175: iOS Developer Overview - DevWeek 2014

HockeyApp

Page 176: iOS Developer Overview - DevWeek 2014

iOS Application Development

Publishing

Page 177: iOS Developer Overview - DevWeek 2014

iTunes Connect

Page 178: iOS Developer Overview - DevWeek 2014

New App

Page 179: iOS Developer Overview - DevWeek 2014

Pricing Matrix

Page 180: iOS Developer Overview - DevWeek 2014

Categories

Page 181: iOS Developer Overview - DevWeek 2014

App Rating

Page 182: iOS Developer Overview - DevWeek 2014

Review

http://reviewtimes.shinydevelopment.com/

Page 183: iOS Developer Overview - DevWeek 2014

Ready for sale!

Page 184: iOS Developer Overview - DevWeek 2014

Newsstand apps

Page 185: iOS Developer Overview - DevWeek 2014

Newsstand apps

Page 186: iOS Developer Overview - DevWeek 2014

iAd

Page 187: iOS Developer Overview - DevWeek 2014

iAd

Page 188: iOS Developer Overview - DevWeek 2014

iAd

Page 189: iOS Developer Overview - DevWeek 2014

iOS Application Development

What is an app?

Page 190: iOS Developer Overview - DevWeek 2014

What is an app?

‣ A package that is installed on a device

‣ Runs in a sandboxed environment

‣ Has limited access to system resources

‣ The limits can change over time

‣ Can retrieve remote information (when connection available)

‣ Can run in background

Page 191: iOS Developer Overview - DevWeek 2014

The apps

Page 192: iOS Developer Overview - DevWeek 2014

The apps

Page 193: iOS Developer Overview - DevWeek 2014

The IPA

Page 194: iOS Developer Overview - DevWeek 2014

The App

Page 195: iOS Developer Overview - DevWeek 2014

The plan

‣ Why iOS?

‣ Tools

‣ Storyboarding

‣ Objective-C

‣ Design patterns

‣ Debug & Testing

‣ Ad-Hoc distribution

‣ Publishing in the app store

Page 196: iOS Developer Overview - DevWeek 2014

Thank you!

@pardel!

[email protected]