Mobile Development
                           Lecture 1, MFF UK



Petr Dvořák
Partner & iOS Development Lead
@joshis_tweets
Mobile apps
Mobile apps
• Not just “smaller desktop” apps
• UI Optimization needed
• Create a “mission statement”
• Kill some feature bullet points
• Design guidelines available
Paper, Pencil & Stencils
Balsamiq Mockups
Design must be great!
      ... otherwise...
Mobile is different
Advanced stuff
• Augmented reality
  • Qualcom AR SDK for iOS
 •   https://developer.qualcomm.com/develop/
     mobile-technologies/augmented-reality

• Face recognition
  • OpenCV library built for iOS
 •   http://opencv.willowgarage.com
Augmented reality
Face Recognition
MUNI 2012
 Success Stories
Slevolapka
iOS Ecosystem
Required hardware

• Any computer/laptop with Mac OS X
• Mac Mini - from 13 990 CZK
• MacBook Pro 13” - from 32 490 CZK
iOS Developer Account
• Bound to Apple ID
  • Registration is free
  • XCode/SDK download is free
   •   but it offers development for iOS simulator
       only
iOS Developer Account
• iOS Developer Program - $99 / year
  • Installation on devices
  • App Store publishing
  • Support
Member Center
• A dashboard website, a quick pointer
  • Dev Centers
  • Provisioning Portal
  • iTunes Connect
  • Resource Center, Developer
   Support, Forums
Developer Center
• Separate dev centers for iOS, Mac OS
   and Web development
 • A place to find
   • Resources, videos, tutorials, docs, ...
   • Early access downloads
Provisioning portal
• Register your development devices
  • max. 100 iOS devices / year
  • one-time removal
• Manage certificates
• Register AppID
• Create a provisioning profile
Provisioning profile
• Development / Distribution profiles
• A composite entity that contains
  • Certificates
  • AppID
  • Devices
Provisioning Process
iTunes Connect
• Manage applications
• Manage legal contracts
• Sales statistics
• Financial Reports, User Management,
  Contact
Member Center
• A dashboard that points to
  • Dev Centers          ~ Learn & Do
  • Provisioning Portal ~ Test
  • iTunes Connect       ~ Distribute
  • Resource Center, Developer
   Support, Forums
App Store
iOS Overview
• Unix based, high performance
• Strict memory management
• Multi-tasking since iOS 4
• Apps are sandboxed
• Specific features accessed via public
  iOS SDK APIs
Memory management
• Application receives memory
  warnings from the OS
• Must react on it quickly
  • ... free up as much memory as
    possible as quickly as possible
• ... otherwise, it’s killed
Multi-tasking
• Application transitions among states
  • Not Running
  • Inactive
  • Active
  • Background
  • Suspended
User’s perspective
• Multitasking is
  transparent
• “List of last used apps”
• “List of running apps”
• Default.png should
  resemble the first app
  screen
Multi-tasking
• Apps may remain alive
  • audio
  • voip
  • location
  • newsstand
  • external / bluetooth accessory
Application sandbox
• Every application has a home folder
  • Documents folder - is backed up
  • Cache folder - isn’t backed up
  • tmp folder
Development Tools
XCode
• IDE used for Mac / iOS development
• Tight git VCS integration
• LLVM / GCC compiler
• App Store submit, ad-hoc archives
• Distributed builds
XCode - Project/Target
XCode - Storyboarding
XCode - Source Code
Instruments
• Set of visual debugging tools
  • Memory leaks / Zombie objects
  • CPU / Activity monitoring
  • Quartz performance
  • OpenGL ES performance
iPhone/iPad Simulator
• Almost like a real device
• Intel instruction set
• Inherits computer CPU and memory
• Limited set of device specific features
 •   no push, no App Store, no phone calls, no
     accelerometer, ...
