Artigos da contendo a tag ‘iphone’

I.ndigo Blog.

Go Tech

Link Roundup – Janeiro de 2012

02fevereiro

Janeiro foi um mês realmente agitado aqui na I.ndigo, logo abaixo compilamos alguns posts e acontecimentos que marcaram o nosso mês por aqui.

I.ndigo

Para comemorar o ano que tivemos e dar o kick-off oficial de 2012, produzimos esse infográfico (lindo!) com os resultados alcançados no último ano.

Foram 29 apps produzidos em 1 ano, alguns deles só lançados neste mês, como o do Minnesota Wild que facilitou a vida dos fans do time que disputa a NHL e o Hy-Vee, já imaginou entrar em um supermercado e ter na palma da mão a localização exata dos produtos que procura?

Design & User Experience

Quando o assunto é experiência do usuário, a Nordstrom Innovation Lab deu uma aula com esse estudo de caso e, durante o mês nos deparamos com alguns apps e resources extremamente interessantes para os designers, como o Clear for iPhone, essa galeria de ícones para iOS e o design guideline lançado pelo Google.

Keep Watching

Entre os apps e tecnologias que mais chamaram nossa atenção, as Smart Tags apresentadas pela Sony na CES ganharam destaque ao apresentar uma maneira inovadora e criativa de lidar com o NFC, já a principal decepção ficou por conta do adiamento/cancelamento dos cursos online de Stanford, provavelmente causados pela renúncia do Professor Sebastian Thrun.

Mobile Trends & Mobile Business

Analisando as tendências e indicadores de mercado o, já previsível, crescimento do m-commerce em 2011 se concretizou e também ganhou destaque no nosso blog.

iOS Development

As novidades da área técnica também não ficaram de lado, o principal destaque do mês foi a nossa participação no iOS 5 Tech Talk Tour 2012 que já nos rendeu ótimos contatos e muitos frutos, inclusive para o blog, com o nosso post de reconhecimento facial e aproveitando o gancho, o artigo sobre falsas impressões do multitasking do IOS vale a pena ser lido também. Quer saber mais sobre o Tech Talk? A Apple disponibilizou alguns vídeos sobre tudo o que rolou na Tour.

Outra ótima referência, quando a dúvida é entre a escolha ente bancos dados relacional ou não relacional, é este artigo do Matin Fowler

Web Development

Nem só de mobile viverá o homem. Como resultado das nossas pesquisas em HTML5 e CSS3 encontramos essa demonstração de como simular o 3D, que nos deixou de queixos caídos. E a implementação do menu do Path em CSS também demonstra que os web mobile apps tem um futuro promissor pela frente (se você ainda não conhece o Path, vale a pena conferir, baixe aqui).

permalink
, , , , , , , , , , , , , , , , , , ,
Apps

Hy-Vee Mobile App

27janeiro

Já imaginou entrar em um supermercado e ter na palma da mão a localização exata dos produtos que procura?

Esta é apenas uma das dezenas inovações que colocamos neste aplicativo mobile para a rede de supermercados norte-americana Hy-Vee.

Inúmeras outras novidades foram inseridas no aplicativo que realmente facilitam a vida do consumidor como busca de produtos por reconhecimento de voz, cupons de desconto, receitas, etc. Vale conferir o vídeo para saber mais sobre o aplicativo e a linha de produtos I.ndigo m-Commerce.

O aplicativo, que já estava disponível gratuitamente na App Store agora também na versão Android.

permalink
, , , , ,
Stack Overflow

Releasing NSURLConnection and its delegate

27janeiro

When not using ARC, you will have to pay extra attention to NSURLConnection’s delegate object as there is a special consideration for it: it is always retained.

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html#//apple_ref/doc/uid/20001697-BAJDDIDG

initWithRequest:delegate:
 
Special Considerations: The connection retains delegate. It releases delegate when the connection finishes loading, fails, or is canceled.

So, taking that into consideration, you have several options to ensure that your delegate will be released correctly and I will try to explain 2 simple ones.

The first, and most commonly used, is to use the same class that initialize the NSURLConnection as the delegate.

[[NSURLConnection alloc] initWithRequest:request self];

By doing that, your class the retain count would be increased by 1 when the connection starts and then would de reduced by 1 after the connection finishes loading, fails, or is canceled, resulting in no memory leaks.

