Sei sulla pagina 1di 44

LAMAD

iOS
25.03.2013
The Platform and SDK
iOS

iPad
iPhone iPad Mini
Market share

Second mobile OS in usage

First mobile OS in revenue

First mobile OS in internet traffic

Market Share 2012


iOS: Advantages and
disadvantages
+ Highest revenue for mobile OS
+ Little fragmentation (just iPhone and iPad)
+ Runs on high-end devices
+ Big developer community and excellent support
+ Many open-source libraries available
- Strictly controlled by Apple
- Development only possible in Mac OS
- Objective C is the main programming language
Technology
Application development in Objective C a language that
adds Smalltalk-style messaging to C

Development done in Xcode on Mac OS devices


Debugging and running on phone done also in Xcode
Installing development kit
Install Xcode IDE newest version 4.6.1

Installing Xcode automatically installs iOS SDK

Xcode is free to download from Mac App store


Apple developer program
Apple developer account is free
Apple developer program is not free 99$/year
Registration done from
https://developer.apple.com/programs/ios/
Registration process takes 3-5 days
iOS development

Develop Debug Test Deploy


No cost Potential cost Requires Developer Requires Developer
Program Program
iOS debugging

Simulator does not require


a developer program

Device requires a Developer


Develop
Provisioning Profile 99$/year
Debug
App Store / Marketplace
summary

iOS Android Windows Phone

Approval Process Yes No Yes

Distribution outside the store No Yes No

Fragmentation Very Little Yes Yes


Multiple stores / Marketplaces No Yes No
Objective C
Objective-C is an object oriented language

Follows ANSI C style coding with methods from Smalltalk

Flexible because almost everything is done at runtime:


Dynamic Binding
Dynamic Typing
Dynamic Linking

It is used for both iOS and Mac OS development


Source files: .m, header files: .h
Has protocols, which work like interfaces in Java they
specify a number of methods a class must implement
Messages
Almost every object manipulation is done by sending
objects a message

Two words within a set of brackets, the object identifier


and the message to send:
[self.mainLabel setText:[self.mainTextInput text]];
Dot syntax:
self.mainLabel.text = self.mainTextInput.text;

Equivalent to C++ or Javas:


this.mainLabel.setText( this.mainTextInput.text() );

Static methods start with +, instance methods with -:


+(id)defaultController vs. -(void)initLocationManager
Cocoa API
A collection of libraries developed by Apple to aid GUI
development

Has a set of predefined classes and types such as NSNumber,


NSString, NSDate (NS stands for NeXT-sun)

Includes a root class NSObject where keywords like alloc,


retain, and release come from

Apple Human Interface Guidelines:


http://developer.apple.com/library/ios/#documentation/UserExper
ience/Conceptual/MobileHIG/Introduction/Introduction.html
Memory allocation
Objects are created dynamically using alloc keyword

Objects are automatically deallocated in latest Objective-


C through automatic reference counting (ARC)

ARC keeps an internal count of how many times an


Object is 'needed'

System makes sure that objects that are needed are not
deleted, and when an object is not needed it is deleted
C++ vs. Objective-C
C++ Objective C

Adds OOP, metaprogramming Only adds OOP to C


and generic programming to C
Comes with a std library Has no standard library; is
dependant on other libraries

Has numerous uses Mostly used for application


building

Large and complex code for OOP Simpler way of handling classes
and objects
Hello world example
Hello World
Task: Change a labels text using a button and an input box.

Create a new empty project:


New Project
Name the project and check Use Core Data and
User Automatic Reference Counting
New Project
Create the project and also create local git
repository for source control
Create interface
Create a new storyboard file
Empty storyboard will be created
Creating main screen
Click on the storyboard
Create a navigation controller from the
storyboard designer by drag and drop
Delete default screen
Delete the default Table View Controller and add your own
View Controller by drag and drop

Right click from the navigation controller to View


Controller and choose root view controller relationship
Add items to screen
Add items to screen by using drag and drop:
label, button and text edit
Attention!
Disable Use Autolayout from
View Controller properties if you
want application to work in iOS 5
and earlier
Create a class for the screen

The class should subclass UiViewController


Connect your class to the
storyboard
Make the View Controller in the storyboard to be you class

Open Assistant editor

Drag and drop interface objects to you class h file to create connections
Add an action to the button
Right click on the button

Choose Touch Up
Inside and drag and
drop to the h file

Name the method that


will be executed when
button is touched
Add an action to the button
Name the method that will be executed when
button is touched
Source files
Header file will look like this:
#import <UIKit/UIKit.h>

@interface MainViewController : UIViewController


@property (strong, nonatomic) IBOutlet UIButton *mainButton;
@property (strong, nonatomic) IBOutlet UITextField *mainTextInput;
@property (strong, nonatomic) IBOutlet UILabel *mainLabel;

- (IBAction)changeLabel:(id)sender;

@end

Change label text:


- (IBAction)changeLabel:(id)sender {
// Change the text
[self.mainLabel setText:[self.mainTextInput text]];
}
Prepare application
Go to the auto-generated AppDelegate file and include your own Ui class

Delete the gray bold text from didFinishLaunchingWithOptions


- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen]
bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
Run the application
Go to project properties and set your storyboard as Main Storyboard

