<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Indigo &#187; iphone</title>
	<atom:link href="http://i.ndigo.com.br/tag/iphone/feed/" rel="self" type="application/rss+xml" />
	<link>http://i.ndigo.com.br</link>
	<description>I.ndigo Website</description>
	<lastBuildDate>Fri, 03 Feb 2012 19:01:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1-alpha</generator>
		<item>
		<title>Link Roundup &#8211; Janeiro de 2012</title>
		<link>http://i.ndigo.com.br/2012/02/link-roundup-janeiro-de-2012/</link>
		<comments>http://i.ndigo.com.br/2012/02/link-roundup-janeiro-de-2012/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 22:19:58 +0000</pubDate>
		<dc:creator>felipe.sabino</dc:creator>
				<category><![CDATA[Go Tech]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[ces]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[hyvee]]></category>
		<category><![CDATA[indigo]]></category>
		<category><![CDATA[infográfico]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[m-commerce]]></category>
		<category><![CDATA[minesota wild]]></category>
		<category><![CDATA[mobile comerce]]></category>
		<category><![CDATA[NFC]]></category>
		<category><![CDATA[nfl]]></category>
		<category><![CDATA[Sebastian Thrun]]></category>
		<category><![CDATA[Sony]]></category>
		<category><![CDATA[stanford]]></category>
		<category><![CDATA[tag]]></category>
		<category><![CDATA[tendência]]></category>
		<category><![CDATA[user expirience]]></category>
		<category><![CDATA[ux]]></category>

		<guid isPermaLink="false">http://i.ndigo.com.br/?p=757</guid>
		<description><![CDATA[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, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://i.ndigo.com.br/wp-content/uploads/2012/02/photo_post23412.jpg"><img class="alignnone size-full wp-image-777" title="photo_post2341" src="http://i.ndigo.com.br/wp-content/uploads/2012/02/photo_post23412.jpg" alt="" width="660" height="413" /></a></p>
<p>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.</p>
<h1>I.ndigo</h1>
<p><strong></strong>Para comemorar o ano que tivemos e dar o kick-off oficial de 2012, produzimos esse <a href="http://i.ndigo.com.br/2012/01/mobile-year-in-review/" target="_blank">infográfico (lindo!) com os resultados alcançados no último ano</a>.</p>
<p>Foram 29 apps produzidos em 1 ano, alguns deles só lançados neste mês, como o do <a href="http://i.ndigo.com.br/2012/01/minnesota-wild-iphone-app/" target="_blank">Minnesota Wild</a> que facilitou a vida dos fans do time que disputa a NHL e o <a href="http://i.ndigo.com.br/2012/01/hy-vee-mobile-app/" target="_blank">Hy-Vee</a>, já imaginou entrar em um supermercado e ter na palma da mão a localização exata dos produtos que procura?</p>
<h1>Design &amp; User Experience</h1>
<p><strong></strong>Quando o assunto é experiência do usuário, a <a href="http://i.ndigo.com.br/2012/01/uma-semana-um-app-e-um-estudo-de-caso/" target="_blank">Nordstrom Innovation Lab deu uma aula com esse estudo de caso</a> e, durante o mês nos deparamos com alguns apps e resources extremamente interessantes para os designers, como o <a href="http://vimeo.com/35693267" target="_blank">Clear for iPhone</a>, essa <a href="http://iosicongallery.com/" target="_blank">galeria de ícones para iOS</a> e o <a href="http://developer.android.com/design/index.html" target="_blank">design guideline lançado pelo Google</a>.</p>
<h1>Keep Watching</h1>
<p>Entre os apps e tecnologias que mais chamaram nossa atenção, as <a href="http://i.ndigo.com.br/2012/01/xperia-smart-tags/" target="_blank">Smart Tags apresentadas pela Sony na CES ganharam destaque ao apresentar uma maneira inovadora e criativa de lidar com o NFC</a>, já a principal decepção ficou por conta do <a href="http://news.slashdot.org/story/12/01/23/2016202/professor-resigns-from-stanford-to-launch-online-education-project" target="_blank">adiamento/cancelamento dos cursos online de Stanford, provavelmente causados pela renúncia do Professor Sebastian Thrun</a>.</p>
<h1>Mobile Trends &amp; Mobile Business</h1>
<p>Analisando as tendências e indicadores de mercado o, já previsível, <a href="http://i.ndigo.com.br/2012/01/m-commerce-cresceu-em-2011/" target="_blank">crescimento do m-commerce em 2011 se concretizou e também ganhou destaque no nosso blog</a>.</p>
<h1>iOS Development</h1>
<p>As novidades da área técnica também não ficaram de lado, o principal destaque do mês foi a <a href="http://i.ndigo.com.br/2012/01/ios-5-tech-talk-world-tour-brazil-2012/" target="_blank">nossa participação no iOS 5 Tech Talk Tour 2012</a> que já nos rendeu ótimos contatos e muitos frutos, inclusive para o blog, com o nosso post de <a href="http://i.ndigo.com.br/2012/01/reconhecimento-de-faces-no-ios/" target="_blank">reconhecimento facial</a> e aproveitando o gancho, o artigo sobre <a href="http://speirs.org/blog/2012/1/2/misconceptions-about-ios-multitasking.html" target="_blank">falsas impressões do multitasking do IOS</a> vale a pena ser lido também. Quer saber mais sobre o Tech Talk? <a href="http://oleb.net/blog/2012/01/new-videos-at-developer-apple-com/" target="_blank">A Apple disponibilizou alguns vídeos sobre tudo o que rolou na Tour</a>.</p>
<p>Outra ótima referência, quando a dúvida é entre a escolha ente bancos dados relacional ou não relacional, é <a href="http://martinfowler.com/bliki/PolyglotPersistence.html" target="_blank">este artigo do Matin Fowler</a></p>
<h1>Web Development</h1>
<p>Nem só de mobile viverá o homem. Como resultado das nossas pesquisas em HTML5 e CSS3 encontramos essa demonstração de <a href="http://acko.net/blog/making-love-to-webkit/" target="_blank">como simular o 3D</a>, que nos deixou de queixos caídos. E a implementação do <a href="http://sparanoid.com/lab/path-menu/" target="_blank">menu do Path em CSS</a> 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 <a href="http://itunes.apple.com/us/app/path/id403639508?mt=8" target="_blank">aqui</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://i.ndigo.com.br/2012/02/link-roundup-janeiro-de-2012/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hy-Vee Mobile App</title>
		<link>http://i.ndigo.com.br/2012/01/hy-vee-mobile-app/</link>
		<comments>http://i.ndigo.com.br/2012/01/hy-vee-mobile-app/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 16:38:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Apps]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[aplicativo]]></category>
		<category><![CDATA[hy-vee]]></category>
		<category><![CDATA[I.ndigo]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[m-commerce]]></category>

		<guid isPermaLink="false">http://i.ndigo.com.br/?p=694</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p><iframe src="http://player.vimeo.com/video/35603301?title=0&amp;byline=0" width="660" height="498" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p>
<p>Já imaginou entrar em um supermercado e ter na palma da mão a localização exata dos produtos que procura?</p>
<p>Esta é apenas uma das dezenas inovações que colocamos neste aplicativo mobile para a rede de supermercados norte-americana <a href="http://www.hy-vee.com/">Hy-Vee</a>.</p>
<p>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.</p>
<p>O aplicativo, que já estava disponível gratuitamente na <a href="http://itunes.apple.com/br/app/hy-vee/id479759212?mt=8">App Store</a> agora também na versão <a href="https://market.android.com/details?id=com.hyvee.android&#038;hl=pt_BR">Android</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://i.ndigo.com.br/2012/01/hy-vee-mobile-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Releasing NSURLConnection and its delegate</title>
		<link>http://i.ndigo.com.br/2012/01/releasing-nsurlconnection-and-its-delegate/</link>
		<comments>http://i.ndigo.com.br/2012/01/releasing-nsurlconnection-and-its-delegate/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 13:37:37 +0000</pubDate>
		<dc:creator>felipe.sabino</dc:creator>
				<category><![CDATA[Stack Overflow]]></category>
		<category><![CDATA[arc]]></category>
		<category><![CDATA[delegate]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[memory leak]]></category>
		<category><![CDATA[nsurlconnection]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[retain]]></category>

		<guid isPermaLink="false">http://i.ndigo.com.br/?p=715</guid>
		<description><![CDATA[When not using ARC, you will have to pay extra attention to NSURLConnection&#8217;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: &#160; 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 [...]]]></description>
			<content:encoded><![CDATA[<p>When not using <a href="http://clang.llvm.org/docs/AutomaticReferenceCounting.html" target="_blank">ARC</a>, you will have to pay extra attention to NSURLConnection&#8217;s delegate object as there is a special consideration for it: it is always retained.</p>
<p><a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html#//apple_ref/doc/uid/20001697-BAJDDIDG" style="word-wrap: break-word;">http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html#//apple_ref/doc/uid/20001697-BAJDDIDG</a></p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">initWithRequest:delegate:
&nbsp;
Special Considerations: The connection retains delegate. It releases delegate when the connection finishes loading, fails, or is canceled.</pre></div></div>

<p>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.</p>
<p>The first, and most commonly used, is to use the same class that initialize the NSURLConnection as the delegate.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #49f;">&#91;</span><span style="color: #49f;">&#91;</span><span style="color: #8844FF;">NSURLConnection</span> alloc<span style="color: #49f;">&#93;</span> initWithRequest<span style="color: #49f;">:</span>request self<span style="color: #49f;">&#93;</span>;</pre></div></div>

<p>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.</p>
<p>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.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">//creates the handler object</span>
MyHandlerClass <span style="color: #49f;">*</span>handler <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span><span style="color: #49f;">&#91;</span>MyHandlerClass alloc<span style="color: #49f;">&#93;</span> init<span style="color: #49f;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">//creates the connection with handler as an autorelease object</span>
<span style="color: #49f;">&#91;</span><span style="color: #49f;">&#91;</span><span style="color: #8844FF;">NSURLConnection</span> alloc<span style="color: #49f;">&#93;</span> initWithRequest<span style="color: #49f;">:</span>request delegate<span style="color: #49f;">:</span><span style="color: #49f;">&#91;</span>handler autorelease<span style="color: #49f;">&#93;</span><span style="color: #49f;">&#93;</span>;</pre></div></div>

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

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">&nbsp;
<span style="color: #11740a; font-style: italic;">//creates the handler object</span>
MyHandlerClass <span style="color: #49f;">*</span>handler <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span><span style="color: #49f;">&#91;</span>MyHandlerClass alloc<span style="color: #49f;">&#93;</span> init<span style="color: #49f;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">//creates the connection with handler</span>
<span style="color: #49f;">&#91;</span><span style="color: #49f;">&#91;</span><span style="color: #8844FF;">NSURLConnection</span> alloc<span style="color: #49f;">&#93;</span> initWithRequest<span style="color: #49f;">:</span>request delegate<span style="color: #49f;">:</span>handler<span style="color: #49f;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">//releases handler object</span>
<span style="color: #49f;">&#91;</span>handler release<span style="color: #49f;">&#93;</span>;</pre></div></div>

<p>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 (<strong>but you still have to release the connection</strong>) in <em>connectionDidFinishLoading</em> and <em>connection:didFailWithError:</em> methods.</p>
]]></content:encoded>
			<wfw:commentRss>http://i.ndigo.com.br/2012/01/releasing-nsurlconnection-and-its-delegate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Minnesota Wild iPhone app</title>
		<link>http://i.ndigo.com.br/2012/01/minnesota-wild-iphone-app/</link>
		<comments>http://i.ndigo.com.br/2012/01/minnesota-wild-iphone-app/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 21:32:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Apps]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[aplicativo]]></category>
		<category><![CDATA[app]]></category>
		<category><![CDATA[I.ndigo]]></category>
		<category><![CDATA[indigo]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[minnesota wild]]></category>
		<category><![CDATA[NHL]]></category>

		<guid isPermaLink="false">http://i.ndigo.com.br/?p=678</guid>
		<description><![CDATA[Aplicativo desenvolvido pela I.ndigo para o Minnesota Wild da NHL ganha destaque na mídia norte-americana ]]></description>
			<content:encoded><![CDATA[<p><iframe src="http://player.vimeo.com/video/35529014?title=0&amp;byline=0&amp;portrait=0" width="660" height="371" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p>
<p>Mais um app desenvolvido pela I.ndigo que ganha destaque na mídia norte-americana.</p>
<p>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.</p>
<p>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. </p>
<p>O aplicativo do <a href="http://itunes.apple.com/br/app/mn-wild-nhl/id489278925?mt=8">Minnesota Wild</a>, time da NHL, é mais uma implementação do nosso produto de automação de estádios e arenas, assim como fizemos para a <a href="http://itunes.apple.com/us/app/icardinal/id460288504?mt=8">Stanford University</a>. </p>
<p>Ele já está disponível na app store e em breve também no Android Market.</p>
<p>Faça o <a href="http://itunes.apple.com/br/app/mn-wild-nhl/id489278925?mt=8">download</a> e nos diga o que achou.</p>
]]></content:encoded>
			<wfw:commentRss>http://i.ndigo.com.br/2012/01/minnesota-wild-iphone-app/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mobile Year in Review</title>
		<link>http://i.ndigo.com.br/2012/01/mobile-year-in-review-2/</link>
		<comments>http://i.ndigo.com.br/2012/01/mobile-year-in-review-2/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 20:49:41 +0000</pubDate>
		<dc:creator>felipe.sabino</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[app]]></category>
		<category><![CDATA[application]]></category>
		<category><![CDATA[Brazil]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[I.ndigo]]></category>
		<category><![CDATA[indigo]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[mobile device]]></category>
		<category><![CDATA[mobile internet]]></category>
		<category><![CDATA[São Paulo]]></category>

		<guid isPermaLink="false">http://i.ndigo.com.br/?p=667</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://i.ndigo.com.br/wp-content/uploads/2012/01/infografico-aplicativos-indigo-eng.png"><img src="http://i.ndigo.com.br/wp-content/uploads/2012/01/infografico-aplicativos-indigo-eng-708x1024.png" alt="" title="infografico-aplicativos-indigo-eng" width="660" height="954" class="aligncenter size-large wp-image-673" /></a></p>
<p>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.</p>
<p>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.</p>
<p>Bring on 2012!</p>
]]></content:encoded>
			<wfw:commentRss>http://i.ndigo.com.br/2012/01/mobile-year-in-review-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mobile Year in Review</title>
		<link>http://i.ndigo.com.br/2012/01/mobile-year-in-review/</link>
		<comments>http://i.ndigo.com.br/2012/01/mobile-year-in-review/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 15:02:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[App Forward]]></category>
		<category><![CDATA[Apps]]></category>
		<category><![CDATA[Go Tech]]></category>
		<category><![CDATA[Keep Watching]]></category>
		<category><![CDATA[Mobile Trends & Mobile Business]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[aplicativo]]></category>
		<category><![CDATA[app]]></category>
		<category><![CDATA[brasil]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[dispositivos móveis]]></category>
		<category><![CDATA[I.ndigo]]></category>
		<category><![CDATA[indigo]]></category>
		<category><![CDATA[internet móvel]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[São Paulo]]></category>

		<guid isPermaLink="false">http://i.ndigo.com.br/?p=559</guid>
		<description><![CDATA[O ano de 2011 foi realmente intenso aqui na I.ndigo. 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. ]]></description>
			<content:encoded><![CDATA[<p><a href="http://i.ndigo.com.br/wp-content/uploads/2012/01/infografico-aplicativos-indigo.png"><img class="aligncenter size-large wp-image-657" title="infografico-aplicativos-indigo" src="http://i.ndigo.com.br/wp-content/uploads/2012/01/infografico-aplicativos-indigo-708x1024.png" alt="Infografico I.ndigo 2011" width="660" height="954" /></a></p>
<p>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.</p>
<p>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.</p>
<p>Que venha 2012!</p>
]]></content:encoded>
			<wfw:commentRss>http://i.ndigo.com.br/2012/01/mobile-year-in-review/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>iOS Facial Recognition</title>
		<link>http://i.ndigo.com.br/2012/01/ios-facial-recognition/</link>
		<comments>http://i.ndigo.com.br/2012/01/ios-facial-recognition/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 23:54:20 +0000</pubDate>
		<dc:creator>Raphael Petegrosso</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[core image]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[facial recognition]]></category>
		<category><![CDATA[iOS 5 Tech Talk World Tour]]></category>
		<category><![CDATA[ios5]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://i.ndigo.com.br/?p=636</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://i.ndigo.com.br/wp-content/uploads/2012/01/big-bang.jpeg" alt="iOS Facial Recognition Test" title="iOS Facial Recognition Test" width="660" height="371" class="aligncenter size-full wp-image-643" /></p>
<p>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.</p>
<p>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 <a href="http://news.cnet.com/8301-13579_3-57321295-37/ios-5-on-almost-40-percent-of-iphones/" target="_blank">CNET</a> 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</p>
<p>Facial recognition is, by far, the most interesting of Core Image&#8217;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.</p>
<p>We will show you how to implement the facial recognition straight from the device&#8217;s camera data stream. The source code is based on Apple&#8217;s SquareCam <a href="http://developer.apple.com/library/ios/#samplecode/SquareCam/Introduction/Intro.html" target="_blank">example project</a>.</p>
<div><span><br />
</span></div>
<div><strong>Camera Configuration</strong></div>
<div>
<p><span id="internal-source-marker_0.11296257469803095"> </span></p>
<p>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.</p>
<p>This configuration is made in order to use the following objects:</p>
<ul>
<li><strong><a href="http://developer.apple.com/library/IOs/#documentation/AVFoundation/Reference/AVCaptureSession_Class/Reference/Reference.html" target="_blank">AVCaptureSession</a></strong> &#8211; 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).</li>
</ul>
</div>
<div>
<p><span id="internal-source-marker_0.11296257469803095"> </span></p>
<ul>
<li><strong><a href="http://developer.apple.com/library/mac/#documentation/AVFoundation/Reference/AVCaptureDevice_Class/Reference/Reference.html" target="_blank">AVCaptureDevice</a></strong> &#8211; 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.</li>
</ul>
</div>
<div>
<p><span id="internal-source-marker_0.11296257469803095"> </span></p>
<ul>
<li><strong><a href="http://developer.apple.com/library/IOs/#documentation/AVFoundation/Reference/AVCaptureDeviceInput_Class/Reference/Reference.html" target="_blank">AVCaptureDeviceInput</a></strong> &#8211; It is an AVCaptureInput subclass used to add and input device into a session (AVCaptureSession).</li>
</ul>
</div>
<div>
<p><span id="internal-source-marker_0.11296257469803095"> </span></p>
<ul>
<li><strong><a href="http://developer.apple.com/library/mac/#documentation/AVFoundation/Reference/AVCaptureOutput_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40009543" target="_blank">AVCaptureOutput</a></strong> &#8211; It is an abstract class used to find a session output (AVCaptureSession).</li>
</ul>
</div>
<div><span id="internal-source-marker_0.11296257469803095">The image below, from Apple&#8217;s <a href="http://developer.apple.com/library/IOs/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/04_MediaCapture.html#//apple_ref/doc/uid/TP40010188-CH5-SW2" target="_blank">AV Foundation Programming Guide</a> shows the interaction between the instances and their data flow:</span></div>
<div><span><br />
</span></div>
<div style="text-align: center;"><img class="aligncenter size-full wp-image-584" src="http://i.ndigo.com.br/wp-content/uploads/2012/01/captureDetail.jpg" alt="" width="553" height="330" /></div>
<div>
<p><span> </span></p>
<div><span id="internal-source-marker_0.11296257469803095">The folowing chunk of code was taken from SquareCam project. It shows how to configure the camera:</span></div>
<div><span><br />
</span></div>
</div>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #49f;">-</span> <span style="color: #49f;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #49f;">&#41;</span>setupAVCapture
<span style="color: #49f;">&#123;</span>
    AVCaptureSession <span style="color: #49f;">*</span>session <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span>AVCaptureSession new<span style="color: #49f;">&#93;</span>;
    <span style="color: #a61390;">if</span> <span style="color: #49f;">&#40;</span><span style="color: #49f;">&#91;</span><span style="color: #49f;">&#91;</span>UIDevice currentDevice<span style="color: #49f;">&#93;</span> userInterfaceIdiom<span style="color: #49f;">&#93;</span> <span style="color: #49f;">==</span> UIUserInterfaceIdiomPhone<span style="color: #49f;">&#41;</span>
        <span style="color: #49f;">&#91;</span>session setSessionPreset<span style="color: #49f;">:</span>AVCaptureSessionPreset640x480<span style="color: #49f;">&#93;</span>;
    <span style="color: #a61390;">else</span>
        <span style="color: #49f;">&#91;</span>session setSessionPreset<span style="color: #49f;">:</span>AVCaptureSessionPresetPhoto<span style="color: #49f;">&#93;</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">// Select a video device, make an input</span>
    AVCaptureDevice <span style="color: #49f;">*</span>device <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span>AVCaptureDevice defaultDeviceWithMediaType<span style="color: #49f;">:</span>AVMediaTypeVideo<span style="color: #49f;">&#93;</span>;
    AVCaptureDeviceInput <span style="color: #49f;">*</span>deviceInput <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span>AVCaptureDeviceInput deviceInputWithDevice<span style="color: #49f;">:</span>device error<span style="color: #49f;">:</span><span style="color: #a61390;">nil</span><span style="color: #49f;">&#93;</span>;
&nbsp;
    <span style="color: #a61390;">if</span> <span style="color: #49f;">&#40;</span> <span style="color: #49f;">&#91;</span>session canAddInput<span style="color: #49f;">:</span>deviceInput<span style="color: #49f;">&#93;</span> <span style="color: #49f;">&#41;</span>
        <span style="color: #49f;">&#91;</span>session addInput<span style="color: #49f;">:</span>deviceInput<span style="color: #49f;">&#93;</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">// Make a video data output</span>
    videoDataOutput <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span><span style="color: #49f;">&#91;</span>AVCaptureVideoDataOutput alloc<span style="color: #49f;">&#93;</span> init<span style="color: #49f;">&#93;</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">// we want BGRA, both CoreGraphics and OpenGL work well with 'BGRA'</span>
    <span style="color: #8844FF;">NSDictionary</span> <span style="color: #49f;">*</span>rgbOutputSettings <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span><span style="color: #8844FF;">NSDictionary</span> dictionaryWithObject<span style="color: #49f;">:</span>
    <span style="color: #49f;">&#91;</span><span style="color: #8844FF;">NSNumber</span> numberWithInt<span style="color: #49f;">:</span>kCMPixelFormat_32BGRA<span style="color: #49f;">&#93;</span> forKey<span style="color: #49f;">:</span><span style="color: #49f;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #49f;">&#41;</span>kCVPixelBufferPixelFormatTypeKey<span style="color: #49f;">&#93;</span>;
    <span style="color: #49f;">&#91;</span>videoDataOutput setVideoSettings<span style="color: #49f;">:</span>rgbOutputSettings<span style="color: #49f;">&#93;</span>;
    <span style="color: #49f;">&#91;</span>videoDataOutput setAlwaysDiscardsLateVideoFrames<span style="color: #49f;">:</span><span style="color: #a61390;">YES</span><span style="color: #49f;">&#93;</span>; <span style="color: #11740a; font-style: italic;">// discard if the data output queue is blocked (as we process the still image)</span>
&nbsp;
    videoDataOutputQueue <span style="color: #49f;">=</span> dispatch_queue_create<span style="color: #49f;">&#40;</span><span style="color: #bf1d1a;">&quot;VideoDataOutputQueue&quot;</span>, <span style="color: #a61390;">NULL</span><span style="color: #49f;">&#41;</span>;
    <span style="color: #49f;">&#91;</span>videoDataOutput setSampleBufferDelegate<span style="color: #49f;">:</span>self queue<span style="color: #49f;">:</span>videoDataOutputQueue<span style="color: #49f;">&#93;</span>;
&nbsp;
    <span style="color: #a61390;">if</span> <span style="color: #49f;">&#40;</span> <span style="color: #49f;">&#91;</span>session canAddOutput<span style="color: #49f;">:</span>videoDataOutput<span style="color: #49f;">&#93;</span> <span style="color: #49f;">&#41;</span>
        <span style="color: #49f;">&#91;</span>session addOutput<span style="color: #49f;">:</span>videoDataOutput<span style="color: #49f;">&#93;</span>;
&nbsp;
    previewLayer <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span><span style="color: #49f;">&#91;</span>AVCaptureVideoPreviewLayer alloc<span style="color: #49f;">&#93;</span> initWithSession<span style="color: #49f;">:</span>session<span style="color: #49f;">&#93;</span>;
    <span style="color: #49f;">&#91;</span>previewLayer setBackgroundColor<span style="color: #49f;">:</span><span style="color: #49f;">&#91;</span><span style="color: #49f;">&#91;</span>UIColor blackColor<span style="color: #49f;">&#93;</span> CGColor<span style="color: #49f;">&#93;</span><span style="color: #49f;">&#93;</span>;
    <span style="color: #49f;">&#91;</span>previewLayer setVideoGravity<span style="color: #49f;">:</span>AVLayerVideoGravityResizeAspect<span style="color: #49f;">&#93;</span>;
    CALayer <span style="color: #49f;">*</span>rootLayer <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span>previewView layer<span style="color: #49f;">&#93;</span>;
    <span style="color: #49f;">&#91;</span>rootLayer setMasksToBounds<span style="color: #49f;">:</span><span style="color: #a61390;">YES</span><span style="color: #49f;">&#93;</span>;
    <span style="color: #49f;">&#91;</span>previewLayer setFrame<span style="color: #49f;">:</span><span style="color: #49f;">&#91;</span>rootLayer bounds<span style="color: #49f;">&#93;</span><span style="color: #49f;">&#93;</span>;
    <span style="color: #49f;">&#91;</span>rootLayer addSublayer<span style="color: #49f;">:</span>previewLayer<span style="color: #49f;">&#93;</span>;
    <span style="color: #49f;">&#91;</span>session startRunning<span style="color: #49f;">&#93;</span>;
&nbsp;
<span style="color: #49f;">&#125;</span></pre></div></div>

<div><span><br />
</span></div>
<p><strong>Identifying a face with a CIDetector</strong></p>
<p>According to <a href="http://developer.apple.com/library/ios/#documentation/CoreImage/Reference/CIDetector_Ref/Reference/Reference.html" target="_blank">CIDetector&#8217;s Class Reference</a> the CIDetector object (available since iOS 5 inside CoreImage.framework) uses image processing to find &#8220;features&#8221; inside an image.</p>
<p>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:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #8844FF;">NSDictionary</span> <span style="color: #49f;">*</span>detectorOptions <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span><span style="color: #49f;">&#91;</span><span style="color: #8844FF;">NSDictionary</span> alloc<span style="color: #49f;">&#93;</span> initWithObjectsAndKeys<span style="color: #49f;">:</span>CIDetectorAccuracyLow, CIDetectorAccuracy, <span style="color: #a61390;">nil</span><span style="color: #49f;">&#93;</span>;
&nbsp;
faceDetector <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span><span style="color: #49f;">&#91;</span>CIDetector detectorOfType<span style="color: #49f;">:</span>CIDetectorTypeFace context<span style="color: #49f;">:</span><span style="color: #a61390;">nil</span> options<span style="color: #49f;">:</span>detectorOptions<span style="color: #49f;">&#93;</span> retain<span style="color: #49f;">&#93;</span>;</pre></div></div>

<p>When we previously initialized the camera, we configured our controller to act as a the video output stream&#8217;s delegate (<em>videoDataOutput</em>) at the line:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #49f;">&#91;</span>videoDataOutput setSampleBufferDelegate<span style="color: #49f;">:</span>self queue<span style="color: #49f;">:</span>videoDataOutputQueue<span style="color: #49f;">&#93;</span>;</pre></div></div>

<p>We can now implement the following method to read the video data stream:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #49f;">-</span> <span style="color: #49f;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #49f;">&#41;</span>captureOutput<span style="color: #49f;">:</span><span style="color: #49f;">&#40;</span>AVCaptureOutput <span style="color: #49f;">*</span><span style="color: #49f;">&#41;</span>captureOutput didOutputSampleBuffer<span style="color: #49f;">:</span><span style="color: #49f;">&#40;</span>CMSampleBufferRef<span style="color: #49f;">&#41;</span>sampleBuffer fromConnection<span style="color: #49f;">:</span><span style="color: #49f;">&#40;</span>AVCaptureConnection <span style="color: #49f;">*</span><span style="color: #49f;">&#41;</span>connection
<span style="color: #49f;">&#123;</span>
…
<span style="color: #49f;">&#125;</span></pre></div></div>

<p>Finally, with a CIDetector&#8217;s instance and the video data stream, We can identify our face.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// got an image</span>
CVPixelBufferRef pixelBuffer <span style="color: #49f;">=</span> CMSampleBufferGetImageBuffer<span style="color: #49f;">&#40;</span>sampleBuffer<span style="color: #49f;">&#41;</span>;
CFDictionaryRef attachments <span style="color: #49f;">=</span> CMCopyDictionaryOfAttachments<span style="color: #49f;">&#40;</span>kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate<span style="color: #49f;">&#41;</span>;
CIImage <span style="color: #49f;">*</span>ciImage <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span><span style="color: #49f;">&#91;</span>CIImage alloc<span style="color: #49f;">&#93;</span> initWithCVPixelBuffer<span style="color: #49f;">:</span>pixelBuffer options<span style="color: #49f;">:</span><span style="color: #49f;">&#40;</span><span style="color: #8844FF;">NSDictionary</span> <span style="color: #49f;">*</span><span style="color: #49f;">&#41;</span>attachments<span style="color: #49f;">&#93;</span>;
<span style="color: #a61390;">if</span> <span style="color: #49f;">&#40;</span>attachments<span style="color: #49f;">&#41;</span>
    CFRelease<span style="color: #49f;">&#40;</span>attachments<span style="color: #49f;">&#41;</span>;
<span style="color: #8844FF;">NSDictionary</span> <span style="color: #49f;">*</span>imageOptions <span style="color: #49f;">=</span> <span style="color: #a61390;">nil</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// '6' identifies device on vertical position</span>
imageOptions <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span><span style="color: #8844FF;">NSDictionary</span> dictionaryWithObject<span style="color: #49f;">:</span><span style="color: #49f;">&#91;</span><span style="color: #8844FF;">NSNumber</span> numberWithInt<span style="color: #49f;">:</span><span style="color: #2400d9;">6</span><span style="color: #49f;">&#93;</span> forKey<span style="color: #49f;">:</span>CIDetectorImageOrientation<span style="color: #49f;">&#93;</span>;
<span style="color: #8844FF;">NSArray</span> <span style="color: #49f;">*</span>features <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span>faceDetector featuresInImage<span style="color: #49f;">:</span>ciImage options<span style="color: #49f;">:</span>imageOptions<span style="color: #49f;">&#93;</span>;
<span style="color: #49f;">&#91;</span>ciImage release<span style="color: #49f;">&#93;</span>;</pre></div></div>

<p>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.</p>
<div><span><br />
</span></div>
<p><strong>Image&#8217;s CIFaceFeature</strong></p>
<p>A <a href="http://developer.apple.com/library/mac/#documentation/CoreImage/Reference/CIFaceFeature/Reference/Reference.html" target="_blank">CIFaceFeature</a> object properties describes the face found in a image. These properties are:</p>
<p><strong>hasLeftEyePosition</strong><br />
<strong>hasRightEyePosition</strong><br />
<strong>hasMouthPosition</strong><br />
<strong>leftEyePosition</strong><br />
<strong>rightEyePosition</strong><br />
<strong>mouthPosition</strong></p>
<p>Besides that, due to its <a href="http://developer.apple.com/library/mac/#documentation/CoreImage/Reference/CIFeature_Ref/Reference/Reference.html#//apple_ref/occ/cl/CIFeature" target="_blank">CIFeature</a> inheritance, it also has the following properties:</p>
<p><strong>bounds</strong> &#8211; The rectangle that the feature was found inside<br />
<strong>type</strong> &#8211; The feature type</p>
<p>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.</p>
<div><span><br />
</span></div>
<p><strong>CIDetectorAccuracyLow Vs CIDetectorAccuracyHigh</strong></p>
<p>When we created our CIDetector, we provided the CIDetectorAccuracyLow parameter:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #8844FF;">NSDictionary</span> <span style="color: #49f;">*</span>detectorOptions <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span><span style="color: #49f;">&#91;</span><span style="color: #8844FF;">NSDictionary</span> alloc<span style="color: #49f;">&#93;</span> initWithObjectsAndKeys<span style="color: #49f;">:</span>CIDetectorAccuracyLow, CIDetectorAccuracy, <span style="color: #a61390;">nil</span><span style="color: #49f;">&#93;</span>;</pre></div></div>

<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>This post is also available in portuguese <a href="http://i.ndigo.com.br/2012/01/reconhecimento-de-faces-no-ios/">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://i.ndigo.com.br/2012/01/ios-facial-recognition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reconhecimento de Faces no iOS</title>
		<link>http://i.ndigo.com.br/2012/01/reconhecimento-de-faces-no-ios/</link>
		<comments>http://i.ndigo.com.br/2012/01/reconhecimento-de-faces-no-ios/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 21:56:21 +0000</pubDate>
		<dc:creator>Raphael Petegrosso</dc:creator>
				<category><![CDATA[Go Tech]]></category>
		<category><![CDATA[core image]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[iOS 5 Tech Talk World Tour]]></category>
		<category><![CDATA[ios5]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[reconhecimento de face]]></category>

		<guid isPermaLink="false">http://i.ndigo.com.br/?p=568</guid>
		<description><![CDATA[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á [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://i.ndigo.com.br/wp-content/uploads/2012/01/big-bang.jpeg" alt="iOS Facial Recognition Test" title="iOS Facial Recognition Test" width="660" height="371" class="aligncenter size-full wp-image-643" /></p>
<p>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.</p>
<p>É 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 <a href="http://news.cnet.com/8301-13579_3-57321295-37/ios-5-on-almost-40-percent-of-iphones/" target="_blank">artigo</a> 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.</p>
<p>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.</p>
<p>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 <a href="http://developer.apple.com/library/ios/#samplecode/SquareCam/Introduction/Intro.html" target="_blank">aqui</a>.</p>
<div><span><br />
</span></div>
<div><strong>Configuração da Camera</strong></div>
<div>
<p><span id="internal-source-marker_0.11296257469803095"> </span></p>
<p>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.</p>
<p>A configuração é feita para que tenhamos as seguintes instâncias:</p>
<ul>
<li><strong><a href="http://developer.apple.com/library/IOs/#documentation/AVFoundation/Reference/AVCaptureSession_Class/Reference/Reference.html" target="_blank">AVCaptureSession</a></strong> &#8211; 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.</li>
</ul>
</div>
<div>
<p><span id="internal-source-marker_0.11296257469803095"> </span></p>
<ul>
<li><strong><a href="http://developer.apple.com/library/mac/#documentation/AVFoundation/Reference/AVCaptureDevice_Class/Reference/Reference.html" target="_blank">AVCaptureDevice</a></strong> &#8211; É 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.</li>
</ul>
</div>
<div>
<p><span id="internal-source-marker_0.11296257469803095"> </span></p>
<ul>
<li><strong><a href="http://developer.apple.com/library/IOs/#documentation/AVFoundation/Reference/AVCaptureDeviceInput_Class/Reference/Reference.html" target="_blank">AVCaptureDeviceInput</a></strong> &#8211; É uma subclasse de AVCaptureInput usada para adicionar um dispositivo de entrada em uma sessão (AVCaptureSession).</li>
</ul>
</div>
<div>
<p><span id="internal-source-marker_0.11296257469803095"> </span></p>
<ul>
<li><strong><a href="http://developer.apple.com/library/mac/#documentation/AVFoundation/Reference/AVCaptureOutput_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40009543" target="_blank">AVCaptureOutput</a></strong> &#8211; É uma classe abstrata usada para buscar uma saída da sessão (AVCaptureSession).</li>
</ul>
</div>
<div><span id="internal-source-marker_0.11296257469803095">A imagem abaixo, retirada do <a href="http://developer.apple.com/library/IOs/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/04_MediaCapture.html#//apple_ref/doc/uid/TP40010188-CH5-SW2" target="_blank">AV Foundation Programming Guide</a> da Apple mostra a interação entre estas instâncias e o fluxo de dados entre elas:</span></div>
<div><span><br />
</span></div>
<div style="text-align: center;"><img class="aligncenter size-full wp-image-584" src="http://i.ndigo.com.br/wp-content/uploads/2012/01/captureDetail.jpg" alt="" width="553" height="330" /></div>
<div>
<p><span> </span></p>
<div><span id="internal-source-marker_0.11296257469803095">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:</span></div>
<div><span><br />
</span></div>
</div>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #49f;">-</span> <span style="color: #49f;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #49f;">&#41;</span>setupAVCapture
<span style="color: #49f;">&#123;</span>
    AVCaptureSession <span style="color: #49f;">*</span>session <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span>AVCaptureSession new<span style="color: #49f;">&#93;</span>;
    <span style="color: #a61390;">if</span> <span style="color: #49f;">&#40;</span><span style="color: #49f;">&#91;</span><span style="color: #49f;">&#91;</span>UIDevice currentDevice<span style="color: #49f;">&#93;</span> userInterfaceIdiom<span style="color: #49f;">&#93;</span> <span style="color: #49f;">==</span> UIUserInterfaceIdiomPhone<span style="color: #49f;">&#41;</span>
        <span style="color: #49f;">&#91;</span>session setSessionPreset<span style="color: #49f;">:</span>AVCaptureSessionPreset640x480<span style="color: #49f;">&#93;</span>;
    <span style="color: #a61390;">else</span>
        <span style="color: #49f;">&#91;</span>session setSessionPreset<span style="color: #49f;">:</span>AVCaptureSessionPresetPhoto<span style="color: #49f;">&#93;</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">// Select a video device, make an input</span>
    AVCaptureDevice <span style="color: #49f;">*</span>device <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span>AVCaptureDevice defaultDeviceWithMediaType<span style="color: #49f;">:</span>AVMediaTypeVideo<span style="color: #49f;">&#93;</span>;
    AVCaptureDeviceInput <span style="color: #49f;">*</span>deviceInput <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span>AVCaptureDeviceInput deviceInputWithDevice<span style="color: #49f;">:</span>device error<span style="color: #49f;">:</span><span style="color: #a61390;">nil</span><span style="color: #49f;">&#93;</span>;
&nbsp;
    <span style="color: #a61390;">if</span> <span style="color: #49f;">&#40;</span> <span style="color: #49f;">&#91;</span>session canAddInput<span style="color: #49f;">:</span>deviceInput<span style="color: #49f;">&#93;</span> <span style="color: #49f;">&#41;</span>
        <span style="color: #49f;">&#91;</span>session addInput<span style="color: #49f;">:</span>deviceInput<span style="color: #49f;">&#93;</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">// Make a video data output</span>
    videoDataOutput <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span><span style="color: #49f;">&#91;</span>AVCaptureVideoDataOutput alloc<span style="color: #49f;">&#93;</span> init<span style="color: #49f;">&#93;</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">// we want BGRA, both CoreGraphics and OpenGL work well with 'BGRA'</span>
    <span style="color: #8844FF;">NSDictionary</span> <span style="color: #49f;">*</span>rgbOutputSettings <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span><span style="color: #8844FF;">NSDictionary</span> dictionaryWithObject<span style="color: #49f;">:</span>
    <span style="color: #49f;">&#91;</span><span style="color: #8844FF;">NSNumber</span> numberWithInt<span style="color: #49f;">:</span>kCMPixelFormat_32BGRA<span style="color: #49f;">&#93;</span> forKey<span style="color: #49f;">:</span><span style="color: #49f;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #49f;">&#41;</span>kCVPixelBufferPixelFormatTypeKey<span style="color: #49f;">&#93;</span>;
    <span style="color: #49f;">&#91;</span>videoDataOutput setVideoSettings<span style="color: #49f;">:</span>rgbOutputSettings<span style="color: #49f;">&#93;</span>;
    <span style="color: #49f;">&#91;</span>videoDataOutput setAlwaysDiscardsLateVideoFrames<span style="color: #49f;">:</span><span style="color: #a61390;">YES</span><span style="color: #49f;">&#93;</span>; <span style="color: #11740a; font-style: italic;">// discard if the data output queue is blocked (as we process the still image)</span>
&nbsp;
    videoDataOutputQueue <span style="color: #49f;">=</span> dispatch_queue_create<span style="color: #49f;">&#40;</span><span style="color: #bf1d1a;">&quot;VideoDataOutputQueue&quot;</span>, <span style="color: #a61390;">NULL</span><span style="color: #49f;">&#41;</span>;
    <span style="color: #49f;">&#91;</span>videoDataOutput setSampleBufferDelegate<span style="color: #49f;">:</span>self queue<span style="color: #49f;">:</span>videoDataOutputQueue<span style="color: #49f;">&#93;</span>;
&nbsp;
    <span style="color: #a61390;">if</span> <span style="color: #49f;">&#40;</span> <span style="color: #49f;">&#91;</span>session canAddOutput<span style="color: #49f;">:</span>videoDataOutput<span style="color: #49f;">&#93;</span> <span style="color: #49f;">&#41;</span>
        <span style="color: #49f;">&#91;</span>session addOutput<span style="color: #49f;">:</span>videoDataOutput<span style="color: #49f;">&#93;</span>;
&nbsp;
    previewLayer <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span><span style="color: #49f;">&#91;</span>AVCaptureVideoPreviewLayer alloc<span style="color: #49f;">&#93;</span> initWithSession<span style="color: #49f;">:</span>session<span style="color: #49f;">&#93;</span>;
    <span style="color: #49f;">&#91;</span>previewLayer setBackgroundColor<span style="color: #49f;">:</span><span style="color: #49f;">&#91;</span><span style="color: #49f;">&#91;</span>UIColor blackColor<span style="color: #49f;">&#93;</span> CGColor<span style="color: #49f;">&#93;</span><span style="color: #49f;">&#93;</span>;
    <span style="color: #49f;">&#91;</span>previewLayer setVideoGravity<span style="color: #49f;">:</span>AVLayerVideoGravityResizeAspect<span style="color: #49f;">&#93;</span>;
    CALayer <span style="color: #49f;">*</span>rootLayer <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span>previewView layer<span style="color: #49f;">&#93;</span>;
    <span style="color: #49f;">&#91;</span>rootLayer setMasksToBounds<span style="color: #49f;">:</span><span style="color: #a61390;">YES</span><span style="color: #49f;">&#93;</span>;
    <span style="color: #49f;">&#91;</span>previewLayer setFrame<span style="color: #49f;">:</span><span style="color: #49f;">&#91;</span>rootLayer bounds<span style="color: #49f;">&#93;</span><span style="color: #49f;">&#93;</span>;
    <span style="color: #49f;">&#91;</span>rootLayer addSublayer<span style="color: #49f;">:</span>previewLayer<span style="color: #49f;">&#93;</span>;
    <span style="color: #49f;">&#91;</span>session startRunning<span style="color: #49f;">&#93;</span>;
&nbsp;
<span style="color: #49f;">&#125;</span></pre></div></div>

<div><span><br />
</span></div>
<p><strong>Identificando um Rosto com um CIDetector</strong></p>
<p>De acordo com o <a href="http://developer.apple.com/library/ios/#documentation/CoreImage/Reference/CIDetector_Ref/Reference/Reference.html" target="_blank">CIDetector Class Reference</a> da Apple, um objeto CIDetector, disponível a partir do iOS 5 no framework CoreImage.framework, usa processamento de imagem para encontrar &#8220;features&#8221; em uma imagem.</p>
<p>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:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #8844FF;">NSDictionary</span> <span style="color: #49f;">*</span>detectorOptions <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span><span style="color: #49f;">&#91;</span><span style="color: #8844FF;">NSDictionary</span> alloc<span style="color: #49f;">&#93;</span> initWithObjectsAndKeys<span style="color: #49f;">:</span>CIDetectorAccuracyLow, CIDetectorAccuracy, <span style="color: #a61390;">nil</span><span style="color: #49f;">&#93;</span>;
&nbsp;
faceDetector <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span><span style="color: #49f;">&#91;</span>CIDetector detectorOfType<span style="color: #49f;">:</span>CIDetectorTypeFace context<span style="color: #49f;">:</span><span style="color: #a61390;">nil</span> options<span style="color: #49f;">:</span>detectorOptions<span style="color: #49f;">&#93;</span> retain<span style="color: #49f;">&#93;</span>;</pre></div></div>

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

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #49f;">&#91;</span>videoDataOutput setSampleBufferDelegate<span style="color: #49f;">:</span>self queue<span style="color: #49f;">:</span>videoDataOutputQueue<span style="color: #49f;">&#93;</span>;</pre></div></div>

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

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #49f;">-</span> <span style="color: #49f;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #49f;">&#41;</span>captureOutput<span style="color: #49f;">:</span><span style="color: #49f;">&#40;</span>AVCaptureOutput <span style="color: #49f;">*</span><span style="color: #49f;">&#41;</span>captureOutput didOutputSampleBuffer<span style="color: #49f;">:</span><span style="color: #49f;">&#40;</span>CMSampleBufferRef<span style="color: #49f;">&#41;</span>sampleBuffer fromConnection<span style="color: #49f;">:</span><span style="color: #49f;">&#40;</span>AVCaptureConnection <span style="color: #49f;">*</span><span style="color: #49f;">&#41;</span>connection
<span style="color: #49f;">&#123;</span>
…
<span style="color: #49f;">&#125;</span></pre></div></div>

<p>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:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// got an image</span>
CVPixelBufferRef pixelBuffer <span style="color: #49f;">=</span> CMSampleBufferGetImageBuffer<span style="color: #49f;">&#40;</span>sampleBuffer<span style="color: #49f;">&#41;</span>;
CFDictionaryRef attachments <span style="color: #49f;">=</span> CMCopyDictionaryOfAttachments<span style="color: #49f;">&#40;</span>kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate<span style="color: #49f;">&#41;</span>;
CIImage <span style="color: #49f;">*</span>ciImage <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span><span style="color: #49f;">&#91;</span>CIImage alloc<span style="color: #49f;">&#93;</span> initWithCVPixelBuffer<span style="color: #49f;">:</span>pixelBuffer options<span style="color: #49f;">:</span><span style="color: #49f;">&#40;</span><span style="color: #8844FF;">NSDictionary</span> <span style="color: #49f;">*</span><span style="color: #49f;">&#41;</span>attachments<span style="color: #49f;">&#93;</span>;
<span style="color: #a61390;">if</span> <span style="color: #49f;">&#40;</span>attachments<span style="color: #49f;">&#41;</span>
    CFRelease<span style="color: #49f;">&#40;</span>attachments<span style="color: #49f;">&#41;</span>;
<span style="color: #8844FF;">NSDictionary</span> <span style="color: #49f;">*</span>imageOptions <span style="color: #49f;">=</span> <span style="color: #a61390;">nil</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// '6' identifies device on vertical position</span>
imageOptions <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span><span style="color: #8844FF;">NSDictionary</span> dictionaryWithObject<span style="color: #49f;">:</span><span style="color: #49f;">&#91;</span><span style="color: #8844FF;">NSNumber</span> numberWithInt<span style="color: #49f;">:</span><span style="color: #2400d9;">6</span><span style="color: #49f;">&#93;</span> forKey<span style="color: #49f;">:</span>CIDetectorImageOrientation<span style="color: #49f;">&#93;</span>;
<span style="color: #8844FF;">NSArray</span> <span style="color: #49f;">*</span>features <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span>faceDetector featuresInImage<span style="color: #49f;">:</span>ciImage options<span style="color: #49f;">:</span>imageOptions<span style="color: #49f;">&#93;</span>;
<span style="color: #49f;">&#91;</span>ciImage release<span style="color: #49f;">&#93;</span>;</pre></div></div>

<p>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.</p>
<div><span><br />
</span></div>
<p><strong>CIFaceFeature de uma Imagem</strong></p>
<p>Um objeto <a href="http://developer.apple.com/library/mac/#documentation/CoreImage/Reference/CIFaceFeature/Reference/Reference.html" target="_blank">CIFaceFeature</a> 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:</p>
<p><strong>hasLeftEyePosition</strong> &#8211; Informa se a posição do olho esquerdo esta disponível<br />
<strong>hasRightEyePosition</strong> &#8211; Informa se a posição do olho direito esta disponível<br />
<strong>hasMouthPosition</strong> &#8211; Informa se a posição da boca esta disponível<br />
<strong>leftEyePosition</strong> &#8211; Informa a posição do olho esquerdo<br />
<strong>rightEyePosition</strong> &#8211; Informa a posição do olho direito<br />
<strong>mouthPosition</strong> &#8211; Informa a posição da boca</p>
<p>Além disso, por herdar de um <a href="http://developer.apple.com/library/mac/#documentation/CoreImage/Reference/CIFeature_Ref/Reference/Reference.html#//apple_ref/occ/cl/CIFeature" target="_blank">CIFeature</a>, também possui as seguintes propriedades:</p>
<p><strong>bounds</strong> &#8211; Um retângulo que contém a feature encontrada<br />
<strong>type</strong> &#8211; O tipo de feature encontrado</p>
<p>A partir destas informações diversas ações podem ser tomadas, como inserir elementos visuais sobre a face encontrada.</p>
<div><span><br />
</span></div>
<p><strong>Modo CIDetectorAccuracyLow Vs CIDetectorAccuracyHigh</strong></p>
<p>Quando criamos nosso CIDetector, um parâmetro de configuração utilizado foi CIDetectorAccuracyLow, como pode ser visto a seguir:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #8844FF;">NSDictionary</span> <span style="color: #49f;">*</span>detectorOptions <span style="color: #49f;">=</span> <span style="color: #49f;">&#91;</span><span style="color: #49f;">&#91;</span><span style="color: #8844FF;">NSDictionary</span> alloc<span style="color: #49f;">&#93;</span> initWithObjectsAndKeys<span style="color: #49f;">:</span>CIDetectorAccuracyLow, CIDetectorAccuracy, <span style="color: #a61390;">nil</span><span style="color: #49f;">&#93;</span>;</pre></div></div>

<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>Este post também está disponível em inglês <a href="http://i.ndigo.com.br/2012/01/ios-facial-recognition/">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://i.ndigo.com.br/2012/01/reconhecimento-de-faces-no-ios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iOS 5 Tech Talk World Tour &#8211; Brazil 2012</title>
		<link>http://i.ndigo.com.br/2012/01/ios-5-tech-talk-world-tour-brazil-2012/</link>
		<comments>http://i.ndigo.com.br/2012/01/ios-5-tech-talk-world-tour-brazil-2012/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 20:39:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Go Tech]]></category>
		<category><![CDATA[Mobile Trends & Mobile Business]]></category>
		<category><![CDATA[aplicativo]]></category>
		<category><![CDATA[Aprovação Aplicativos]]></category>
		<category><![CDATA[Brazil]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[Experiência do usuário]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[iOS 5 Tech Talk World Tour]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[São Paulo]]></category>
		<category><![CDATA[Usabilidade]]></category>

		<guid isPermaLink="false">http://i.ndigo.com.br/?p=510</guid>
		<description><![CDATA[A I.ndigo participou do iOS 5 Tech Talk World Tour Brazil 2012 e conta para você como foi nossa experiência com os especialistas da Apple presentes no evento e seu impacto nos nossos próximos aplicativos.  ]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class=" aligncenter" title="iOS 5 Tech Talk World Tour Brazil 2012" src="http://ndigo.com.br/mmkt/images/ios%205%20tech%20talk%20world%20tour%20brazil.jpg" alt="iOS 5 Tech Tour World Tour Brazil 2012" width="660" height="276" /></p>
<p style="text-align: left;">
<div id="_mcePaste">
<div id="_mcePaste">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.</div>
<div id="_mcePaste">O &#8220;iOS 5 Tech Talk World Tour&#8221; 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.</div>
<div id="_mcePaste">Confira a seguir um pouco das nossas percepções sobre o evento:</div>
<div id="_mcePaste"><strong>Lab</strong></div>
<div>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 <a href="http://i.ndigo.com.br/2011/11/hyvee-for-iphone-by-i-ndigo" target="_blank">Hy.vee</a>, <a href="http://itunes.apple.com/app/mn-wild-nhl/id489278925?mt=8" target="_blank">Minnesota Wild</a>, <a href="http://itunes.apple.com/br/app/pilao-desperta/id484621914?mt=8" target="_blank">Pilão Desperta</a> e o da universidade de <a href="http://itunes.apple.com/us/app/icardinal/id460288504?mt=8" target="_blank">Stanford</a>.</div>
<div id="_mcePaste">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 <a href="http://itunes.apple.com/us/app/icardinal/id460288504?mt=8" target="_blank">iCardinal</a>, além dos elogios e dicas sobre o desempenho dos nossos aplicativos como o <a href="http://i.ndigo.com.br/2011/11/hyvee-for-iphone-by-i-ndigo" target="_blank">Hy.vee</a> e o <a href="http://i.ndigo.com.br/?p=273" target="_blank">Royal Wedding</a>.</div>
<div id="_mcePaste">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.</div>
<div id="_mcePaste"><strong>Palestras</strong></div>
<div>Foram realizadas <a href="http://developer.apple.com/techtalk/" target="_blank">18 palestras</a> 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.</div>
<div id="_mcePaste">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.</div>
<div id="_mcePaste">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.</div>
<div id="_mcePaste">Não perca nossos próximos posts que vão tratar alguns dos assuntos abordados nas palestras.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://i.ndigo.com.br/2012/01/ios-5-tech-talk-world-tour-brazil-2012/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>O Melhor Aplicativo de 2012</title>
		<link>http://i.ndigo.com.br/2011/12/o-melhor-aplicativo-de-2012/</link>
		<comments>http://i.ndigo.com.br/2011/12/o-melhor-aplicativo-de-2012/#comments</comments>
		<pubDate>Thu, 08 Dec 2011 12:37:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Apps]]></category>
		<category><![CDATA[Keep Watching]]></category>
		<category><![CDATA[aplicativo]]></category>
		<category><![CDATA[app]]></category>
		<category><![CDATA[dispositivos móveis]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[lançamento]]></category>
		<category><![CDATA[little printer]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[mobile trends]]></category>

		<guid isPermaLink="false">http://i.ndigo.com.br/?p=442</guid>
		<description><![CDATA[ais 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.]]></description>
			<content:encoded><![CDATA[<p><iframe src="http://player.vimeo.com/video/32796535?byline=0&amp;portrait=0&amp;color=ffffff" width="660" height="371" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>
<p><a href="http://vimeo.com/32796535">Hello Little Printer, available 2012</a> from <a href="http://vimeo.com/bergstudio">BERG</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>Essa semana na I.ndigo a gente já escolheu o melhor aplicativo de 2012, pelo menos até agora.</p>
<p>Mais que um aplicativo, o<a href="http://bergcloud.com/littleprinter/" target="_blank"> Little Printer</a> é 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.</p>
<p>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.</p>
<p>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?</p>
]]></content:encoded>
			<wfw:commentRss>http://i.ndigo.com.br/2011/12/o-melhor-aplicativo-de-2012/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