The second option, the one that you are trying to do, is to use another object to handle all connection calls. This works fine as well, but you will need extra attention with memory. One simple thing you could do to solve your problem is to initialize the connection with an autorelease object.

//creates the handler object
MyHandlerClass *handler = [[MyHandlerClass alloc] init];
 
//creates the connection with handler as an autorelease object
[[NSURLConnection alloc] initWithRequest:request delegate:[handler autorelease]];

OR you could release your handler right after creating the connection (as it will be already retained by the connection)

 
//creates the handler object
MyHandlerClass *handler = [[MyHandlerClass alloc] init];
 
//creates the connection with handler
[[NSURLConnection alloc] initWithRequest:request delegate:handler];
 
//releases handler object
[handler release];

Both ways will leave the handler object ownership only with the connection class, which will release the handler object right after it finishes loading, fails, or is canceled, once again resulting in no memory leaks. And you will not have to worry about releasing the delegate (but you still have to release the connection) in connectionDidFinishLoading and connection:didFailWithError: methods.

permalink
, , , , , , ,
Apps

Minnesota Wild iPhone app

23janeiro

Mais um app desenvolvido pela I.ndigo que ganha destaque na mídia norte-americana.

Os apresentadores da rede ABC destacam entre as funcionalidades do aplicativo, o fato de você poder fazer um pedido à lanchonete do estádio sem precisar sair do seu lugar, os replays exclusivos e, a integração com as redes sociais.

Além das funcionalidades citadas acima, os torcedores também podem acompanhar os resultados do time, estatísticas da equipe e dos jogadores, localizar bares que irão transmitir o jogo e muito mais.

O aplicativo do Minnesota Wild, time da NHL, é mais uma implementação do nosso produto de automação de estádios e arenas, assim como fizemos para a Stanford University.

Ele já está disponível na app store e em breve também no Android Market.

Faça o download e nos diga o que achou.

permalink
, , , , , , , ,
English

Mobile Year in Review

20janeiro

2011 was a really intense year here at I.ndigo. More rewarding than launching 29 apps, was being able to witness the Brazilian market maturation and successfully accomplish worldwide recognized cases.

We would like to thank all partners, agencies, clients, employees and our families for believing in our potential and helping us build this result that we are pleased to share with you.

Bring on 2012!

permalink
, , , , , , , , , , ,
App Forward, Apps, Go Tech, Keep Watching, Mobile Trends & Mobile Business

Mobile Year in Review

20janeiro

Infografico I.ndigo 2011

O ano de 2011 foi realmente intenso aqui na I.ndigo. Mais gratificante do que o lançamento dos 29 apps, foi poder testemunhar o amadurecimento do mercado brasileiro e emplacar cases reconhecidos no mundo inteiro.

Agradecemos a todos os parceiros, agências, clientes, colaboradores e às nossas famílias por confiarem em nosso potencial e nos ajudarem a construir o resultado que temos o prazer de compartilhar com vocês.

Que venha 2012!

permalink
, , , , , , , , , , ,
English

iOS Facial Recognition

19janeiro

iOS Facial Recognition Test

Core Image was one of the many interesting topics discussed at iOS Tech Talk Tour that took place in São Paulo on january 9th. It is a framework that was already available at the MacOS and now can also be used by iOS developers.

It is important to notice that this framework is available only after iOS 5.0, resulting in a use limited to the application requirements. However, according to CNET the percentage of devices using iOS 5 in November, 2011 was already 40%, showing that apps developed to this version will shortly be available to the majority of users

Facial recognition is, by far, the most interesting of Core Image’s features, which will be detailed in this article. This new technique allow developers to think about new apps using this concept with a very low implementation cost.

We will show you how to implement the facial recognition straight from the device’s camera data stream. The source code is based on Apple’s SquareCam example project.


Camera Configuration

The first step is to configure the camera using the AVFoundation Framework, available since iOS 4 release in a way we can directly read the device stream.

This configuration is made in order to use the following objects:

  • AVCaptureSession – This object represents a session that coordinates the data flow from AV input devices to the output. In order to accomplish that, We add the input and output devices to this session object and start data flow using the startRunning messages (and stop it by using stopRunning).

  • AVCaptureDevice – It is a physical device abstraction which provides an input for a AVCapureSession object. There is an object available for every input device type, for instance: there is one video input for iPhone 3G, but there are two of them for iPhone 4.

  • AVCaptureDeviceInput – It is an AVCaptureInput subclass used to add and input device into a session (AVCaptureSession).

  • AVCaptureOutput – It is an abstract class used to find a session output (AVCaptureSession).
