A primeira app iOS
     ninguém esquece
A primeira app iOS
     ninguém esquece
@sr_valeriano
•   Ricardo Valeriano
•   Developer iOS, Java, Ruby e JavaScript
•   Instrutor iOS, Java, Ruby e JavaScript
•   github.com/ricardovaleriano
Como?

•   Básico, mesmo, mesmo
•   Base para pesquisar depois
•   Alguns conceitos... básicos
•   Algum código nos slides =(
•   Algum código ao vivo =)
NeXT Computer
NeXT Computer
•   1985 - fundada por Jobs
NeXT Computer
•   1985 - fundada por Jobs
•   1988 - 1º NeXTStep Release
NeXT Computer
•   1985 - fundada por Jobs
•   1988 - 1º NeXTStep Release
•   1990 - NeXTstation
NeXT Computer
•   1985 - fundada por Jobs
•   1988 - 1º NeXTStep Release
•   1990 - NeXTstation
NeXT Computer
•   1985 - fundada por Jobs
•   1988 - 1º NeXTStep Release
•   1990 - NeXTstation
•   1990 - NeXTcube
NeXT Computer
•   1985 - fundada por Jobs
•   1988 - 1º NeXTStep Release
•   1990 - NeXTstation
•   1990 - NeXTcube
NeXT Computer
•   1985 - fundada por Jobs
•   1988 - 1º NeXTStep Release
•   1990 - NeXTstation
•   1990 - NeXTcube
•   1993 - NeXTStep (S.O.)
NeXT Computer
•   1985 - fundada por Jobs
•   1988 - 1º NeXTStep Release
•   1990 - NeXTstation
•   1990 - NeXTcube
•   1993 - NeXTStep (S.O.)
NeXTSTEP - S.O.
      1988
NeXTSTEP - S.O.
      1988
Steve Jobs e NeXTSTEP

•   Unix-like :: BSD
•   Objective-C runtime
•   O.O. application layer
•   Dock
•   GUI
OpenStep
  “OpenStep was an object-oriented application
programming interface (API) specification for an
   object-oriented operating system that used a
   non-NeXTSTEP operating system as its core,
       principally developed by NeXT with Sun
                                 Microsystems.”
iPod Touch
iPhone OS
   2007
iOS - SDK e apps
      2008
iPad (iOS)
   2010
iOS 4 - Multitasking
        2010
iOS 5
 2011
iOS 5
 2011
iOS
Cocoa Touch


Media Layer


Core Services


  Core OS
iOS


Cocoa Touch
Media Layer
Core Services
  Core OS
iOS
Sistema Operacional

      Cocoa Touch
      Media Layer
      Core Services
        Core OS
iOS
Sistema Operacional

      Cocoa Touch
      Media Layer
      Core Services
        Core OS
iOS
 Multitasking
GestureViewNotification Service
SystemPush Controllers
Apple Recognizers
          Cocoa Touch
iOS
         Cocoa Touch

Multitasking

Apple Push Notification Service

Gesture Recognizers

System View Controllers
iOS
 Multitasking
GestureViewNotification Service
SystemPush Controllers
Apple Recognizers
          Cocoa Touch
iOS
Air Play
Video
Graphic Media Layer
Audio
iOS
           Media Layer

Graphic

Audio

Video

Air Play
iOS
Air Play
Video
Graphic Media Layer
Audio
iOS
SQLite
In-App Core
ARC Purchase
iCloud StorageServices
iOS
         Core Services

iCloud Storage

ARC

In-App Purchase