Objective-C & iOS SDK
Objective-C
• Object oriented language
• Derived from C
• It’s not a C++, it’s not even similar
• More similar to SmallTalk
• Dynamic, improved in a rapid pace
Confusing parts
• Methods ~ Selectors
• YES/NO instead of TRUE/FALSE
• nil instead of null
• self instead of this
• *.m files are implementation files
Confusing parts
• Map is called NSDictionary
• NSString constant is written as @”aa”
• NSNumber constant is written as @1
• NS stands for NextStep
• “hello” is a C/C++ string
Calling a method
• Java
  int a = inst.method(12.0);

  MyClass.staticMethod(a, b);




• Objective-C
  int a = [inst methodWithParam:12.0];

  [MyClass staticMethodWithParam1:a
                           param2:b];
Objective-C methods
• Yes, it is split in multiple parts
  •   Named parameters improve readability

   self.label.textColor = [UIColor colorWithRed:1.0
                                          green:0.0
                                           blue:0.0
                                          alpha:1.0];

   NSString *imageName = [NSString
                stringWithFormat:@”image_%d.png”, i];

   [[UIImage imageNamed:imgName]
                stretchableImageWithLeftCapWidth:27
                topCapHeight:9];

   string = [basePath stringByAppendingPathComponent:
                @"/some/file.txt"];
Declaring a method
• Java
  public int method(double number);

  private static void staticMethod(int a, bool b);



• Objective-C
  - (int) methodWithParam:(double)number;

  + (void) staticMethodWithParam1:(int)a
                           param2:(BOOL)b;

  // note: avoid “and”, “with”, ... in selector name
  // WRONG=> initWithName:andSurname:
  //    OK=> initWithName:surname:
Declaring a class
 // Employee.h

 #import <Foundation/Foundation.h>

 @interface Employee: NSObject <EmployeeProtocol> {
     NSString _name; // often not necessary
 }

 @property (nonatomic, strong) NSString *name;
 @property (nonatomic, strong) NSString *surname;

 - (id) initWithName:(NSString*)name
             surname:(NSString*)surname;

 @end
Defining a class
 // Employee.m

 #import “Employee.h”

 @implementation Employee
 @synthesize name = _name, surname;

 - (id) initWithName:(NSString*)_name
             surname:(NSString*)_surname {
     self = [super init];
     if (self != nil) {
         self.name = _name;
         self.surname = _surname;
     }
     return self;
 }

 ...
Defining a class
 ...

 - (void) greet {
     NSLog(@”Hello, %@ %@!”, self.name, self.surname);
 }

 @end
Declaring a protocol
• Protocol ~ Interface
     // EmployeeProtocol.h

     #import <Foundation/Foundation.h>

     @protocol EmployeeProtocol <NSObject>

     - (void) greet;

     @optional

     - (void) greetPolitely;

     @end
Using a protocol
                                           Protocol
 // Employee.h

 #import <Foundation/Foundation.h>

 @interface Employee: NSObject <EmployeeProtocol> {
     int someInstanceVariable;
 }

 @property (nonatomic, strong) NSString *name;
 @property (nonatomic, strong) NSString *surname;

 - (id) initWithName:(NSString*)name
             surname:(NSString*)surname;
Declaring a category
• Category = Extending class without
  subclassing

     // NSString+Crypto.h

     #import <Foundation/Foundation.h>

     @interface NSString (Crypto)

     - (NSString*) cryptedString;

     @end
Declaring a category
• Category = Extending class without
  subclassing

     // NSString+Crypto.m

     #import "NSString+Crypto.h"

     @implementation NSString (Crypto)

     - (NSString*) cryptedString { ... }

     @end
Class Extension
• “Category” with nothing in the
  brackets
• Usually implemented in the class
  implementation file
• Used to implement private methods,
  properties or to mask read-only
  modifier on a property
Blocks

     • Block = piece of code
^    • Used throughough the SDK
     • ~ Lambda, ~ anonymous
     • Blocks are clojures
       • __block type specifier
Blocks - UI Animations
 imageView.alpha = 0.0;
 [UIView animateWithDuration:1.0 animations:^{
     imageView.alpha = 1.0;
 } completion:^(BOOL finished) {
     if (finished) {
         // ...
     } else {
         // ...
     }
 }];
Blocks - Set filtering
 NSSet *iSet = [NSSet set];
 // ... add objects to the set


 [set objectsPassingTest:^(id obj, BOOL *stop) {
     return [self testValue:id]; // custom comparison
 }];