The image below, from Apple’s AV Foundation Programming Guide shows the interaction between the instances and their data flow:

The folowing chunk of code was taken from SquareCam project. It shows how to configure the camera:

- (void)setupAVCapture
{
    AVCaptureSession *session = [AVCaptureSession new];
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
        [session setSessionPreset:AVCaptureSessionPreset640x480];
    else
        [session setSessionPreset:AVCaptureSessionPresetPhoto];
 
    // Select a video device, make an input
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
 
    if ( [session canAddInput:deviceInput] )
        [session addInput:deviceInput];
 
    // Make a video data output
    videoDataOutput = [[AVCaptureVideoDataOutput alloc] init];
 
    // we want BGRA, both CoreGraphics and OpenGL work well with 'BGRA'
    NSDictionary *rgbOutputSettings = [NSDictionary dictionaryWithObject:
    [NSNumber numberWithInt:kCMPixelFormat_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey];
    [videoDataOutput setVideoSettings:rgbOutputSettings];
    [videoDataOutput setAlwaysDiscardsLateVideoFrames:YES]; // discard if the data output queue is blocked (as we process the still image)
 
    videoDataOutputQueue = dispatch_queue_create("VideoDataOutputQueue", NULL);
    [videoDataOutput setSampleBufferDelegate:self queue:videoDataOutputQueue];
 
    if ( [session canAddOutput:videoDataOutput] )
        [session addOutput:videoDataOutput];
 
    previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
    [previewLayer setBackgroundColor:[[UIColor blackColor] CGColor]];
    [previewLayer setVideoGravity:AVLayerVideoGravityResizeAspect];
    CALayer *rootLayer = [previewView layer];
    [rootLayer setMasksToBounds:YES];
    [previewLayer setFrame:[rootLayer bounds]];
    [rootLayer addSublayer:previewLayer];
    [session startRunning];
 
}

Identifying a face with a CIDetector

According to CIDetector’s Class Reference the CIDetector object (available since iOS 5 inside CoreImage.framework) uses image processing to find “features” inside an image.

So, the next step is to identify the face in our video data stream is to configure a CIDetector. We can create an instance of the object by instantiating:

NSDictionary *detectorOptions = [[NSDictionary alloc] initWithObjectsAndKeys:CIDetectorAccuracyLow, CIDetectorAccuracy, nil];
 
faceDetector = [[CIDetector detectorOfType:CIDetectorTypeFace context:nil options:detectorOptions] retain];

When we previously initialized the camera, we configured our controller to act as a the video output stream’s delegate (videoDataOutput) at the line:

[videoDataOutput setSampleBufferDelegate:self queue:videoDataOutputQueue];

We can now implement the following method to read the video data stream:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{}

Finally, with a CIDetector’s instance and the video data stream, We can identify our face.

// got an image
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CFDictionaryRef attachments = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate);
CIImage *ciImage = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer options:(NSDictionary *)attachments];
if (attachments)
    CFRelease(attachments);
NSDictionary *imageOptions = nil;
 
// '6' identifies device on vertical position
imageOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:6] forKey:CIDetectorImageOrientation];
NSArray *features = [faceDetector featuresInImage:ciImage options:imageOptions];
[ciImage release];

The array features have each element as an instance of a CIFaceFeature, which identify a new face found in the video and allow us to retrieve several information from it.


Image’s CIFaceFeature

A CIFaceFeature object properties describes the face found in a image. These properties are:

hasLeftEyePosition
hasRightEyePosition
hasMouthPosition
leftEyePosition
rightEyePosition
mouthPosition

Besides that, due to its CIFeature inheritance, it also has the following properties:

bounds – The rectangle that the feature was found inside
type – The feature type

By using this information several actions can be taken, such as adding new visual elements on top of the face which was found in the image.


CIDetectorAccuracyLow Vs CIDetectorAccuracyHigh

When we created our CIDetector, we provided the CIDetectorAccuracyLow parameter:

NSDictionary *detectorOptions = [[NSDictionary alloc] initWithObjectsAndKeys:CIDetectorAccuracyLow, CIDetectorAccuracy, nil];

The reason we did that is because we are trying to read from a video stream, and using this option results in a faster analysis for each video frame, however, with a higher chance of not detecting any face at all.

In general, the CIDetectorAccuracyHigh option is used to analyse a single picture, resulting in a slower processing time, but with a higher face detection rate.

As you can notice, iOS 5 made it extremely easy to integrate facial recognition, which allows us to think again in several features that would be impracticable to implement in a project before. That said, we still have to be aware of the project requirements, since not all the users updates their operating system to the latest iOS version.

This post is also available in portuguese here.

permalink
, , , , , ,
Go Tech

Reconhecimento de Faces no iOS

19janeiro

iOS Facial Recognition Test

Um dos interessantes tópicos abordados no evento iOS 5 Tech Talk Tour, que aconteceu em São Paulo no último dia 9 de janeiro, se refere ao Core Image, um framework que já era disponível no MacOS e agora pode ser usado pelos desenvolvedores de aplicativos para o iOS.

É importante ressaltar que este framework está disponível apenas a partir do iOS 5.0, o que torna o seu uso ainda limitado aos requisitos do aplicativo. Porém, de acordo com artigo do site CNET em novembro de 2011 a porcentagem de devices utilizando o iOS 5 já era de 40%, o que mostra que em pouco tempo os aplicativos lançados para essa versão já poderão ser baixados pela maior parte dos usuários.

Com certeza uma das características mais interessantes do Core Image para o iPhone é sua capacidade de reconhecimento de face, que vamos abordar neste artigo. Esta nova técnica faz com que possamos pensar em diversas aplicações utilizando este conceito, com baixo custo de implementação.

Vamos mostrar como fazer o reconhecimento de faces lendo diretamente do stream da câmera do iPhone. O código-fonte mostrado baseia-se no projeto SquareCam disponibilizado pela Apple como exemplo de uso de Reconhecimento de Faces, presente aqui.


Configuração da Camera

Primeiramente, iremos configurar a câmera utilizando o framework AVFoundation, disponível a partir do iOS 4, de modo que possamos ler diretamente o stream do dispositivo.

A configuração é feita para que tenhamos as seguintes instâncias:

  • AVCaptureSession – Este objeto representa uma sessão que coordena o fluxo de dados dos dispositivos de entrada AV para as saídas. Para isso, adicionamos os dispositivos de captura e saídas para esta sessão e iniciamos o fluxo de dados enviando uma mensagem startRunning e paramos com uma mensagem stopRunning.

  • AVCaptureDevice – É uma abstração de um dispositivo físico de captura que fornece uma entrada para um objeto AVCaptureSession. Há um objeto disponível para cada tipo de dispositivo de entrada. Por exemplo: no iPhone 3GS há uma entrada de vídeo, enquanto que no iPhone 4 há duas entradas.

  • AVCaptureDeviceInput – É uma subclasse de AVCaptureInput usada para adicionar um dispositivo de entrada em uma sessão (AVCaptureSession).

  • AVCaptureOutput – É uma classe abstrata usada para buscar uma saída da sessão (AVCaptureSession).
A imagem abaixo, retirada do AV Foundation Programming Guide da Apple mostra a interação entre estas instâncias e o fluxo de dados entre elas:

Vamos ver, em termos de código, como configurar a câmera. Utilizaremos o seguinte código, que foi reduzido do projeto SquareCam, para melhor visualização:

- (void)setupAVCapture
{
    AVCaptureSession *session = [AVCaptureSession new];
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
        [session setSessionPreset:AVCaptureSessionPreset640x480];
    else
        [session setSessionPreset:AVCaptureSessionPresetPhoto];
 
    // Select a video device, make an input
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
 
    if ( [session canAddInput:deviceInput] )
        [session addInput:deviceInput];
 
    // Make a video data output
    videoDataOutput = [[AVCaptureVideoDataOutput alloc] init];
 
    // we want BGRA, both CoreGraphics and OpenGL work well with 'BGRA'
    NSDictionary *rgbOutputSettings = [NSDictionary dictionaryWithObject:
    [NSNumber numberWithInt:kCMPixelFormat_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey];
    [videoDataOutput setVideoSettings:rgbOutputSettings];
    [videoDataOutput setAlwaysDiscardsLateVideoFrames:YES]; // discard if the data output queue is blocked (as we process the still image)
 
    videoDataOutputQueue = dispatch_queue_create("VideoDataOutputQueue", NULL);
    [videoDataOutput setSampleBufferDelegate:self queue:videoDataOutputQueue];
 
    if ( [session canAddOutput:videoDataOutput] )
        [session addOutput:videoDataOutput];
 
    previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
    [previewLayer setBackgroundColor:[[UIColor blackColor] CGColor]];
    [previewLayer setVideoGravity:AVLayerVideoGravityResizeAspect];
    CALayer *rootLayer = [previewView layer];
    [rootLayer setMasksToBounds:YES];
    [previewLayer setFrame:[rootLayer bounds]];
    [rootLayer addSublayer:previewLayer];
    [session startRunning];
 
}

Identificando um Rosto com um CIDetector

De acordo com o CIDetector Class Reference da Apple, um objeto CIDetector, disponível a partir do iOS 5 no framework CoreImage.framework, usa processamento de imagem para encontrar “features” em uma imagem.

Assim, o próximo passo para identificar o rosto no nosso stream de vídeo é configurar um CIDetector. Após adicionamos este framework no projeto, criamos uma instância dele para utilizarmos da seguinte forma:

NSDictionary *detectorOptions = [[NSDictionary alloc] initWithObjectsAndKeys:CIDetectorAccuracyLow, CIDetectorAccuracy, nil];
 
faceDetector = [[CIDetector detectorOfType:CIDetectorTypeFace context:nil options:detectorOptions] retain];

Em nossa inicialização da câmera feita anteriormente configuramos nosso controller para atuar como delegate do stream de vídeo (videoDataOutput) com a seguinte linha:

[videoDataOutput setSampleBufferDelegate:self queue:videoDataOutputQueue];

Desta forma, podemos implementar o seguinte método para ler o stream do vídeo:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{}

Por fim, com uma instância de um CIDetector e um método que lê o stream da câmera, podemos identificar um rosto utilizando o seguinte:

// got an image
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CFDictionaryRef attachments = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate);
CIImage *ciImage = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer options:(NSDictionary *)attachments];
if (attachments)
    CFRelease(attachments);
NSDictionary *imageOptions = nil;
 
// '6' identifies device on vertical position
imageOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:6] forKey:CIDetectorImageOrientation];
NSArray *features = [faceDetector featuresInImage:ciImage options:imageOptions];
[ciImage release];

No código acima, temos o array features onde cada elemento é uma instância de um CIFaceFeature, que identifica uma face encontrada no vídeo e permite encontrar diversas informações sobre ela.


CIFaceFeature de uma Imagem

Um objeto CIFaceFeature descreve uma face encontrada em uma imagem. Suas propriedades informam as posições dos olhos e da boca da face. Estas propriedades são as seguintes:

hasLeftEyePosition – Informa se a posição do olho esquerdo esta disponível
hasRightEyePosition – Informa se a posição do olho direito esta disponível
hasMouthPosition – Informa se a posição da boca esta disponível
leftEyePosition – Informa a posição do olho esquerdo
rightEyePosition – Informa a posição do olho direito
mouthPosition – Informa a posição da boca

Além disso, por herdar de um CIFeature, também possui as seguintes propriedades:

bounds – Um retângulo que contém a feature encontrada
type – O tipo de feature encontrado

A partir destas informações diversas ações podem ser tomadas, como inserir elementos visuais sobre a face encontrada.


Modo CIDetectorAccuracyLow Vs CIDetectorAccuracyHigh

Quando criamos nosso CIDetector, um parâmetro de configuração utilizado foi CIDetectorAccuracyLow, como pode ser visto a seguir:

NSDictionary *detectorOptions = [[NSDictionary alloc] initWithObjectsAndKeys:CIDetectorAccuracyLow, CIDetectorAccuracy, nil];

O motivo desse uso foi pelo fato de estarmos fazendo a detecção diretamente do stream de vídeo e, por isso, utilizar esta opção faz com a análise de cada frame seja mais rápida, porém tendo uma chance maior de não detectar uma face.

De modo geral, a opção CIDetectorAccuracyHigh é utilizada somente quando vamos analisar uma única imagem, o que permite que possamos ter um processamento um pouco mais lento, encontrando com mais facilidade as faces.

