Advertisement
Advertisement

More Related Content

Advertisement

iOS Developer Overview - DevWeek 2014

  1. iOS Application Development iOS Developer Overview Paul Ardeleanu
  2. Assumptions… You are: ‣ a developer of sorts… ‣ have no or little exposure to iOS ‣ want to learn enough to become ‘dangerous’
  3. The plan ‣ Why iOS? ‣ Tools ‣ Storyboarding ‣ Objective-C ‣ Design patterns ‣ Debug & Testing ‣ Ad-Hoc distribution ‣ Publishing in the app store
  4. iOS Application Development Why iOS?
  5. iOS Application Development Once upon a time…
  6. … there were phones http://www.flickr.com/photos/adrianblack/371301544/
  7. Then the iPhone happened…
  8. Before & after https://twitter.com/JoshHelfferich
  9. App Store
  10. Global Phone Market Units shipped / quarter © Asymco - used with permission
  11. Smartphone shipments © Asymco - used with permission
  12. © Asymco - used with permission
  13. iOS Application Development Developer tools
  14. Developer tools
  15. Xcode
  16. Xcode
  17. iOS Simulator
  18. Instruments
  19. Instruments
  20. CocoaPods.org
  21. CocoaPods.org
  22. Reveal
  23. Documentation
  24. Documentation
  25. Documentation
  26. Dash
  27. Dash
  28. Dash
  29. iOS Application Development Building great apps
  30. 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
  31. List of features too many features? Filter Yes Application Definition Statement App features User journeys Wirefames Prototype
  32. 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/
  33. Solve real problems "An app must solve a user's problem clearly and elegantly." Eric Hope, User Experience Evangelist, Apple
  34. Delivery channels ‣ web app [dedicated] ‣ native app ‣ “hybrid” solutions
  35. iOS Application Development Storyboarding
  36. 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
  37. Xcode 5 - default
  38. Xcode 4 - optional
  39. Main Storyboard
  40. A simple app
  41. Specialised View Controllers ‣ UITableViewController ‣ UINavigationController ‣ UITabBarController ‣ UICollectionView
  42. UITableViewController
  43. UINavigationController
  44. UITabBarController
  45. UIToolbar
  46. UICollectionView
  47. iOS 6 & 7
  48. iPhone 3.5 vs 4-inch
  49. iOS Application Development Objective-C
  50. 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
  51. Object-Oriented Programming a 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
  52. Vehicle class Interface .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
  53. Methods syntax -­‐  (void)setWheels:(int)n; return type name argument type argument name type
  54. Multiple arguments -­‐  (BOOL)application:(UIApplication  *)application   didFinishLaunchingWithOptions:(NSDictionary  *)launchOptions application:didFinishLaunchingWithOptions: The name of the method is:
  55. 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;
  56. 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;
  57. 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;
  58. Properties & dot notation Vehicle  *myCar  =  [Vehicle  new];   ! myCar.wheels  =  5;   ! myCar.wheels  
  59. What is a method? typedef  struct  objc_selector  *SEL; ! Vehicle  *myCar  =  [Vehicle  new];   ! [myCar  drive]; objc_msgSend(myCar,  @selector(drive))
  60. Sending a message -­‐  (void)setWheels:  (int)n; [myCar  setWheels:4]; objc_msgSend(myCar,  @selector(setWheels:),  4);
  61. Sending a message ! Vehicle  *myCar  =  nil;   ! [myCar  drive];   myCar  =  ...;             if  ([myCar  respondsToSelector:@selector(drive)])  {        [myCar  drive];       }  
  62. Initialisers Vehicle *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];
  63. 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
  64. 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
  65. 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;
  66. Inheritance NSObject NSPredicateNSArray NSComparisonPredicate NSMutableArray UIResponder UIView UIWindow UIControl UIButton UIGestureRecognizer UIApplicationNSNumber NSValue
  67. instance class isa superclass superclass metaclass isa metaclass isa superclass NSObject superclass superclass nil metaclass isa superclass superclass
  68. Polymorphism & Dynamic typing Vehicle Truck ! - (void)drive Car ! - (void)drive id  aVehicle;   ! ...   ! [aVehicle  drive];
  69. 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
  70. Introspection NSObject - (BOOL)isKindOfClass:(Class)aClass; - (BOOL)isMemberOfClass:(Class)aClass; - (Class)superclass; - (Class)class; - (BOOL)respondsToSelector:(SEL)aSelector;
  71. Protocols -­‐  (void)load;   -­‐  (void)unload;   -­‐  (float)getWeight; @interface  Truck  :  Vehicle @end
  72. Protocols -­‐  (void)load;   -­‐  (void)unload;   -­‐  (float)getWeight; @implementation  Truck   ! ! ! ! ! ! ! ! ! ! ! ! ! @end -­‐  (void)load  {     ...       }   -­‐  (void)unload  {     ...       }   -­‐  (float)getWeight  {     ...       }   @interface  Truck  :  Vehicle @end
  73. Protocols -­‐  (void)load;   -­‐  (void)unload;   -­‐  (float)getWeight; @interface  Truck  :  Vehicle @end @protocol  VehicleLoading @end <VehicleLoading>
  74. Protocols -­‐  (void)load;   -­‐  (void)unload;   -­‐  (float)getWeight; @interface  Truck  :  Vehicle @end @protocol  VehicleLoading @end <VehicleLoading> @implementation  Truck   ! ! ! ! ! ! ! ! ! ! ! ! ! @end -­‐  (void)load  {     ...         }   -­‐  (void)unload  {     ...         }   -­‐  (float)getWeight  {     ...         }  
  75. Category @interface  Vehicle  :  NSObject     ! ...   ! -­‐  (void)drive;   -­‐  (void)brake;   ! @end ! Vehicle  *myCar  =  [Vehicle  new];   [myCar  steerLeft];
  76. Category @interface NSString : NSObject ! ! ! ! ! ! @end
  77. @interface NSString : NSObject ! ! ! ! ! ! @end Category - (NSUInteger)wordCount;
  78. Category #import  "NSString.h"   ! @interface  NSString  (H24Utils)   ! -­‐  (NSUInteger)wordCount;   ! @end NSString+H24Utils.h NSString+H24Utils.m
  79. 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
  80. Naming conventions Classes Objects camelCase with capitalised first letter (a.k.a. Pascal case) Prefixes HelloWorldViewController   camelCase viewController,  myCar   NSArray,  UIView  
  81. BOOL data type typedef  signed  char     BOOL;   ! #define  YES  (BOOL)1   #define  NO    (BOOL)0
  82. Blocks void  (^sayHello)(NSString  *)  =  ^(NSString  *name)  {       NSLog(@“Hello  %@",  name);         }; NSString  *sayHello  =  @"Hello  World";
  83. Blocks void  (^sayHello)(NSString  *);   ! sayHello  =  ^(NSString  *name)  {          NSLog(@"Hello  %@",  name);   }; void  (^sayHello)(NSString  *)  =  ^(NSString  *name)  {       NSLog(@“Hello  %@",  name);         };
  84. Blocks @interface  Person  :  NSObject   ! @property  NSString  *name;   ! -­‐  (void)welcomeUserWithBlock:(void  (^)(NSString  *))theBlock;   ! @end @implementation  Person   ! …   ! -­‐  (void)welcomeUserWithBlock:(void  (^)(NSString  *))theBlock  {          theBlock(self.name);   }   ! @end
  85. 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];
  86. Blocks Person  *theUser  =  [[Person  alloc]  initWithName:@"Paul"]; [theUser  welcomeUserWithBlock:^(NSString  *name)  {            NSLog(@"Hello  %@",  name);   }];
  87. 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  %@";
  88. Block scope NSString  *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
  89. 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 { ... }
  90. Example @interface  UIAlertView  (H24Blocks)   ! ! +  (UIAlertView*)  alertViewWithTitle:(NSString*)  title                                                                                                message:(NSString*)  message                                        cancelButtonTitle:(NSString*)  cancelButtonTitle                                      otherButtonTitles:(NSArray*)  otherButtons                                                      onDismiss:(IndexBlock)  dismissed                                                                                    onCancel:(EmptyBlock)  cancelled;   ! @end
  91. Example [UIAlertView  alertViewWithTitle:@"Hello"                                                  message:@"Hello  World"                              cancelButtonTitle:@"Cancel"                              otherButtonTitles:@[@"OK"]                                              onDismiss:^(int  buttonIndex)  {                                                      NSLog(@"Dismissed");                                              }  onCancel:^{                                                      NSLog(@"Cancelled");                                              }];
  92. iOS Application Development Design Patterns
  93. 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
  94. MVC Model View Controller
  95. MV[C] Model View Controller
  96. [M]VC Model View Controller
  97. [M]VC Model View Controller !View Controller
  98. MVC
  99. MVC
  100. Decorator pattern ‣ add bevaviour to an object ‣ without affecting the behaviour of other objects from the same class
  101. 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)
  102. 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>
  103. Observer pattern ‣ enables communication between objects ‣ no coupling ‣ one object notifies another object (registered as ‘listener’) when a change occurs
  104. Notifications ‣ an object registers as observer ‣ when a notification is sent to the Notification Center, it is distributed to all listeners [NSNotificationCenter  defaultCenter]
  105. Notifications [[NSNotificationCenter  defaultCenter]  addObserver:self                              selector:@selector(soSomething)                                          name:@"H24CourseNotification"                                     object:nil];     [[NSNotificationCenter  defaultCenter]  postNotificationName:@"H24CourseNotification"                                      object:nil];     [[NSNotificationCenter  defaultCenter]  removeObserver:self];
  106. Key-Value Observing ‣ KVC - Key Value Coding ‣ KVO - Key Value Observing
  107. KVC @interface  Vehicle  :  NSObject @end
  108. KVC @interface  Vehicle  :  NSObject @end @property  NSString  *maker;
  109. KVC @interface  Vehicle  :  NSObject @end myCar.maker   [myCar  maker] myCar.maker  =  @"Ford";   [myCar  setMaker:@"Ford"]; @property  NSString  *maker;
  110. 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;
  111. 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"];
  112. 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"];
  113. KVO [aVehicle  addObserver:self                        forKeyPath:@"owner"                              options:NSKeyValueObservingOptionNew                              context:nil]; options:(NSKeyValueObservingOptionNew  |  NSKeyValueObservingOptionOld)
  114. KVO - (void)observeValueForKeyPath:(NSString *)keyPath " ofObject:(id)object " change:(NSDictionary *)change " context:(void *)context
  115. KVO [vehicle  removeObserver:self  forKeyPath:@"owner"];
  116. Key-Value Observing ‣ KVC - Key Value Coding ‣ KVO - Key Value Observing
  117. 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
  118. UIImage +  (UIImage  *)imageWithContentsOfFile:(NSString  *)path +  (UIImage  *)imageNamed:(NSString  *)name
  119. 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
  120. iOS Application Development App states
  121. Slide Hello24 Ltd. (c) 2014 App states 122 Active Inactive Running Suspende Running Not running Background
  122. Slide Hello24 Ltd. (c) 2014 No background 123
  123. 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
  124. Slide Hello24 Ltd. (c) 2014 AppDelegate callbacks ‣ application:willFinishLaunchingWithOptions: ‣ application:didFinishLaunchingWithOptions: ‣ applicationDidBecomeActive: ‣ applicationWillResignActive: ‣ applicationDidEnterBackground: ‣ applicationWillEnterForeground: ‣ applicationWillTerminate: 125
  125. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle 126 Active Inactive Running Suspended
  126. Slide Hello24 Ltd. (c) 2014 App life cycle - app start 127 ForegroundActive Inactive BackgroundRunning Suspended Not running 1
  127. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle 128 Active Inactive Running Suspended willFinishLaunchingWithOptions: 1
  128. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle 129 Active Inactive Running Suspended 2 willFinishLaunchingWithOptions: 1
  129. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle 130 Active Inactive Running Suspended 2 willFinishLaunchingWithOptions: 1 didFinishLaunchingWithOptions:
  130. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle 131 Active Inactive Running Suspended 2 willFinishLaunchingWithOptions: 1 didFinishLaunchingWithOptions: applicationDidBecomeActive:
  131. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle - inactive 132 Active Inactive Running Suspended
  132. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle 133 Active Inactive Running Suspended
  133. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle 134 Active Inactive Running Suspended applicationDidResignActive:
  134. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle 135 Active Inactive Running Suspended applicationDidResignActive:
  135. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle 136 Active Inactive Running Suspended applicationDidResignActive: applicationDidBecomeActive:
  136. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle - background 137 Active Inactive Running Suspended
  137. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle 138 Active Inactive Running Suspended 1
  138. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle 139 Active Inactive Running Suspended 1 applicationDidResignActive:
  139. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle 140 Active Inactive Running Suspended 1 applicationDidResignActive: 2
  140. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle 141 Active Inactive Running Suspended 1 applicationDidResignActive: 2 applicationDidEnterBackground:
  141. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle 142 Active Inactive Running Suspended 1 applicationDidResignActive: 2 applicationDidEnterBackground: 7
  142. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle 143 Active Inactive Running Suspended 1 applicationDidResignActive: 2 applicationDidEnterBackground: 7 8
  143. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle 144 Active Inactive Running Suspended 1 applicationDidResignActive: 2 applicationDidEnterBackground: 7 8 9
  144. 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:
  145. 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:
  146. 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:
  147. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle - terminate 148 Active Inactive Running Suspended
  148. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle 149 Active Inactive Running Suspended
  149. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle 150 Active Inactive Running Suspended
  150. Slide Hello24 Ltd. (c) 2014 Foreground Background Not running App life cycle 151 Active Inactive Running Suspended applicationWillTerminate:
  151. iOS Application Development Debug & Testing
  152. Instruments
  153. Instruments - Leaks
  154. Instruments - Allocations
  155. Instruments - Zombies
  156. Instruments - Time Profiler
  157. Instruments
  158. Network Link Conditioner
  159. Network Link Conditioner
  160. Network Link Conditioner on device
  161. Pony Debugger
  162. Pony Debugger [16:04:17] paul@Pro2x:project1 [502] $ ponyd serve --listen-interface=127.0.0.1 PonyGateway starting. Listening on 127.0.0.1:9000 [17:14:22] paul@Pro2x:MyPony [516] $ pod install Setting up CocoaPods master repo Setup completed (read-only access) Analyzing dependencies Downloading dependencies Installing PonyDebugger (0.3.1) Installing SocketRocket (0.3.1-beta2) Generating Pods project Integrating 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.
  163. 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];
  164. Pony Debugger
  165. Pony Debugger
  166. Reveal
  167. iOS Application Development Ad-Hoc distribution
  168. TestFlight
  169. TestFlight
  170. TestFlight
  171. TestFlight
  172. HockeyApp
  173. HockeyApp
  174. HockeyApp
  175. iOS Application Development Publishing
  176. iTunes Connect
  177. New App
  178. Pricing Matrix
  179. Categories
  180. App Rating
  181. Review http://reviewtimes.shinydevelopment.com/
  182. Ready for sale!
  183. Newsstand apps
  184. Newsstand apps
  185. iAd
  186. iAd
  187. iAd
  188. iOS Application Development What is an app?
  189. 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
  190. The apps
  191. The apps
  192. The IPA
  193. The App
  194. The plan ‣ Why iOS? ‣ Tools ‣ Storyboarding ‣ Objective-C ‣ Design patterns ‣ Debug & Testing ‣ Ad-Hoc distribution ‣ Publishing in the app store
  195. Thank you! @pardel ! hello24.com paul@hello24.com
Advertisement