Memory Management
Memory management
• Every NSObject keeps a reference count
• Object is created => references = 1
  • note: created ~ init, new, copy
• Object is retained => references++
• Object is released => references--
• (references == 0) => dealloc
Memory management
• Before iOS 5: manual memory
  management was needed
 • retain / release / autorelease
 • mechanical, tedious, boring
   MyClass inst = [[MyClass alloc] init];
   // ... do something
   [inst release];
Since iOS 5 - ARC
• Automatic Reference Counting is
  available
 • Occurs during compilation
 • Still some libraries without ARC
   MyClass inst = [[MyClass alloc] init];
   // ... do something
   // object will get released in due course
Autorelease pools
• Every thread has a stack of
   autorelease pools
  • Object can register in the pool
  • In due course, the pool sends
    release to the object
  • When drained, the pool sends
    release to the object
  • Useful when creating many objects
Autorelease pools
 // HeavyMasacreComputator.m

 - (void) doSomething {
     for (int i = 0; i <   TRILLION_TRILLIONS; i++) {
         for (int j = 0;   j < TRILLION; j++) {
             MyClass c =   [[MyClass alloc] init];
             // do stuff   with my class
         }
     }
 }
Autorelease pools
 // HeavyMasacreComputator.m

 - (void) doSomething {
     for (int i = 0; i < TRILLION_TRILLIONS; i++) {
         @autoreleasepool {
             for (int j = 0; j < TRILLION; j++) {
                 MyClass c = [[MyClass alloc] init];
                 // do stuff with my class
             }
         }
     }
 }
Autorelease pools
 // HeavyMasacreComputator.m - pre iOS 5

 - (void) doSomething {
     for (int i = 0; i < TRILLION_TRILLIONS; i++) {
         NSAutoreleasePool *pool = [[NSAutoreleasePool
                                     alloc] init];
         for (int j = 0; j < TRILLION; j++) {
             MyClass c = [[[MyClass alloc] init]
                                    autorelease];
             // do stuff with my class
         }
         [pool drain];
     }
 }
Ownership Qualifiers
• How objects are assigned
  • __strong            - retained


  • __unsafe_unretained - not retained


  • __weak              - dtto, set to nil on dealloc


  • __autoreleasing     - retained, autoreleased
Properties
• Getter / Setter for the instance
  variables
• “Dot notation” for access
• Flags in the header file
• Synthesized in the implementation
  file
• Read-only / read-write properties
Properties
• Property vs. iVar
  • self.name ~ getter / setter used
    • [self name];
    • [self setName:@”Petr”];
  • name          ~ direct access to iVar
    • name = @”hello”;
Properties
• Implied ownership qualifiers for iVar
  • strong, retain, copy
      => __strong
 • weak
      => __weak
 • assign, unsafe_unretained
       => __unsafe_unretained
UI Elements
UIKit - The Gist
• Framework for iOS UI
• UI Components, gesture recognizers
• MVC approach
  • UIViewController manages UIView
  • UIViewController references model
UIKit - MVC diagram
               Model
UIKit - Threading
• UIKit must be used on the main
  thread to be safe
• Slow tasks must be run on other
  thread
 • UI would be blocked otherwise
UI Consistency
• Controls and views are customizable
• iOS is a very consistent platform, less
  is often more
• Follow iOS Human Interface
  Guidelines
iOS UI - Tools
• Storyboard / Interface Builder
• Hints in code for actions/outlets
  • IBAction - for UI actions
  • IBOutlet - for UI elements
• “Segue” since iOS 5
  • View transitions for free
Maps & Location
MapKit

• iOS 6: Apple Maps
• Pre-iOS 6: Google Maps
• High-level API
• Annotations, Routes,
 Overlays
MKMapView
• UIView subclass
• Based on adding “annotations”
  • = model classes
• Support for user’s location
• Customizable maps & annotations
• Delegate-based API
MKAnnotation
• Protocol that enables a model class
  for showing up on maps
 • coordinate, title, subtitle