Press run in simulator


Run the application on phone
Open the organizer

Log in with your


developer id

You need to be enroller


in developer program

Connect the phone to the


computer

Add the device to your


provisioning portal
Maps and location
Include CoreLocation and MapKit
Go to your project properties, libraries and press to add
CoreLocation and MapKit for location and map support

By default, they are not added to your project


Adding a Map View
Add a Map View to you main screen from the designer
Displaying location on the
map
Check Shows User Location from Map View properties
Run the application
Show a pin on the map
Create a class which implements MKAnnotation protocol
.h file:
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
@interface UEFPin : NSObject <MKAnnotation>
@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSString *subtitle;
-(id)initWithCoordinate:(CLLocationCoordinate2D)location
andTitle:(NSString*)aTitle;
@end
.m File:
#import "UEFPin.h"
@implementation UEFPin
@synthesize title, subtitle, coordinate;
-(id)initWithCoordinate:(CLLocationCoordinate2D)location
andTitle:(NSString*)aTitle {
self = [super init];
if(self) {
self.coordinate = location;
self.title = aTitle;
}
return self;
}
@end
Show a pin on the map
In your view controller viewDidAppear create the pin and
zoom to it
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];

CLLocationCoordinate2D location;
location.latitude = 62.598;
Create a location
location.longitude = 29.745;

MKCoordinateRegion region;
MKCoordinateSpan span; Create a region
span.latitudeDelta=0.01;
span.longitudeDelta=0.01;
centered on location
region.span=span;
region.center=location;

[mapView setDelegate:self]; Set self as map delegate


[mapView addAnnotation:[[UEFPin alloc] initWithCoordinate:location
andTitle:@"Joensuu Science Park"]];
[mapView setRegion:region animated:TRUE]; Create the pin
[mapView regionThatFits:region]; Zoom to the region
}
Show a pin on the map
Make your view controller implement MKAnnotation
protocol and implement viewForAnnotation method

- (MKAnnotationView *) mapView:(MKMapView *)mapView


viewForAnnotation:(id <MKAnnotation>) annotation{
MKPinAnnotationView *annView=[[MKPinAnnotationView alloc]
initWithAnnotation:annotation reuseIdentifier:@"MapPin"];
annView.pinColor = MKPinAnnotationColorGreen;
annView.animatesDrop=YES;
annView.showsCallout=YES;
return annView;
}
Handling location
Create a class which implements
CLLocationManagerDelegate protocol and has a
CLLocationManager object

Header file:
@interface LocationController : NSObject <CLLocationManagerDelegate>
// Class members: Location manager and current location container
@property (nonatomic, retain) CLLocationManager *locationManager;
@property (nonatomic, retain) CLLocation *currentLocation;

+ (id)defaultController; // Static singleton

// Init, start and stop Location Manager


- (void) initLocationManager;
- (void) startLocationManager:(CLLocationAccuracy)accuracy;
- (void) stopLocationManager;
@end
Handling location
#import "LocationController.h"

@implementation LocationController
@synthesize locationManager, currentLocation; // Autogenerate getters and setters

+ (id)defaultController {// Static singleton


static LocationController *sharedController = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedController = [[self alloc] init];
});
return sharedController;
}
- (id) init {// This will be called when instantiating object
self = [super init];
if (self != nil) {
[self initLocationManager]; // Custom init code
}
return self;
}
-(void) dealloc { // Called when deleting objects
if(self.locationManager != nil) [self.locationManager stopUpdatingLocation];
// Make sure all objects are nil so Automatic Reference Count will delete them
[self setLocationManager:nil];
[self setCurrentLocation:nil];
}
Handling location
- (void) initLocationManager {
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self; // send loc updates to myself
currentLocation = [[CLLocation alloc] initWithLatitude:0 longitude:0];
// start location
[self startLocationManager:kCLLocationAccuracyBestForNavigation];
}

-(void) startLocationManager:(CLLocationAccuracy)accuracy {
if(self.locationManager != nil) {
self.locationManager.desiredAccuracy = accuracy;
self.locationManager.distanceFilter = 0;
self.locationManager.headingFilter = 0;
// Start location updates
if([CLLocationManager locationServicesEnabled]){
[self.locationManager startUpdatingLocation];
}
}
}

-(void) stopLocationManager {
[self.locationManager stopUpdatingLocation];
}
Handling location

// This is called when location is updated


- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation
*)oldLocation
{
NSDate* eventDate = newLocation.timestamp;
NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
if (abs(howRecent) < 60.0)
{
//Location timestamp is within the last 60.0 seconds, let's use it!
if(newLocation.horizontalAccuracy < kMaxGpsAccuracy){
currentLocation = newLocation;;
}
}
}
Handling location
// Error handling
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError
*)error
{
NSString *errorString; switch([error code]) {
case kCLErrorDenied:
//Access denied by user
errorString = @"Access to Location Services denied by user;
break;
case kCLErrorLocationUnknown:
//Probably temporary...
errorString = @"Location data unavailable; break;
default:
errorString = @"An unknown error has occurred";
break;
}
NSLog(@"Error: %@, errorString);
}
@end // End of class implementation

Potrebbero piacerti anche