Como podemos ver, a partir do iOS 5 ficou bem mais fácil utilizar detecção de faces em aplicativos, o que nos permite pensar em diversas soluções que anteriormente poderiam ser consideradas inviáveis para um projeto. Porém, como dito, devemos ainda nos alertar quanto aos requisitos do projeto, uma vez que nem todos os usuários já possuem esta versão de iOS.

Este post também está disponível em inglês aqui.

permalink
, , , , , ,
Go Tech, Mobile Trends & Mobile Business

iOS 5 Tech Talk World Tour – Brazil 2012

10janeiro

iOS 5 Tech Tour World Tour Brazil 2012

Aconteceu ontem em São Paulo o grande evento oficial da Apple que reuniu desenvolvedores de todo o país e, claro que a I.ndigo esteve presente.
O “iOS 5 Tech Talk World Tour” contou com palestras e consultorias de funcionários da Apple que compartilharam suas experiências com a comunidade de desenvolvedores, principalmente sobre as últimas novidades do iOS 5, o sistema operacional lançado há alguns meses pela empresa.
Confira a seguir um pouco das nossas percepções sobre o evento:
Lab
Sem sombra de dúvidas, o Lab foi para nós o ponto alto do evento. Tivemos o privilégio de interagir com a equipe de especialistas da Apple, que analisaram sob a ótica de desempenho, usabilidade, estética e experiência do usuário os últimos aplicativos lançados pela I.ndigo, como o Hy.vee, Minnesota Wild, Pilão Desperta e o da universidade de Stanford.
Foi muito gratificante receber, do diretor da Apple responsável pelo evento, John Geleynse, feedbacks e elogios sobre a identidade visual e experiência do usuário do iCardinal, além dos elogios e dicas sobre o desempenho dos nossos aplicativos como o Hy.vee e o Royal Wedding.
Descobrimos também, conversando com o responsável pelo time de aprovação de aplicativos na App Store, detalhes importantes sobre o processo de revisão dos aplicativos o que nos dá ainda mais tranquilidade e liberdade de criação de novos modelos e arquiteturas, o que tende a deixar os nossos projetos mais flexíveis e até mais baratos.
Palestras
Foram realizadas 18 palestras ao longo do dia, nos quais foram tratados assuntos específicos sobre os novos recursos da última versão do sistema operacional da Apple o iOS 5. Novidades que vão desde a criação de interfaces gráficas, melhorias nos serviços de localização até o grande serviço disponibilizado recentemente pela Apple: o iCloud.
Seguindo a mesma linha do WWDC, os profissionais da Apple expuseram a tecnologia de forma bastante didática, com o objetivo de ampliar a visão dos desenvolvedores para o máximo aproveitamento do iOS 5, sem entrar muito nos detalhes de implementação e API.
Só nos resta agradecer e parabenizar a Apple pelo modelo do evento e sua infraestrutura, não temos do que reclamar de um evento (gratuito) que nos aproximou de especialistas estratégicos da Apple e que marca o começo de um relacionamento mais estreito com as empresas brasileiras.
Não perca nossos próximos posts que vão tratar alguns dos assuntos abordados nas palestras.
permalink
, , , , , , , , , , ,
Apps, Keep Watching

O Melhor Aplicativo de 2012

08dezembro

Hello Little Printer, available 2012 from BERG on Vimeo.

Essa semana na I.ndigo a gente já escolheu o melhor aplicativo de 2012, pelo menos até agora.

Mais que um aplicativo, o Little Printer é um app+gadget que vai ser lançado só em 2012. É uma micro impressora que se conecta à web e, configurada através de um aplicativo, imprime todo o dia uma variedade de utilidades e inutilidades que vão melhorar o seu dia, vale conferir no vídeo.

O aplicativo impressiona não só pela criatividade e simplicidade, mas também por ser mais um belo exemplo da capacidade do mobile se integrar com (e potencializar) outros meios de comunicação.

Alguns dos apps já integrados com o app do Little Printer são, Nike Plus, The Guardian,  Google Calendar, Foursquare, e já conseguimos até imaginar outros que virão. Por aqui as apostas já começaram e, os apps que vendem tickets estão na frente, e você o compraria o Little Printer? Para o que você acha que iria utilizá-lo?

permalink
, , , , , , ,