Olá povo,
Nos últimos dias 2 e 3 de Abril aconteceu mais uma Jornada Acadêmica da Unibratec. Como já é de costume, ministrei uma palestra, dessa vez com o título "Android e iOS: o que eles tem de diferente... ou não" em dois dias de sala lotada. Aproveito para agradecer a presença de todos.
Na oportunidade, falei sobre as diferenças e semelhanças das plataformas do Google e da Apple. Ao final da palestra, desenvolvemos uma aplicação simples em ambas as plataformas.
Os slides da apresentação estão disponíveis abaixo.
4br4ç05,
nglauber
quarta-feira, 3 de abril de 2013
sexta-feira, 22 de março de 2013
iOS: Dicas 3
Olá povo,
Quem está começando com o desenvolvimento iOS pode ficar um pouco perdido com a quantidade de novos recursos que aparecem a cada versão, principalmente se estiver usando livros e/ou cursos "antigos" (1 ano atrás é antigo sim :). Tendo em vista esse cenário, Stuart Hall deu as seguintes dicas pra quem estiver começando agora com programação para os dispositivos da Apple.
Esse post foi enviado para mim por Eric Cavalcanti e é praticamente uma tradução desse post aqui.
Use ARC!
ARC é incrível, ele remove muito da complexidade de gerenciamento de memória que tínhamos de lidar anteriormente. Apesar de ser importante entender o gerenciamento de memória, o ARC torna sua vida muito mais fácil.
Desenvolvedores mais experientes relutam em usá-lo, pois querem ter esse controle da alocação e liberação de memória. Mas como muitas bibliotecas populares passaram a usar ARC, não "bata o pé" e aproveite os benefícios do ARC.
Use Blocks
Blocos são impressionantes, o código fica menor e mais claro. Várias partes da API da própria Apple já usam esse recurso. Se você não conhece blocks, dê uma olhada nesse post aqui.
Há momentos em que os delegates/protocols ou NSNotifications fazem sentido, mas os blocks devem ser sua primeira opção.
Esqueça as Threads! Use GDC.
Não sei quem disse essa frase, mas ela é a mais pura verdade:
"A programmer had a problem, so he used threads, then he had two"
O GCD (Grand Central Dispatch) tornou a vida muito mais fácil, podemos fazer uma requisição em segundo plano para não travar a UI e depois podemos atualizá-la:
Singletons com GDC
Como o Objective-C não tem o conceito de construtores, podemos usar o GDC para criar singletons.
StoryBoards são para protótipos
Na minha opinião os benefícios dos Storyboards não compensam, principalmente se você estiver fazendo mais que um projeto básico. Essa é a minha opinião, algumas pessoas amam Storyboards.
Para trabalhar em projetos com uma equipe de desenvolvimento, imagine você precise fazer merge de código de um StoryBoard usando SVN (ou até mesmo GIT). Pode ser traumático!
Internacionalize sua aplicação
Tenha em mente que sua aplicação poderá rodar em todos os países do mundo. Então prepare-a para rodar em vários idiomas. Eu fiz um vídeo que mostra como fazer internacionalização no iOS aqui.
Analise!
O menu Product > Analize exibe possíveis problemas no seu código. Achei ele muito bacana, principalmente em projetos médio/grandes.
Ame o StackOverflow
Há um monte de ótimos desenvolvedores iOS no Stack Overflow, e as chances de que eles tenham resolvido o seu problema são bem grandes. Por favor, procure antes de fazer uma pergunta, a maioria já foi respondida.
4br4ç05,
nglauber
Quem está começando com o desenvolvimento iOS pode ficar um pouco perdido com a quantidade de novos recursos que aparecem a cada versão, principalmente se estiver usando livros e/ou cursos "antigos" (1 ano atrás é antigo sim :). Tendo em vista esse cenário, Stuart Hall deu as seguintes dicas pra quem estiver começando agora com programação para os dispositivos da Apple.
Esse post foi enviado para mim por Eric Cavalcanti e é praticamente uma tradução desse post aqui.
Use ARC!
ARC é incrível, ele remove muito da complexidade de gerenciamento de memória que tínhamos de lidar anteriormente. Apesar de ser importante entender o gerenciamento de memória, o ARC torna sua vida muito mais fácil.
Desenvolvedores mais experientes relutam em usá-lo, pois querem ter esse controle da alocação e liberação de memória. Mas como muitas bibliotecas populares passaram a usar ARC, não "bata o pé" e aproveite os benefícios do ARC.
Use Blocks
Blocos são impressionantes, o código fica menor e mais claro. Várias partes da API da própria Apple já usam esse recurso. Se você não conhece blocks, dê uma olhada nesse post aqui.
Há momentos em que os delegates/protocols ou NSNotifications fazem sentido, mas os blocks devem ser sua primeira opção.
Esqueça as Threads! Use GDC.
Não sei quem disse essa frase, mas ela é a mais pura verdade:
"A programmer had a problem, so he used threads, then he had two"
O GCD (Grand Central Dispatch) tornou a vida muito mais fácil, podemos fazer uma requisição em segundo plano para não travar a UI e depois podemos atualizá-la:
dispatch_async(
dispatch_get_global_queue(
DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
^(void) {
// Código em background
dispatch_async(dispatch_get_main_queue(),
^(void) {
// Atualize a UI
}
);
}
);
Singletons com GDC
Como o Objective-C não tem o conceito de construtores, podemos usar o GDC para criar singletons.
+ (MinhaClasse *)sharedInstance {
static MinhaClasse *_shared = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_shared = [[MinhaClasse alloc] init];
});
return _shared;
}
StoryBoards são para protótipos
Na minha opinião os benefícios dos Storyboards não compensam, principalmente se você estiver fazendo mais que um projeto básico. Essa é a minha opinião, algumas pessoas amam Storyboards.
Para trabalhar em projetos com uma equipe de desenvolvimento, imagine você precise fazer merge de código de um StoryBoard usando SVN (ou até mesmo GIT). Pode ser traumático!
Internacionalize sua aplicação
Tenha em mente que sua aplicação poderá rodar em todos os países do mundo. Então prepare-a para rodar em vários idiomas. Eu fiz um vídeo que mostra como fazer internacionalização no iOS aqui.
Analise!
O menu Product > Analize exibe possíveis problemas no seu código. Achei ele muito bacana, principalmente em projetos médio/grandes.
Ame o StackOverflow
Há um monte de ótimos desenvolvedores iOS no Stack Overflow, e as chances de que eles tenham resolvido o seu problema são bem grandes. Por favor, procure antes de fazer uma pergunta, a maioria já foi respondida.
4br4ç05,
nglauber
sexta-feira, 1 de março de 2013
Artigo "Push Notifications no Android"
Olá povo,
A revista Java Magazine traz em sua edição 113 mais um artigo de minha autoria para a publicação da DevMedia. A matéria entitulada "Push Notifications no Android" mostra como utilizar o serviço de envio de mensagens da nuvem para dispositivos Android através da Google Cloud Messaging ou simplesmente GCM.
Neste artigo mostro como enviar informações de uma aplicação web para dispositivos Android usando a API do GCM. Uma ótima opção para desenvolvedores que querem promover a integração de aplicações web com dispositivos móveis.
O texto vem para complementar o artigo de C2DM que foi publicado na edição 107.
Espero que gostem.
4br4ç05,
nglauber
A revista Java Magazine traz em sua edição 113 mais um artigo de minha autoria para a publicação da DevMedia. A matéria entitulada "Push Notifications no Android" mostra como utilizar o serviço de envio de mensagens da nuvem para dispositivos Android através da Google Cloud Messaging ou simplesmente GCM.
Neste artigo mostro como enviar informações de uma aplicação web para dispositivos Android usando a API do GCM. Uma ótima opção para desenvolvedores que querem promover a integração de aplicações web com dispositivos móveis.
O texto vem para complementar o artigo de C2DM que foi publicado na edição 107.
Espero que gostem.
4br4ç05,
nglauber
sexta-feira, 22 de fevereiro de 2013
Android: Dicas 8
Olá povo,
Mais um post da série "Dicas de Android", aproveitem! E como sempre, qualquer dúvida ou sugestão deixem seus comentários.
Dica 1 - Crash Report
Essa dica veio de Charles Alves do Curso de Android EAD do CESAR.edu. É possível enviar relatórios de erro da sua aplicação para onde o desenvolvedor desejar através do ACRA (https://github.com/ACRA/acra), por padrão, ele envia para um formulário no google docs.
Dica 2 - Verificar recursos do aparelho.
Através da classe PackageManager podemos verificar se um aparelho conta com um determinado recurso de hardware, como câmera, wi-fi, etc.
Dica 3 - Mockups pra Android (Dica de Eric Cavalcanti)
Uma ótima ferramenta de prototipagem para Android é o Pencil (http://pencil.evolus.vn). Vale a pena conferir.
Dica 4 - Obtendo o tamanho da tela
Muitas vezes é necessário obter o tamanho da tela. Podemos fazer isso através da classe Display. Ela é retornada pela classe WindowManager que é um serviço do sistema.
Dica 5 - Rotação do Emulador 2.3
Um "problema" que eu sempre tinha no emulador do 2.3, era que quando eu girava o emulador para landscape e voltava para portrait, o mesmo continuava em landscape. Para contornar isso, acesse a opção Menu/Settings/Screen e desabilite a opção Autorotate.
Dica 6 - Invertendo os itens da ListView
Podemos fazer com que os itens de uma ListView começem de baixo, basta usar a propriedade android:stackFromBottom="true".
Dica 7 - PopupWindow
Só suportado no Android 3.0 (API Level 11)
Dica 8 - Exibir um vídeo
Dica de Tiago Gomes, aluno da Unibratec. Tocar vídeo da pasta res/raw
Dica 9 - API para gráficos de "pizza"
Dúvida de Rodrigo Bezerra. Eu nunca usei, mas aparentemente funciona :)
http://www.achartengine.org/
4br4ç05,
nglauber
Mais um post da série "Dicas de Android", aproveitem! E como sempre, qualquer dúvida ou sugestão deixem seus comentários.
Dica 1 - Crash Report
Essa dica veio de Charles Alves do Curso de Android EAD do CESAR.edu. É possível enviar relatórios de erro da sua aplicação para onde o desenvolvedor desejar através do ACRA (https://github.com/ACRA/acra), por padrão, ele envia para um formulário no google docs.
Dica 2 - Verificar recursos do aparelho.
Através da classe PackageManager podemos verificar se um aparelho conta com um determinado recurso de hardware, como câmera, wi-fi, etc.
PackageManager pm = getPackageManager();
boolean temCamera =
pm.hasSystemFeature(
PackageManager.FEATURE_CAMERA);
boolean temWiFiDirect =
pm.hasSystemFeature(
PackageManager.FEATURE_WIFI_DIRECT);
boolean temScreenPortrait =
pm.hasSystemFeature(
PackageManager.FEATURE_SCREEN_PORTRAIT);
Dica 3 - Mockups pra Android (Dica de Eric Cavalcanti)
Uma ótima ferramenta de prototipagem para Android é o Pencil (http://pencil.evolus.vn). Vale a pena conferir.
Dica 4 - Obtendo o tamanho da tela
Muitas vezes é necessário obter o tamanho da tela. Podemos fazer isso através da classe Display. Ela é retornada pela classe WindowManager que é um serviço do sistema.
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); int width = display.getWidth(); int height = display.getHeight();
Dica 5 - Rotação do Emulador 2.3
Um "problema" que eu sempre tinha no emulador do 2.3, era que quando eu girava o emulador para landscape e voltava para portrait, o mesmo continuava em landscape. Para contornar isso, acesse a opção Menu/Settings/Screen e desabilite a opção Autorotate.
Dica 6 - Invertendo os itens da ListView
Podemos fazer com que os itens de uma ListView começem de baixo, basta usar a propriedade android:stackFromBottom="true".
Dica 7 - PopupWindow
Só suportado no Android 3.0 (API Level 11)
public void showPopup(View v) {
PopupMenu popup = new PopupMenu(this, v);
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.actions, popup.getMenu());
popup.show();
}
Dica 8 - Exibir um vídeo
Dica de Tiago Gomes, aluno da Unibratec. Tocar vídeo da pasta res/raw
VideoView video = (VideoView)
findViewById(R.id.videoView1);
Uri uri = Uri.parse("android.resource://" +
getPackageName() + "/raw/arquivo_video");
video.setVideoURI(uri);
video.requestFocus();
video.start();
Dica 9 - API para gráficos de "pizza"
Dúvida de Rodrigo Bezerra. Eu nunca usei, mas aparentemente funciona :)
http://www.achartengine.org/
4br4ç05,
nglauber
sexta-feira, 15 de fevereiro de 2013
iOS: Dicas 2
Olá povo,
Esse post vai em homenagem a minha turma do Curso de iOS à distância que ministrei no CESAR.edu. Foram deles as dúvidas abaixo que resolvi compartilhar com vocês.
Dica 1 - Adicionando UITableView ao UIAlertView
Podemos adicionar qualquer UIView dentro de um UIAlertView. Basta usar o método addSubView e posicioná-la da maneira que deseja. O que achei "feio" aqui é que para determinar o tamanho do alert setamos o texto dele com "\n". Poderíamos utilizar o método initWithFrame, mas achei o código ainda mais complexo (embora mais preciso em termos de tamanho).
Tem uma opção interessante aqui também.
Dica 2 - Desabilitando um segmento do UISegmentedControl
Essa foi simples de achar, mas na aula passou desapercebido.
Dica 3 - Definir o badge da aplicação
O badge nada mais é do que o número que aparece em cima do ícone da aplicação, por exemplo quanto temos chamadas não atendidas e/ou mensagens recebidas.
Dica 4 - Adicionar View ao teclado
Ao invés de criar a view no código, você pode adicionar a mesma no XIB da tela e setar a propriedade inputAccessoryView. Para exemplificar, adicionei uma Toolbar ao XIB e crie um IBOutlet para ela.
Dica 5 - Ocultar teclado virtual
Sempre xingava o iOS por ter que ocultar o teclado via código. Mas achei a melhor maneira para ocultar o teclado. É só usar o método touchesBegan:withEvent da classe UIRespoder (super classe de UIView e UIViewController) e chamar o método endEditing da UIView.
Dicas 6 - Obtendo a orientação
Uma das melhores maneiras de obter a orientação do dispositivo é a abaixo:
Essa abordagem resolve alguns problemas que já tive. Por exemplo, quando o telefone está sobre a mesa, o método [[UIDevice currentDevice]orientation] retorna a orientação UIDeviceOrientationFaceUp (com o display para cima), enquanto que o método acima retorna a orientação da barra de status do aparelho e não do aparelho em si.
Qualquer dúvida (ou sugestão), deixem seus comentários,
4br4ç05
nglauber
Esse post vai em homenagem a minha turma do Curso de iOS à distância que ministrei no CESAR.edu. Foram deles as dúvidas abaixo que resolvi compartilhar com vocês.
Dica 1 - Adicionando UITableView ao UIAlertView
Podemos adicionar qualquer UIView dentro de um UIAlertView. Basta usar o método addSubView e posicioná-la da maneira que deseja. O que achei "feio" aqui é que para determinar o tamanho do alert setamos o texto dele com "\n". Poderíamos utilizar o método initWithFrame, mas achei o código ainda mais complexo (embora mais preciso em termos de tamanho).
UITableView *table =
[[UITableView alloc]
initWithFrame:CGRectMake(10, 50, 265, 100)];
table.dataSource = self;
table.delegate = self;
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Escolha uma opção"
message:@"\n\n\n\n\n"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];
[alert addSubview:table];
alert.autoresizesSubviews = YES;
[alert show];
Tem uma opção interessante aqui também.
Dica 2 - Desabilitando um segmento do UISegmentedControl
Essa foi simples de achar, mas na aula passou desapercebido.
[_meuSegmentedControl setEnabled:NO forSegmentAtIndex:0];
Dica 3 - Definir o badge da aplicação
O badge nada mais é do que o número que aparece em cima do ícone da aplicação, por exemplo quanto temos chamadas não atendidas e/ou mensagens recebidas.
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:12];
Dica 4 - Adicionar View ao teclado
Ao invés de criar a view no código, você pode adicionar a mesma no XIB da tela e setar a propriedade inputAccessoryView. Para exemplificar, adicionei uma Toolbar ao XIB e crie um IBOutlet para ela.
@interface NGViewController : UIViewController @property (weak, nonatomic) IBOutlet UITextField *txtSobrenome; @property (weak, nonatomic) IBOutlet UIToolbar *minhaBarra; @endDepois é só colocar isso no viewDidLoad
[_txtSobrenome setInputAccessoryView:_minhaBarra];
Dica 5 - Ocultar teclado virtual
Sempre xingava o iOS por ter que ocultar o teclado via código. Mas achei a melhor maneira para ocultar o teclado. É só usar o método touchesBegan:withEvent da classe UIRespoder (super classe de UIView e UIViewController) e chamar o método endEditing da UIView.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
Independente da quantidade de UITextFields, o teclado vai sempre desaparecer.Dicas 6 - Obtendo a orientação
Uma das melhores maneiras de obter a orientação do dispositivo é a abaixo:
// Verifica se é portrait ou portrait upsidedown
if (UIDeviceOrientationIsPortrait(
[[UIApplication sharedApplication]
statusBarOrientation])){
}
Essa abordagem resolve alguns problemas que já tive. Por exemplo, quando o telefone está sobre a mesa, o método [[UIDevice currentDevice]orientation] retorna a orientação UIDeviceOrientationFaceUp (com o display para cima), enquanto que o método acima retorna a orientação da barra de status do aparelho e não do aparelho em si.
Qualquer dúvida (ou sugestão), deixem seus comentários,
4br4ç05
nglauber
sexta-feira, 1 de fevereiro de 2013
@selector, Blocks e NSInvocation
Olá povo,
O iOS trabalha fortemente com o padrão Delegate, onde você determina uma classe que implementa um dado protocolo e a mesma tratará algum tipo de evento. Isso nada mais é do que o padrão de projeto observer (levemente modificado). Mas em diversos pontos da API também vemos uma outra abordagem: as funções/metódos de callback. Os callbacks, bem famosos no JavaScript, são métodos ou funções que são passados como parâmetros para outros métodos, e são chamados em um dado momento da execução do método para qual ele foi passado.
Vou falar nesse post de como podemos usar os callbacks no iOS.
@selector
Uma forma de usar os callbacks é usando selectors. Digamos que você esteja implementando um método que fará uma série de processamento, e ao final você quer avisar para quem chamou esse método que o mesmo acabou. Isso seria a clássica implementação de um Observer (ou Delegate). Mas podemos fazer com selectors dessa forma:
Aqui nós usamos a função objc_msgSend ao invés do famoso performSelector. Isso porque com a migração para o ARC, o compilador não consegue garantir que a função existe e então exibe um Warning. Uma alternativa para essa função e continuar usando o performSelector é conforme abaixo:
NSIvocation
E como faríamos para pegar o retorno usando @selector? Temos uma outra alternativa. Utilizar a classe NSInvocation.
Blocks
A partir do iOS 4, foi disponibilizado uma outra forma de usar funções de callback, os blocks. Seu propósito é bem similar ao selector. Eles são particularmente úteis para executar ações concorrentes ou para callbacks. As principais vantagens dos blocks são: Eles permitem escrever código o código perto da sua chamada (como inner classes do Java); e permitem acessar variáveis locais. Vejamos abaixo a sintaxe e como ele funciona.
Outra grande vantagem de utilizar os blocks em relação ao selector, é que não se faz necessário passar o target para o método. Podemos chamá-lo diretamente sem ter a referência do objeto que tem o método. Além disso, conseguimos pegar um retorno de um método mais facilmente do que com o @selector.
Qualquer dúvida, deixem seus comentários.
4br4ç05,
nglauber
Fontes:
http://iphonedevblog.com/code/how-to-use-nsinvocation/
http://pragmaticstudio.com/blog/2010/7/28/ios4-blocks-1
O iOS trabalha fortemente com o padrão Delegate, onde você determina uma classe que implementa um dado protocolo e a mesma tratará algum tipo de evento. Isso nada mais é do que o padrão de projeto observer (levemente modificado). Mas em diversos pontos da API também vemos uma outra abordagem: as funções/metódos de callback. Os callbacks, bem famosos no JavaScript, são métodos ou funções que são passados como parâmetros para outros métodos, e são chamados em um dado momento da execução do método para qual ele foi passado.
Vou falar nesse post de como podemos usar os callbacks no iOS.
@selector
Uma forma de usar os callbacks é usando selectors. Digamos que você esteja implementando um método que fará uma série de processamento, e ao final você quer avisar para quem chamou esse método que o mesmo acabou. Isso seria a clássica implementação de um Observer (ou Delegate). Mas podemos fazer com selectors dessa forma:
// Precisamos pra chamar objc_msgSend
#import <objc/message.h>
- (void) executar:(SEL)funcaoDeCallback {
NSLog(@"Um monte de processamento aqui…");
if ([self respondsToSelector:funcaoDeCallback]){
objc_msgSend(self, funcaoDeCallback, @"Glauber");
}
}
O método executar tem um parâmetro do tipo SEL, que é um ponteiro para um método. Dentro do método checamos se a nossa classe (self) responderá aquele selector, ou seja, se ela declarou um método com essa assinatura. Em caso positivo, usamos a função objc_msgSend passando qual o objeto que tem o método, o selector (ou seja, o método) e um parâmetro (que eu quis passar só pra ilustrar). Então, para executarmos um selector, temos sempre que passar o target (que é o objeto que tem o método) e o selector.Aqui nós usamos a função objc_msgSend ao invés do famoso performSelector. Isso porque com a migração para o ARC, o compilador não consegue garantir que a função existe e então exibe um Warning. Uma alternativa para essa função e continuar usando o performSelector é conforme abaixo:
#pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-performSelector-leaks" [self performSelector:funcaoDeCallback withObject:@"Glauber"]; #pragma clang diagnostic popE para chamar o método executar, de modo que depois ele chame o método aqui:
SEL selector = @selector(meuMetodo:); [self executar:selector];Digamos que o método aqui ficasse dessa forma:
- (NSString *)meuMetodo:(NSString *)texto {
NSLog(@"O executar retornou: %@", texto);
return @"OK";
}
Um exemplo clássico do uso de selector na API é na criação de botões para NavigationBar, onde determinamos o método que será chamado quando clicar no mesmo.
UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithTitle:@"Esquerda" style:UIBarButtonItemStyleBordered target:self action:@selector(meuClick)];
NSIvocation
E como faríamos para pegar o retorno usando @selector? Temos uma outra alternativa. Utilizar a classe NSInvocation.
SEL selector = @selector(aqui:);
NSString *parametro = @"Glauber";
NSMethodSignature * assinatura =
[self methodSignatureForSelector:selector];
NSInvocation * invocacao = [NSInvocation
invocationWithMethodSignature:assinatura];
[invocacao setTarget:self];
[invocacao setSelector:selector];
[invocacao setArgument:¶metro atIndex:2];
[invocacao invoke];
NSString *retorno;
[invocacao getReturnValue:&retorno];
NSLog(@"Retorno: %@", retorno);
Notem que para passar o parâmetro usamos 2 para o primeiro (e único) parâmetro. Isso porque as posições 0 e 1 estão reservadas para self e _cmd respectivamente.Blocks
A partir do iOS 4, foi disponibilizado uma outra forma de usar funções de callback, os blocks. Seu propósito é bem similar ao selector. Eles são particularmente úteis para executar ações concorrentes ou para callbacks. As principais vantagens dos blocks são: Eles permitem escrever código o código perto da sua chamada (como inner classes do Java); e permitem acessar variáveis locais. Vejamos abaixo a sintaxe e como ele funciona.
int multiplicador = 7;
int (^meuBloco)(int) = ^(int num) {
return num * multiplicador;
};
NSLog("%d", meuBloco(3));
No código acima, declaramos um bloco que retorna um int, chama-se meuBloco e recebe um inteiro como parâmetro. O nome do parâmetro (num) é definido na inicialização do block.
Se quisermos declarar um método que recebe um block que retorna void e recebe uma NSString por exemplo:
- (void)meuMetodoRecebeUmBlock:(void (^)(NSString *texto))bloco{
NSLog(@"Faça alguma coisa");
bloco(@"Terminou");
}
E para chamar:
[self meuMetodoRecebeUmBlock:^(NSString* texto){
NSLog(@"meuMetodoRecebeUmBlock disse: %@", texto);
}];
Outra grande vantagem de utilizar os blocks em relação ao selector, é que não se faz necessário passar o target para o método. Podemos chamá-lo diretamente sem ter a referência do objeto que tem o método. Além disso, conseguimos pegar um retorno de um método mais facilmente do que com o @selector.
Qualquer dúvida, deixem seus comentários.
4br4ç05,
nglauber
Fontes:
http://iphonedevblog.com/code/how-to-use-nsinvocation/
http://pragmaticstudio.com/blog/2010/7/28/ios4-blocks-1
sábado, 26 de janeiro de 2013
YouTube API para Android
Olá povo,
No dia 22/01/2013 a Google anunciou uma API para adicionar vídeos do YouTube nas aplicações Android. Os requisitos mínimos para utilização da API é que o dispositivo rode Android 2.2 ou superior e ter a aplicação do Youtube versão 4.2.16 ou mais recente instalada (por isso, não consegui rodar no emulador). Outro detalhe importante é que os vídeos poderão ser executados tanto em Activities diretamente ou em Fragments.
E nesse primeiro post de 2013 vou mostrar como dar os primeiros passos.
Gerando a chave de acesso
A primeira coisa que devemos fazer é registrar nossa aplicação no site Google APIs Console. Para termos acesso aos mais diversos serviços do Google, precisamos criar um projeto (se você já não tiver um). Para tal, clique em Create new Project. Agora acesse a opção API access depois clique no botão Create new Android key (se você não tiver uma), no popup que for exibido clique em Create. Será gerada uma chave no padrão SHA-1 similar a essa que usaremos no nosso código: AIzbSyCyoMobvh72ZrSv4xQddOLzDOlaLqCcILU
Baixando a API
Uma vez que temos a chave de acesso, baixe a API clicando aqui. Descompacte o arquivo zip e adicione o arquivo libs/YouTubeAndroidPlayerApi.jar à pasta libs do seu projeto Android. Ainda não criou o projeto? Tá esperando o quê? :)
Hello World Youtube!
Sem muitas delongas, adicione a permissão de Internet no AndroidManifest.xml e deixe sua Activity como abaixo:
No método onInitializationSuccess usamos o objeto YouTubePlayer para inicializar o vídeo usando o método cueVideo passando o id do vídeo do YouTube. O parâmetro wasRestored é pra saber se o vídeo está sendo restaurado do ponto onde parou.
O exemplo que fizemos aqui usamos a YouTubeView, mas você pode fazer o mesmo utilizando a classe YouTubeFragment (e YouTubeSupportFragment para dispositivos anteriores ao Android 3).
Mais informações sobre a YouTube API você pode ter aqui.
Qualquer dúvida, deixem seus comentários.
4br4ç05,
nglauber
No dia 22/01/2013 a Google anunciou uma API para adicionar vídeos do YouTube nas aplicações Android. Os requisitos mínimos para utilização da API é que o dispositivo rode Android 2.2 ou superior e ter a aplicação do Youtube versão 4.2.16 ou mais recente instalada (por isso, não consegui rodar no emulador). Outro detalhe importante é que os vídeos poderão ser executados tanto em Activities diretamente ou em Fragments.
E nesse primeiro post de 2013 vou mostrar como dar os primeiros passos.
Gerando a chave de acesso
A primeira coisa que devemos fazer é registrar nossa aplicação no site Google APIs Console. Para termos acesso aos mais diversos serviços do Google, precisamos criar um projeto (se você já não tiver um). Para tal, clique em Create new Project. Agora acesse a opção API access depois clique no botão Create new Android key (se você não tiver uma), no popup que for exibido clique em Create. Será gerada uma chave no padrão SHA-1 similar a essa que usaremos no nosso código: AIzbSyCyoMobvh72ZrSv4xQddOLzDOlaLqCcILU
Baixando a API
Uma vez que temos a chave de acesso, baixe a API clicando aqui. Descompacte o arquivo zip e adicione o arquivo libs/YouTubeAndroidPlayerApi.jar à pasta libs do seu projeto Android. Ainda não criou o projeto? Tá esperando o quê? :)
Hello World Youtube!
Sem muitas delongas, adicione a permissão de Internet no AndroidManifest.xml e deixe sua Activity como abaixo:
import android.os.Bundle;
import com.google.android.youtube.player.*;
import com.google.android.youtube.player.YouTubePlayer.*;
public class MainActivity
extends YouTubeBaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
YouTubePlayerView youTubeView =
new YouTubePlayerView(this);
setContentView(youTubeView);
youTubeView.initialize(
"AIzbSyCyoMobvh72ZrSv4xQddOLzDOlaLqCcILU",
new OnInitializedListener(){
@Override
public void onInitializationFailure(
Provider provider,
YouTubeInitializationResult result) {
}
@Override
public void onInitializationSuccess(
Provider provider,
YouTubePlayer player,
boolean wasRestored) {
if (!wasRestored){
player.cueVideo("9bZkp7q19f0");
}
}
});
}
}
Nossa classe herda de YouTubeBaseActivity e no método onCreate instanciamos uma YouTubePlayerView que é quem exibirá o vídeo. Com esse objeto chamamos o método initialize passando a chave de acesso que geramos anteriormente além de uma instância da interface OnInitilizedListener. Essa interface tem dois métodos: um para quando a inicialização foi feita com sucesso; e outra para quando houve algum problema.
No método onInitializationSuccess usamos o objeto YouTubePlayer para inicializar o vídeo usando o método cueVideo passando o id do vídeo do YouTube. O parâmetro wasRestored é pra saber se o vídeo está sendo restaurado do ponto onde parou.
O exemplo que fizemos aqui usamos a YouTubeView, mas você pode fazer o mesmo utilizando a classe YouTubeFragment (e YouTubeSupportFragment para dispositivos anteriores ao Android 3).
Mais informações sobre a YouTube API você pode ter aqui.
Qualquer dúvida, deixem seus comentários.
4br4ç05,
nglauber
Assinar:
Postagens (Atom)