• MKPlacemark
  • conforms to MKAnnotation
  • country, state, city, address
MKAnnotationView
• View related to a particular
  MKAnnotation instance
• Reused in the map view
• MKPinAnnotationView
  • The classic “iOS map pin”
  • Three colors
Thank you
                       http://www.inmite.eu/



Petr Dvořák
Partner & iOS Development Lead
@joshis_tweets

MFF UK - Introduction to iOS

  • 1.
    Mobile Development Lecture 1, MFF UK Petr Dvořák Partner & iOS Development Lead @joshis_tweets
  • 2.
  • 5.
    Mobile apps • Notjust “smaller desktop” apps • UI Optimization needed • Create a “mission statement” • Kill some feature bullet points • Design guidelines available
  • 6.
  • 7.
  • 8.
    Design must begreat! ... otherwise...
  • 10.
  • 11.
    Advanced stuff • Augmentedreality • Qualcom AR SDK for iOS • https://developer.qualcomm.com/develop/ mobile-technologies/augmented-reality • Face recognition • OpenCV library built for iOS • http://opencv.willowgarage.com
  • 12.
  • 13.
  • 14.
  • 15.
  • 17.
  • 18.
    Required hardware • Anycomputer/laptop with Mac OS X • Mac Mini - from 13 990 CZK • MacBook Pro 13” - from 32 490 CZK
  • 19.
    iOS Developer Account •Bound to Apple ID • Registration is free • XCode/SDK download is free • but it offers development for iOS simulator only
  • 20.
    iOS Developer Account •iOS Developer Program - $99 / year • Installation on devices • App Store publishing • Support
  • 21.
    Member Center • Adashboard website, a quick pointer • Dev Centers • Provisioning Portal • iTunes Connect • Resource Center, Developer Support, Forums
  • 22.
    Developer Center • Separatedev centers for iOS, Mac OS and Web development • A place to find • Resources, videos, tutorials, docs, ... • Early access downloads
  • 23.
    Provisioning portal • Registeryour development devices • max. 100 iOS devices / year • one-time removal • Manage certificates • Register AppID • Create a provisioning profile
  • 24.
    Provisioning profile • Development/ Distribution profiles • A composite entity that contains • Certificates • AppID • Devices
  • 25.
  • 26.
    iTunes Connect • Manageapplications • Manage legal contracts • Sales statistics • Financial Reports, User Management, Contact
  • 27.
    Member Center • Adashboard that points to • Dev Centers ~ Learn & Do • Provisioning Portal ~ Test • iTunes Connect ~ Distribute • Resource Center, Developer Support, Forums
  • 28.
  • 29.
    iOS Overview • Unixbased, high performance • Strict memory management • Multi-tasking since iOS 4 • Apps are sandboxed • Specific features accessed via public iOS SDK APIs
  • 30.
    Memory management • Applicationreceives memory warnings from the OS • Must react on it quickly • ... free up as much memory as possible as quickly as possible • ... otherwise, it’s killed
  • 31.
    Multi-tasking • Application transitionsamong states • Not Running • Inactive • Active • Background • Suspended
  • 32.
    User’s perspective • Multitaskingis transparent • “List of last used apps” • “List of running apps” • Default.png should resemble the first app screen
  • 33.
    Multi-tasking • Apps mayremain alive • audio • voip • location • newsstand • external / bluetooth accessory
  • 34.
    Application sandbox • Everyapplication has a home folder • Documents folder - is backed up • Cache folder - isn’t backed up • tmp folder
  • 35.
  • 36.
    XCode • IDE usedfor Mac / iOS development • Tight git VCS integration • LLVM / GCC compiler • App Store submit, ad-hoc archives • Distributed builds
  • 37.
  • 38.
  • 39.
  • 40.
    Instruments • Set ofvisual debugging tools • Memory leaks / Zombie objects • CPU / Activity monitoring • Quartz performance • OpenGL ES performance
  • 41.
    iPhone/iPad Simulator • Almostlike a real device • Intel instruction set • Inherits computer CPU and memory • Limited set of device specific features • no push, no App Store, no phone calls, no accelerometer, ...
  • 42.
  • 43.
    Objective-C • Object orientedlanguage • Derived from C • It’s not a C++, it’s not even similar • More similar to SmallTalk • Dynamic, improved in a rapid pace
  • 44.
    Confusing parts • Methods~ Selectors • YES/NO instead of TRUE/FALSE • nil instead of null • self instead of this • *.m files are implementation files
  • 45.
    Confusing parts • Mapis called NSDictionary • NSString constant is written as @”aa” • NSNumber constant is written as @1 • NS stands for NextStep • “hello” is a C/C++ string
  • 46.
    Calling a method •Java int a = inst.method(12.0); MyClass.staticMethod(a, b); • Objective-C int a = [inst methodWithParam:12.0]; [MyClass staticMethodWithParam1:a param2:b];
  • 47.
    Objective-C methods • Yes,it is split in multiple parts • Named parameters improve readability self.label.textColor = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0]; NSString *imageName = [NSString stringWithFormat:@”image_%d.png”, i]; [[UIImage imageNamed:imgName] stretchableImageWithLeftCapWidth:27 topCapHeight:9]; string = [basePath stringByAppendingPathComponent: @"/some/file.txt"];
  • 48.
    Declaring a method •Java public int method(double number); private static void staticMethod(int a, bool b); • Objective-C - (int) methodWithParam:(double)number; + (void) staticMethodWithParam1:(int)a param2:(BOOL)b; // note: avoid “and”, “with”, ... in selector name // WRONG=> initWithName:andSurname: // OK=> initWithName:surname:
  • 49.
    Declaring a class // Employee.h #import <Foundation/Foundation.h> @interface Employee: NSObject <EmployeeProtocol> { NSString _name; // often not necessary } @property (nonatomic, strong) NSString *name; @property (nonatomic, strong) NSString *surname; - (id) initWithName:(NSString*)name surname:(NSString*)surname; @end
  • 50.
    Defining a class // Employee.m #import “Employee.h” @implementation Employee @synthesize name = _name, surname; - (id) initWithName:(NSString*)_name surname:(NSString*)_surname { self = [super init]; if (self != nil) { self.name = _name; self.surname = _surname; } return self; } ...
  • 51.
    Defining a class ... - (void) greet { NSLog(@”Hello, %@ %@!”, self.name, self.surname); } @end
  • 52.
    Declaring a protocol •Protocol ~ Interface // EmployeeProtocol.h #import <Foundation/Foundation.h> @protocol EmployeeProtocol <NSObject> - (void) greet; @optional - (void) greetPolitely; @end
  • 53.
    Using a protocol Protocol // Employee.h #import <Foundation/Foundation.h> @interface Employee: NSObject <EmployeeProtocol> { int someInstanceVariable; } @property (nonatomic, strong) NSString *name; @property (nonatomic, strong) NSString *surname; - (id) initWithName:(NSString*)name surname:(NSString*)surname;
  • 54.
    Declaring a category •Category = Extending class without subclassing // NSString+Crypto.h #import <Foundation/Foundation.h> @interface NSString (Crypto) - (NSString*) cryptedString; @end
  • 55.
    Declaring a category •Category = Extending class without subclassing // NSString+Crypto.m #import "NSString+Crypto.h" @implementation NSString (Crypto) - (NSString*) cryptedString { ... } @end
  • 56.
    Class Extension • “Category”with nothing in the brackets • Usually implemented in the class implementation file • Used to implement private methods, properties or to mask read-only modifier on a property
  • 57.
    Blocks • Block = piece of code ^ • Used throughough the SDK • ~ Lambda, ~ anonymous • Blocks are clojures • __block type specifier
  • 58.
    Blocks - UIAnimations imageView.alpha = 0.0; [UIView animateWithDuration:1.0 animations:^{ imageView.alpha = 1.0; } completion:^(BOOL finished) { if (finished) { // ... } else { // ... } }];
  • 59.
    Blocks - Setfiltering NSSet *iSet = [NSSet set]; // ... add objects to the set [set objectsPassingTest:^(id obj, BOOL *stop) { return [self testValue:id]; // custom comparison }];
  • 60.
  • 61.
    Memory management • EveryNSObject keeps a reference count • Object is created => references = 1 • note: created ~ init, new, copy • Object is retained => references++ • Object is released => references-- • (references == 0) => dealloc
  • 62.
    Memory management • BeforeiOS 5: manual memory management was needed • retain / release / autorelease • mechanical, tedious, boring MyClass inst = [[MyClass alloc] init]; // ... do something [inst release];
  • 63.
    Since iOS 5- ARC • Automatic Reference Counting is available • Occurs during compilation • Still some libraries without ARC MyClass inst = [[MyClass alloc] init]; // ... do something // object will get released in due course
  • 64.
    Autorelease pools • Everythread has a stack of autorelease pools • Object can register in the pool • In due course, the pool sends release to the object • When drained, the pool sends release to the object • Useful when creating many objects
  • 65.
    Autorelease pools //HeavyMasacreComputator.m - (void) doSomething { for (int i = 0; i < TRILLION_TRILLIONS; i++) { for (int j = 0; j < TRILLION; j++) { MyClass c = [[MyClass alloc] init]; // do stuff with my class } } }
  • 66.
    Autorelease pools //HeavyMasacreComputator.m - (void) doSomething { for (int i = 0; i < TRILLION_TRILLIONS; i++) { @autoreleasepool { for (int j = 0; j < TRILLION; j++) { MyClass c = [[MyClass alloc] init]; // do stuff with my class } } } }
  • 67.
    Autorelease pools //HeavyMasacreComputator.m - pre iOS 5 - (void) doSomething { for (int i = 0; i < TRILLION_TRILLIONS; i++) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; for (int j = 0; j < TRILLION; j++) { MyClass c = [[[MyClass alloc] init] autorelease]; // do stuff with my class } [pool drain]; } }
  • 68.
    Ownership Qualifiers • Howobjects are assigned • __strong - retained • __unsafe_unretained - not retained • __weak - dtto, set to nil on dealloc • __autoreleasing - retained, autoreleased
  • 69.
    Properties • Getter /Setter for the instance variables • “Dot notation” for access • Flags in the header file • Synthesized in the implementation file • Read-only / read-write properties
  • 70.
    Properties • Property vs.iVar • self.name ~ getter / setter used • [self name]; • [self setName:@”Petr”]; • name ~ direct access to iVar • name = @”hello”;
  • 71.
    Properties • Implied ownershipqualifiers for iVar • strong, retain, copy => __strong • weak => __weak • assign, unsafe_unretained => __unsafe_unretained
  • 72.
  • 73.
    UIKit - TheGist • Framework for iOS UI • UI Components, gesture recognizers • MVC approach • UIViewController manages UIView • UIViewController references model
  • 74.
    UIKit - MVCdiagram Model
  • 75.
    UIKit - Threading •UIKit must be used on the main thread to be safe • Slow tasks must be run on other thread • UI would be blocked otherwise
  • 76.
    UI Consistency • Controlsand views are customizable • iOS is a very consistent platform, less is often more • Follow iOS Human Interface Guidelines
  • 77.
    iOS UI -Tools • Storyboard / Interface Builder • Hints in code for actions/outlets • IBAction - for UI actions • IBOutlet - for UI elements • “Segue” since iOS 5 • View transitions for free
  • 78.
  • 79.
    MapKit • iOS 6:Apple Maps • Pre-iOS 6: Google Maps • High-level API • Annotations, Routes, Overlays
  • 80.
    MKMapView • UIView subclass •Based on adding “annotations” • = model classes • Support for user’s location • Customizable maps & annotations • Delegate-based API
  • 81.
    MKAnnotation • Protocol thatenables a model class for showing up on maps • coordinate, title, subtitle • MKPlacemark • conforms to MKAnnotation • country, state, city, address
  • 82.
    MKAnnotationView • View relatedto a particular MKAnnotation instance • Reused in the map view • MKPinAnnotationView • The classic “iOS map pin” • Three colors
  • 83.
    Thank you http://www.inmite.eu/ Petr Dvořák Partner & iOS Development Lead @joshis_tweets