SQLite
iOS
SQLite
In-App Core
ARC Purchase
iCloud StorageServices
iOS
Core Bluetooth network, memory)
System Framework
External Accessory Framework
Security(thread, OS
            Core
iOS
          Core OS

Core Bluetooth

External Accessory Framework

Security Framework

System (thread, network, memory)
iOS
Core Bluetooth network, memory)
System Framework
External Accessory Framework
Security(thread, OS
            Core
Xcode, a IDE (para mac)
Show me!
Objective-C

•   Bizarro?
•   Esquizóide?
•   Obstáculo?
Objective-C

•   Orientado a Objetos
•   Dinâmico
•   Gerenciamento de memória é contigo!
•   Square Brackets prá dar e vender
BRACE YOURSELVES




IT’S A C EXTENSION
Coisas em C?


NSLog(@"Vamo que vamo-lhes!");
Coisas em C?
        Funçãozinha marota.

NSLog(@"Vamo que vamo-lhes!");
Coisas em C?
        Funçãozinha marota.

NSLog(@"Vamo que vamo-lhes!");
Coisas em C?
        Funçãozinha marota.

NSLog(@"Vamo que vamo-lhes!");
Coisas em C?


NSLog(@"Vamo que vamo-lhes!");
Classes


•   Header File >> Declaração
•   Implementation File >> Implementação XD
Diretivas (*.h)


#import <Foundation/Foundation.h>

@interface Contato : NSObject

@end
Diretivas (*.h)
       Disponibiliza recursos e tipos básicos
            (como a classe NSString)

#import <Foundation/Foundation.h>

@interface Contato : NSObject

@end
Diretivas (*.h)


#import <Foundation/Foundation.h>

@interface Contato : NSObject

@end
Diretivas (*.h)


#import <Foundation/Foundation.h>

@interface Contato : NSObject

@end
           Permite definir uma nova classe
Diretivas (*.h)


#import <Foundation/Foundation.h>

@interface Contato : NSObject

@end
Diretivas (*.h)


#import <Foundation/Foundation.h>

@interface Contato : NSObject

@end
         Nome da nova classe
Diretivas (*.h)


#import <Foundation/Foundation.h>

@interface Contato : NSObject

@end
Diretivas (*.h)


#import <Foundation/Foundation.h>

@interface Contato : NSObject

@end
                     Herança
Diretivas (*.h)


#import <Foundation/Foundation.h>

@interface Contato : NSObject

@end
Diretivas (*.h)


#import <Foundation/Foundation.h>

@interface Contato : NSObject

@end
          É isso!
Diretivas (*.m)

#import "Contato.h"

@implementation Contato

@end
Diretivas (*.m)
Disponibiliza a declaração da classe
   #import "Contato.h"

   @implementation Contato

   @end
Diretivas (*.m)
            Poderia importar outros
              arquivos se preciso
#import "Contato.h"

@implementation Contato

@end
Diretivas (*.m)

#import "Contato.h"

@implementation Contato

@end
         Objective C, meu amigo, agora
          vamos implementar a classe
Diretivas (*.m)

#import "Contato.h"

@implementation Contato

@end
           E o nome dessa classe é
                  Contato
Diretivas (*.m)

#import "Contato.h"

@implementation Contato

@end

          E terminamos!
Show me!
Instanciando Objetos


         Contato alloc



Método de classe, para alocar memória
      e otras cositas más...
Instanciando Objetos


             .
     Contato alloc


     Invocação de método?
Instanciando Objetos


          X
          .
     Contato alloc
Instanciando Objetos


          X
          .
     Contato alloc
Instanciando Objetos


to *contato = [ Contato alloc        init];

           Na verdade é assim que se invoca!
Instanciando Objetos


to *contato = [[Contato alloc init];
                Contato alloc]

               Agora está completo.
Instanciando Objetos


to *contato = [[Contato alloc] init];

              Retorna uma “promessa”,
                queremos o Objeto
                 (do tipo Contato)
Instanciando Objetos


to *contato = [[Contato alloc] init];

               Nova invocação de método!
Instanciando Objetos


to *contato = [[Contato alloc] init];

              O retorno é um objeto do tipo
                        Contato.
Instanciando Objetos


Contato *contato = [[Contato alloc] init];
         contato
                 Criando uma referência chamada
                   contato para o novo objeto.
Instanciando Objetos


Contato   contato = [[Contato alloc] init];

          Define o tipo da referência.
Instanciando Objetos


Contato *contato = [[Contato alloc] init];

         Por falar em referência
Propriedades
                 Declaração (*.h)


@property ( nonatomic, strong ) NSString * nome;
Propriedades
                 Declaração (*.h)


@property ( nonatomic, strong ) NSString * nome;
                Nome da propriedade
Propriedades
                  Declaração (*.h)


@property ( nonatomic, strong ) NSString * nome;

       Tipo referenciado por nome
Propriedades
                 Declaração (*.h)


@property ( nonatomic, strong ) NSString * nome;
                 Por falar em referência...
Propriedades
                  Declaração (*.h)


@property ( nonatomic, strong ) NSString * nome;


                Gerenciamento de memória
         (como interefer no contador de referência)
Propriedades
                  Declaração (*.h)


@property ( nonatomic, strong ) NSString * nome;


                Gerenciamento de memória
         (como interefer no contador de referência)
Propriedades
                   Declaração (*.h)


@property ( nonatomic, strong ) NSString * nome;



   Acesso concorrente (threads)
Implementação (*.m)
  #import "Contato.h"

  @implementation Contato

  @synthesize nome;

  @end
Implementação (*.m)
  #import "Contato.h"

  @implementation Contato

  @synthesize nome;

  @end
            Agora sim: getter e setter
Propriedades


     •   Métodos de acesso e atribuição


Contato *contato = [[Contato alloc] init];

[contato setNome:@"Ricardo Valeriano"];
NSString *nome = [contato nome];
Propriedades

     •   Métodos de acesso e atribuição
     •   Podem ser acessadas via “dot notation”

Contato *contato = [[Contato alloc] init];

contato.nome = @"Ricardo Valeriano";
NSString *nome = contato.nome;
Métodos


-(void)cadastra:(Contato *)contato;
       cadastra
Métodos


-(void)cadastra:(Contato *)contato;
       cadastra:(Contato

             Indica recebimento de parâmetro
Métodos


-(void)cadastra:(Contato *)contato;
       cadastra:(Contato


                  Tipo do parâmetro
Métodos


-(void)cadastra:(Contato *)contato;
       cadastra:(Contato


              Nome da variável no método
Métodos


(void)cadastra:(Contato *)contato;


Tipo do retorno
Métodos


-(void)cadastra:(Contato *)contato;
Métodos


   -(void)cadastra:(Contato *)contato;

  Método de instância.
+ para método de classe.
Métodos

-(void)cadastraNome:(NSString *)nome
              email:(NSString *)email;
Métodos

 -(void)cadastraNome:(NSString *)nome
               email:(NSString *)email;


[cadastro cadastraNome:@"Ricardo"
                 email:@"rv@caelum.com.br"];
VALERIANO




Y U NO FINISHES THE FORM?
Binding de Elementos
•   Declaração (*.h)
•   IBOutlet (propriedades)

•   Instâncias de UIView
Binding de Elementos
•   Declaração (*.h)
•   IBOutlet (propriedades)

•   Instâncias de UIView
Binding de Eventos
•   Declaração (*.h)
•   IBAction (métodos)

•   Instâncias de UIView
Binding de Eventos
•   Declaração (*.h)
•   IBAction (métodos)

•   Instâncias de UIView
Show me the code,
     now!
Integração nativa
Integração nativa

NSURL *url = [NSURL URLWithString:appUrl];
[[UIApplication sharedApplication] openURL:url];
Maps
Maps
NSString *urlEndereco = [NSString
stringWithFormat:@"http://maps.google.com/maps?
q=%@", @"Av. Ana costa"];
Maps
NSString *urlEndereco = [NSString
stringWithFormat:@"http://maps.google.com/maps?
q=%@", @"Av. Ana costa"];

NSString *appUrl = [urlEndereco
stringByAddingPercentEscapesUsingEncoding:NSUTF8
StringEncoding];
Maps
NSString *urlEndereco = [NSString
stringWithFormat:@"http://maps.google.com/maps?
q=%@", @"Av. Ana costa"];

NSString *appUrl = [urlEndereco
stringByAddingPercentEscapesUsingEncoding:NSUTF8
StringEncoding];

NSURL *url = [NSURL URLWithString:appUrl];
[[UIApplication sharedApplication] openURL:url];
Telefone
Telefone

NSString *appUrl = @"tel:98761234";
Telefone

NSString *appUrl = @"tel:98761234";

NSURL *url = [NSURL URLWithString:appUrl];
[[UIApplication sharedApplication] openURL:url];
Frameworks
Frameworks
if([MFMailComposeViewController canSendMail]){
Frameworks
if([MFMailComposeViewController canSendMail]){
! ! MFMailComposeViewController *enviadorEmail =
[[MFMailComposeViewController alloc] init];
Frameworks
if([MFMailComposeViewController canSendMail]){
! ! MFMailComposeViewController *enviadorEmail =
[[MFMailComposeViewController alloc] init];

! ! enviadorEmail.mailComposeDelegate = self;
Frameworks
if([MFMailComposeViewController canSendMail]){
! ! MFMailComposeViewController *enviadorEmail =
[[MFMailComposeViewController alloc] init];

! ! enviadorEmail.mailComposeDelegate = self;
Frameworks
if([MFMailComposeViewController canSendMail]){
! ! MFMailComposeViewController *enviadorEmail =
[[MFMailComposeViewController alloc] init];

! ! enviadorEmail.mailComposeDelegate = self;

   [enviadorEmail
Frameworks
if([MFMailComposeViewController canSendMail]){
! ! MFMailComposeViewController *enviadorEmail =
[[MFMailComposeViewController alloc] init];

! ! enviadorEmail.mailComposeDelegate = self;

    [enviadorEmail
  setToRecipients:[NSArray
  arrayWithObject:@"ricardovaleriano@caelum"]];
Frameworks
if([MFMailComposeViewController canSendMail]){
! ! MFMailComposeViewController *enviadorEmail =
[[MFMailComposeViewController alloc] init];

! ! enviadorEmail.mailComposeDelegate = self;

    [enviadorEmail
  setToRecipients:[NSArray
  arrayWithObject:@"ricardovaleriano@caelum"]];

! [enviadorEmail setSubject:@"Dev in Santos"];
Frameworks
if([MFMailComposeViewController canSendMail]){
! ! MFMailComposeViewController *enviadorEmail =
[[MFMailComposeViewController alloc] init];

! ! enviadorEmail.mailComposeDelegate = self;

    [enviadorEmail
  setToRecipients:[NSArray
  arrayWithObject:@"ricardovaleriano@caelum"]];

! [enviadorEmail setSubject:@"Dev in Santos"];

! [self presentModalViewController:enviadorEmail
Frameworks
if([MFMailComposeViewController canSendMail]){
! ! MFMailComposeViewController *enviadorEmail =
[[MFMailComposeViewController alloc] init];

! ! enviadorEmail.mailComposeDelegate = self;

    [enviadorEmail
  setToRecipients:[NSArray
  arrayWithObject:@"ricardovaleriano@caelum"]];

! [enviadorEmail setSubject:@"Dev in Santos"];

! [self presentModalViewController:enviadorEmail
                          animated:YES];
Frameworks
if([MFMailComposeViewController canSendMail]){
! ! MFMailComposeViewController *enviadorEmail =
[[MFMailComposeViewController alloc] init];

! ! enviadorEmail.mailComposeDelegate = self;

      [enviadorEmail
    setToRecipients:[NSArray
    arrayWithObject:@"ricardovaleriano@caelum"]];

! [enviadorEmail setSubject:@"Dev in Santos"];

! [self presentModalViewController:enviadorEmail
                          animated:YES];
}
Frameworks

- (void) mailComposeController:(MFMailComposeViewController
*)controller didFinishWithResult:(MFMailComposeResult)result
error:(NSError *)error
{
    [self dismissModalViewControllerAnimated:YES];
}
Mandar um fax


•   Daquele de papel mesmo
Mandar um fax


•   Daquele de papel mesmo
Open Source?


•   Não é tão forte
•   Mas tem coisas bacanas
github.com/facebook
Diego, @dchohfi
github.com/caelum
Como?
Como?

•   Baixe o Xcode (ide) da Apple
Como?

•   Baixe o Xcode (ide) da Apple
•   Crie uma aplicação integrada com a câmera
Como?

•   Baixe o Xcode (ide) da Apple
•   Crie uma aplicação integrada com a câmera
•   Se puder ser social, melhor
Como?

•   Baixe o Xcode (ide) da Apple
•   Crie uma aplicação integrada com a câmera
•   Se puder ser social, melhor
Como?

•   Baixe o Xcode (ide) da Apple
•   Crie uma aplicação integrada com a câmera
•   Se puder ser social, melhor
•   Vá prá galera
Como?

•   Baixe o Xcode (ide) da Apple
•   Crie uma aplicação integrada com a câmera
•   Se puder ser social, melhor
•   Vá prá galera
IP-67
Obrigado
@sr_valeriano

A primeira app iOS (a gente não esquece)

Notas do Editor