<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-17885082</id><updated>2026-02-08T09:17:56.336+01:00</updated><category term="development"/><category term="java"/><category term="stuff"/><category term="sports"/><category term="running"/><category term="web"/><category term="pics"/><category term="google"/><category term="fun"/><category term="karlsruhe"/><category term="web development"/><category term="jug-ka"/><category term="half marathon"/><category term="blog"/><category term="iPhone"/><category term="apple"/><category term="quality"/><category term="spring"/><category term="video"/><category term="ipod"/><category term="traveling"/><category term="testing"/><category term="iPad"/><category term="objective-c"/><category term="singapore"/><category term="twitter"/><category term="osgi"/><category term="out&#39;n about"/><category term="mac"/><category term="scala"/><category term="plazes"/><category term="blogger"/><category term="mobile"/><category term="yahoo"/><category term="android"/><category term="gae"/><category term="jboss"/><category term="jboss rules"/><category term="sutini"/><category term="wordbuzz"/><category term="drools"/><category term="git"/><category term="groovy"/><category term="joost"/><category term="hibernate"/><category term="guice"/><category term="lucene"/><category term="microsoft"/><category term="security"/><category term="boxing"/><category term="pownce"/><category term="starbucks"/><category term="bangkok"/><category term="browser"/><category term="marathon"/><category term="advertising"/><category term="christmas"/><category term="firefox"/><category term="flickr"/><category term="jaiku"/><category term="scriggity"/><category term="skype"/><category term="technorati"/><category term="zattoo"/><title type='text'>my take on things</title><subtitle type='html'>{ by david linsin }</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default?start-index=26&amp;max-results=25'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>515</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-17885082.post-4302537067289123301</id><published>2011-03-01T06:07:00.000+01:00</published><updated>2011-03-01T06:10:35.588+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="blog"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="gae"/><category scheme="http://www.blogger.com/atom/ns#" term="git"/><category scheme="http://www.blogger.com/atom/ns#" term="google"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="ipod"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="jug-ka"/><category scheme="http://www.blogger.com/atom/ns#" term="karlsruhe"/><category scheme="http://www.blogger.com/atom/ns#" term="mac"/><category scheme="http://www.blogger.com/atom/ns#" term="mobile"/><category scheme="http://www.blogger.com/atom/ns#" term="objective-c"/><category scheme="http://www.blogger.com/atom/ns#" term="quality"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><title type='text'>303</title><content type='html'>This is my last blog post here on blogger.com! You&#39;ll find my new thoughts, projects and development ramblings at &lt;a href=&quot;http://dlinsin.github.com&quot;&gt;http://dlinsin.github.com&lt;/a&gt;. 

I migrated to blogger.com in &lt;a href=&quot;http://dlinsin.blogspot.com/2005/10/lets-go.html&quot;&gt;late 2005&lt;/a&gt; and was always quite happy with it. More than 5 years and exactly 502 posts later it&#39;s time to move on to something new. 

Subscribe to &lt;a href=&quot;http://dlinsin.github.com&quot;&gt;my new blog feed&lt;/a&gt;, check &lt;a href=&quot;http://github.com/dlinsin&quot;&gt;my stuff on github&lt;/a&gt; or &lt;a href=&quot;http://twitter.com/furryfishapps&quot;&gt;follow me&lt;/a&gt; on Twitter.</content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/4302537067289123301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/4302537067289123301' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/4302537067289123301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/4302537067289123301'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2011/03/303.html' title='303'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-4445746095152849706</id><published>2011-02-15T19:30:00.000+01:00</published><updated>2011-02-15T19:32:15.800+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="ipod"/><category scheme="http://www.blogger.com/atom/ns#" term="objective-c"/><title type='text'>ShareKit Pimping</title><content type='html'>&lt;p&gt;A couple of months ago, I &lt;a href=&quot;http://dlinsin.blogspot.com/2010/11/word-buzz-getting-better-twitter.html&quot;&gt;improved Word Buzz&#39; Twitter sharing feature&lt;/a&gt; significantly, by leveraging a &lt;a href=&quot;https://github.com/dlinsin/iphone-twitter&quot;&gt;tweaked version&lt;/a&gt; of an existing framework. Unfortunately, I had only heard of &lt;a href=&quot;http://getsharekit.com&quot;&gt;ShareKit&lt;/a&gt; at that time, that&#39;s the reason why I decided to implement my own solution!&lt;/p&gt;&lt;p&gt;In case you don&#39;t know about ShareKit or like me only heard about it:&lt;/p&gt;&lt;blockquote&gt;SharKit adds full sharing capabilities to your App. It&#39;s a drop-in library, which supports services like Twitter, Facebook, Instapaper and many more. You can share links, text and pictures with a customizable user interface. It evens queues shared items until an internet connection is available.&lt;/blockquote&gt;&lt;p&gt;SharKit is awesome and I really regret not using it to add Twitter sharing to &lt;a href=&quot;http://itunes.apple.com/app/word-buzz/id388372038?mt=8&quot;&gt;Word Buzz&lt;/a&gt;. It has a well documented API and is really easy to extend, there&#39;s even a step-by-step guide on ShakreKit&#39;s website, which describes the process. I followed that guide to add &lt;a href=&quot;https://github.com/dlinsin/ShareKit&quot;&gt;TwitPic and yfrog capability&lt;/a&gt; to ShareKit for one of our next &lt;a href=&quot;http://twitter.com/furryfishApps&quot;&gt;furryfishApps&lt;/a&gt; projects and that&#39;s what I&#39;d like to write about in this post.&lt;/p&gt;&lt;p&gt;ShareKit comes with built-in Twitter support, which you can find in &lt;em&gt;SHKTwitter&lt;/em&gt; and its authentication form &lt;em&gt;SHKTwitterForm&lt;/em&gt;. It uses &lt;a href=&quot;http://bit.ly&quot;&gt;bit.ly&lt;/a&gt; to share images, which has a similar API as TwitPic and yfrog. I piggybacked on that implementation, however dropped oAuth support in favor of xAuth.&lt;/p&gt;&lt;p&gt;I know there are &lt;a href=&quot;http://hueniverse.com/2010/06/xauth-a-terrible-horrible-no-good-very-bad-idea/&quot;&gt;a lot of discussions&lt;/a&gt; on xAuth, however I found it the &lt;a href=&quot;http://www.reynoldsftw.com/2010/03/using-xauth-an-alternate-oauth-from-twitter/&quot;&gt;easiest way&lt;/a&gt; to provide the most benefit for iPhone App users, without compromising security in a hurtful way. In order to get your iPhone App ready to use xAuth with Twitter, you need to sign up at &lt;a href=&quot;http://developer.twitter.com/&quot;&gt;http://developer.twitter.com/&lt;/a&gt;. I described the process in a &lt;a href=&quot;http://dlinsin.blogspot.com/2010/11/word-buzz-getting-better-twitter.html&quot;&gt;previous post&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The previously mentioned class &lt;em&gt;SHKTwitter&lt;/em&gt; inherits from &lt;em&gt;SHKOAuthSharer&lt;/em&gt;, which does all the heavy lifting in terms of authentication for you! All you need to do is hook into the API calls and customize your authentication screen:&lt;/p&gt;&lt;script src=&quot;https://gist.github.com/827260.js?file=gistfile1.m&quot;&gt;&lt;/script&gt; &lt;p&gt;&lt;noscript&gt;&lt;pre&gt;return [NSArray arrayWithObjects:
[SHKFormFieldSettings label:SHKLocalizedString(@&quot;Username&quot;) key:@&quot;username&quot; type:SHKFormFieldTypeText start:nil],
[SHKFormFieldSettings label:SHKLocalizedString(@&quot;Password&quot;) key:@&quot;password&quot; type:SHKFormFieldTypePassword start:nil],
[SHKFormFieldSettings label:SHKLocalizedString(@&quot;Send to Twitter&quot;) key:@&quot;sendToTwitter&quot; type:SHKFormFieldTypeSwitch start:SHKFormFieldSwitchOn],
nil];&lt;/pre&gt;&lt;/noscript&gt;&lt;/p&gt;&lt;p&gt;So let&#39;s say the user wants to share a picture, taps on the share icon and select TwitPic. He authenticates after being prompt for his Twitter credentials. When the authentication was successful, you want to show some sort of form to your users, where they can enter a comment or in case of Twitter, their status. You can totally customize the UI, without any dependency to ShareKit. In fact &lt;em&gt;SHKTwitterForm&lt;/em&gt;, ShareKits built-in Twitter form, is a simple &lt;em&gt;UIViewController&lt;/em&gt; with its delegate set to &lt;em&gt;SHKTwitter&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;The actual sharing part of the code is as straight forward as the rest of ShareKit. It&#39;s a little verbose, but once your understood the concept, it&#39;s easy to extend:&lt;/p&gt;&lt;script src=&quot;https://gist.github.com/827294.js?file=gistfile1.m&quot;&gt;&lt;/script&gt; &lt;p&gt;&lt;noscript&gt;&lt;pre&gt;- (void)sendImage {

NSString * oauthHeader = [self oauthHeader];

NSURL *serviceURL = [NSURL URLWithString:@&quot;http://yfrog.com/api/xauth_upload&quot;];
OAMutableURLRequest *oRequest = [[OAMutableURLRequest alloc] initWithURL:serviceURL
consumer:super.consumer
token:super.accessToken
realm:@&quot;http://api.twitter.com/&quot;
signatureProvider:super.signatureProvider];

[oRequest prepare];
[oRequest setValue:nil forHTTPHeaderField:@&quot;Authorization&quot;];

[oRequest setHTTPMethod:@&quot;POST&quot;];
[oRequest setValue:@&quot;https://api.twitter.com/1/account/verify_credentials.json&quot; forHTTPHeaderField:@&quot;X-Auth-Service-Provider&quot;];
[oRequest setValue:oauthHeader forHTTPHeaderField:@&quot;X-Verify-Credentials-Authorization&quot;];

NSString *boundary = @&quot;a21ff70823f9&quot;;
NSString *contentType = [NSString stringWithFormat:@&quot;multipart/form-data; boundary=%@&quot;,boundary];
[oRequest setValue:contentType forHTTPHeaderField:@&quot;Content-Type&quot;];

NSMutableData *body = [NSMutableData data];

[body appendData:[[NSString stringWithFormat:@&quot;--%@\r\n&quot;,boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@&quot;Content-Disposition: form-data; name=\&quot;key\&quot;\r\n\r\n&quot; dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[self.yfrogAPIKey dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@&quot;\r\n&quot; dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:[[NSString stringWithFormat:@&quot;--%@\r\n&quot;,boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@&quot;Content-Disposition: form-data; name=\&quot;media\&quot;; filename=\&quot;upload.jpg\&quot;\r\n&quot; dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@&quot;Content-Type: image/jpg\r\n\r\n&quot; dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[self imageData]];
[body appendData:[@&quot;\r\n&quot; dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:[[NSString stringWithFormat:@&quot;--%@--\r\n&quot;,boundary] dataUsingEncoding:NSUTF8StringEncoding]];

[oRequest setHTTPBody:body];

[self sendDidStart];

// Start the request
OAAsynchronousDataFetcher *fetcher = [OAAsynchronousDataFetcher asynchronousFetcherWithRequest:oRequest
delegate:self
didFinishSelector:@selector(sendImage:didFinishWithData:)
didFailSelector:@selector(sendImage:didFailWithError:)];

[fetcher start];

[oRequest release];
}
&lt;/pre&gt;&lt;/noscript&gt;&lt;/p&gt;&lt;p&gt;As you can see most of the work goes into setting up the authentication headers for the request, as well as filling in the elements of the request body. There are APIs like &lt;a href=&quot;http://allseeing-i.com/ASIHTTPRequest&quot;&gt;ASIHTTPRequest&lt;/a&gt;, which handle this for you, however ShareKit doesn&#39;t use them and I didn&#39;t want to introduce a 3rd party library. If you take a look at &lt;a href=&quot;https://github.com/Gurpartap/GSTwitPicEngine&quot;&gt;Gurpartap&#39;s TwitPic engine&lt;/a&gt;, you can see how easy and simple the code would be.&lt;/p&gt;&lt;p&gt;Overall it&#39;s a breeze to develop with &lt;a href=&quot;http://getsharekit.com&quot;&gt;SharKit&lt;/a&gt; and I&#39;m glad I digged in deeper. For our next project we&#39;ll definitely use it and you should at least take a look at it before rolling your own implementation.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/4445746095152849706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/4445746095152849706' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/4445746095152849706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/4445746095152849706'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2011/02/sharekit-pimping.html' title='ShareKit Pimping'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-7053166481722177462</id><published>2011-01-31T17:03:00.000+01:00</published><updated>2011-01-31T17:03:00.693+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="ipod"/><category scheme="http://www.blogger.com/atom/ns#" term="objective-c"/><category scheme="http://www.blogger.com/atom/ns#" term="quality"/><category scheme="http://www.blogger.com/atom/ns#" term="testing"/><title type='text'>UI Test Automation with Instruments</title><content type='html'>One of the most impressive talks for me at &lt;a href=&quot;http://dlinsin.blogspot.com/2010/06/wwdc10.html&quot;&gt;WWDC 2010&lt;/a&gt; was session 306 - &quot;Automating Use Interface Testing with Instruments&quot;. I&#39;ve been wanting to check it out ever since iOS 4 was released. A couple of weeks ago, I finally had a chance to give it a test ride with &lt;a href=&quot;http://mobile.synyx.de/2010/09/i-think-i-spider-1-0-released/&quot;&gt;&quot;I think I spider&quot;&lt;/a&gt;, one of the Apps I developed.&lt;br/&gt;&lt;br/&gt;

All you need to get started is an App, Instruments and some basic JavaScript skills. Apple provides a set of &lt;a href=&quot;http://developer.apple.com/library/ios/#documentation/ToolsLanguages/Reference/UIATargetClassReference/UIATargetClass/UIATargetClass.html&quot;&gt;JavaScript libraries&lt;/a&gt;, that you can use to drive your tests and simulate user interaction. Your custom test scripts are run using the Automation Instrument in Apple&#39;s Instruments App, targeting your App either in the Simulator or on an actual device.&lt;br/&gt;&lt;br/&gt;

You can test almost every aspect of user interaction, using Apple&#39;s JavaScript library. No matter if you want to test shaking, device orientation or the basics like tapping and swiping, you can do all that using basic JavaScript function calls. Apple&#39;s &lt;a href=&quot;https://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/Built-InInstruments/Built-InInstruments.html%23//apple_ref/doc/uid/TP40004652-CH6-SW75&quot;&gt;documentation&lt;/a&gt; is quite solid, as most of them are, and explains the process in detail.&lt;br/&gt;&lt;br/&gt; 

For &quot;I think I spider&quot; I covered the basic use cases in terms of UI, to make sure it still works after adding new features. Here is a basic example of the JavaScript involved to test &quot;opening&quot; the book, after starting the App:&lt;br /&gt;&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/803902.js&quot;&gt; &lt;/script&gt;&lt;noscript&gt;

&lt;pre&gt;// setup&lt;br/&gt;var target = UIATarget.localTarget();
var appWindow = target.frontMostApp().mainWindow();
var element = target;&lt;br/&gt;
// first test
var testName = &quot;Start Screen Test&quot;;
UIALogger.logStart(testName);&lt;br/&gt;
UIALogger.logMessage(&quot;Tapping start screen&quot;);
appWindow.elements()[&quot;start_screen&quot;].tap(); // open the book&lt;br/&gt;
if (appWindow.elements()[&quot;main_screen&quot;].isValid()) {
  UIALogger.logFail(testName);
} else {&lt;br/&gt;
  UIALogger.logPass(testName);
}&lt;/pre&gt;&lt;/noscript&gt;&lt;br/&gt;&lt;br/&gt;

You can see that the JavaScript API is quite easy to use and yet very powerful! After setting this up in the Automation Instrument and running it, you can see the Simulator firing up and tapping the &lt;em&gt;UIImageView&lt;/em&gt; with the accessibility label &quot;startscreen&quot; after it became available. It then tests, if the main screen of the App was loaded and either passes or fails the test.&lt;br/&gt;&lt;br/&gt; 

In order to make our App testable, I had to set the accessibility labels on the elements we wanted to reference from the script. That was the only change I had to make in our code. Since you should take accessibility into consideration anyways, it was a reasonable effort.&lt;br/&gt;&lt;br/&gt;  

Apple did an awesome job giving us developers the ability to catch regressions and make our life easier. However, there is room for improvement, which has been nicely &lt;a href=&quot;http://blog.airsource.co.uk/index.php/2010/08/13/ui-automation-on-the-iphone/&quot;&gt;summarized&lt;/a&gt; by &lt;a href=&quot;http://www.airsource.co.uk&quot;&gt;Air Source&lt;/a&gt;. For us, a missing &lt;em&gt;UIALogger.warn&lt;/em&gt; function in the JavaScript library was the biggest downside. Sometimes it&#39;s okay for a test to fail under certain conditions, but you still want to get a warning about it. I use &lt;em&gt;UIALogger.logMessage&lt;/em&gt; for those cases as a workaround, but it&#39;s quite easy to miss those lines, since they don&#39;t stand out.&lt;br/&gt;&lt;br/&gt;

Overall, I think it&#39;s a huge improvement to have a UI testing tool for iOS Apps at hand. There is room for improvement, but the current state of UI Test Automation is already priceless!</content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/7053166481722177462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/7053166481722177462' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/7053166481722177462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/7053166481722177462'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2011/01/ui-test-automation-with-instruments.html' title='UI Test Automation with Instruments'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-1693728623983962283</id><published>2011-01-10T19:54:00.001+01:00</published><updated>2011-01-10T19:57:00.699+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="git"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="ipod"/><category scheme="http://www.blogger.com/atom/ns#" term="mobile"/><category scheme="http://www.blogger.com/atom/ns#" term="objective-c"/><title type='text'>5 Star Rating</title><content type='html'>A &lt;a href=&quot;http://dlinsin.blogspot.com/2010/09/i-think-i-spider.html&quot;&gt;couple of months ago&lt;/a&gt; we release our first own App &quot;&lt;a href=&quot;http://mobile.synyx.de/2010/09/i-think-i-spider-1-0-released/&quot;&gt;I think I spider&lt;/a&gt;&quot; at Synyx. It features German quotes and sayings directly translated to English. It doesn&#39;t make much sense to a none-native German speaker, but believe me it&#39;s hilarious for us.&lt;br /&gt;
&lt;br /&gt;
The App let&#39;s you rate those quotes with a 5 star rating, which is directly incorporated into a ranking. Up until today the component in charge of the ranking is a simple bunch of &lt;em&gt;UIImageViews&lt;/em&gt; wired up with Interface Builder and set appropriately when tapped. That means if you want to give a 3 star rating, tapping on the 3rd &lt;em&gt;UIImageView&lt;/em&gt; would fill up the 2 previous one as well. Same goes for changing your mind and going from a 5 to 3 star rating. The logic would unhighlight the 4th and 5th star.&lt;br /&gt;
&lt;br /&gt;
Now, this works great and it certainly looks beautiful, but have you ever rated an App in the App Store on your iOS device? This is how it looks like:&lt;br /&gt;
&lt;br /&gt;
&lt;object width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/cbOll4SWwmU?fs=1&amp;amp;hl=en_US&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/cbOll4SWwmU?fs=1&amp;amp;hl=en_US&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
Apple did a great job of just getting everything right with this small little control. The way you can slide your finger over it and the stars light up is just great. Also notice that if you want to reset the rating and go down to 0 stars, you need to swipe your finger all the way to the left. Note, that you can also touch slightly below the star, in order to see the stars above your fingers.&lt;br /&gt;
&lt;br /&gt;
All those little details were the requirements for the next version of the rating feature of &lt;a href=&quot;http://itunes.apple.com/de/app/i-think-i-spider/id390639989?mt=8&quot;&gt;I think I spider&lt;/a&gt;. However, having some spare time over the holidays, I though I&#39;d write a little component, which does all of that and more: &lt;strong&gt;DLStarRating&lt;/strong&gt;. You can find the code on &lt;a href=&quot;https://github.com/dlinsin/DLStarRating&quot;&gt;github&lt;/a&gt;, along with a sample project of how to use the stuff in your next App.&lt;br /&gt;
&lt;br /&gt;
&lt;object width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/0fpeBo2H7Tc?fs=1&amp;amp;hl=en_US&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/0fpeBo2H7Tc?fs=1&amp;amp;hl=en_US&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;DLStarRating&lt;/em&gt; consists of a configurable number of custom &lt;em&gt;UIButtons&lt;/em&gt; called &lt;em&gt;DLStarView&lt;/em&gt;. They have a different background image for their normal and highlighted state. Those buttons are wrapped in a &lt;em&gt;UIControl&lt;/em&gt; called &lt;em&gt;DLStarRatingControl&lt;/em&gt;, which does all the touch handling. The buttons are centered in the &lt;em&gt;DLStarRatingControl&lt;/em&gt; so keep that in mind when configuring its size.&lt;br /&gt;
&lt;br /&gt;
It&#39;s quite easy to use &lt;em&gt;DLStarRating&lt;/em&gt; in your code. You can wire it up in Interface Builder (although you won&#39;t be able to configure it from there) or in your &lt;em&gt;UIViewController&lt;/em&gt; subclass:&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/772510.js?file=gistfile1.m&quot;&gt;&lt;/script&gt;&lt;noscript&gt;&lt;pre&gt;DLStarRatingControl *customNumberOfStars = [[DLStarRatingControl alloc] initWithFrame:CGRectMake(0, 230, 320, 230) andStars:3];
customNumberOfStars.backgroundColor = [UIColor groupTableViewBackgroundColor];
customNumberOfStars.autoresizingMask =  UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
customNumberOfStars.rating = 2;
[self.view addSubview:customNumberOfStars];&lt;/pre&gt;&lt;/noscript&gt;&lt;br /&gt;
&lt;br /&gt;
To customize the stars, you can replace &lt;em&gt;star.png&lt;/em&gt; and &lt;em&gt;star_highlighted.png&lt;/em&gt; in the images folder under &lt;em&gt;DLStarRating&lt;/em&gt; with your own. The only requirement is that the two images must have the same size.&lt;br /&gt;
&lt;br /&gt;
If you discover any bugs or have a great idea you want implemented, open an issue on &lt;a href=&quot;https://github.com/dlinsin/DLStarRating/issues&quot;&gt;github&lt;/a&gt; or fork the project and help me out!</content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/1693728623983962283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/1693728623983962283' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/1693728623983962283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/1693728623983962283'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2011/01/5-star-rating.html' title='5 Star Rating'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-589707145751741695</id><published>2010-12-15T07:07:00.001+01:00</published><updated>2010-12-15T07:08:31.815+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="ipod"/><category scheme="http://www.blogger.com/atom/ns#" term="mobile"/><category scheme="http://www.blogger.com/atom/ns#" term="objective-c"/><category scheme="http://www.blogger.com/atom/ns#" term="wordbuzz"/><title type='text'>Word Buzz Lite</title><content type='html'>&lt;a href=&quot;http://itunes.apple.com/app/word-buzz/id388372038?mt=8&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghZf-LPa7Mmstui4oPo0_DNtQdEgUncA1i_AL9fpugYwVOrQWahjKawiOVFqbAq07siUS58EQkJBEkPIeZ3tWoHN6XKpxA5s2Z3NK9bpY_W7EL1ZYDPTbnogmavykwwWoLpLYD/?imgmax=800&quot; alt=&quot;114x114.png&quot; border=&quot;0&quot; width=&quot;114&quot; height=&quot;114&quot; style=&quot;float:left;padding-right:10px;&quot; /&gt;&lt;/a&gt;When we first planned Word Buzz, we didn&#39;t want to release a free version. It has a more exclusive feeling to it, if you can&#39;t test before you try. However, to boost your user base, there&#39;s nothing better than a free version. So here it is: &lt;a href=&quot;http://itunes.apple.com/app/word-buzz-hd-lite/id404852163?mt=8&quot;&gt;Word Buzz Lite&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;

It&#39;s a universal App with no limitation except for one: no Game Center! It&#39;s not our decision, but more of &lt;a href=&quot;http://dlinsin.blogspot.com/2010/11/word-buzz-to-support-game-center.html&quot;&gt;Apple&#39;s technical limitation&lt;/a&gt; to only allow one App (bundle id) per Game Center instance. Another difference is the number of free built-in themes. The free version comes with only one free theme and more available through in-app purchases.&lt;br/&gt;&lt;br/&gt;

When developing &lt;a href=&quot;http://dlinsin.blogspot.com/2010/07/apple-push-notifications-on-google.html&quot;&gt;Doublemill&lt;/a&gt;, which is a separate App for &lt;a href=&quot;http://itunes.apple.com/app/doublemill/id368886888?mt=8&quot;&gt;iPhone&lt;/a&gt; and &lt;a href=&quot;http://itunes.apple.com/app/doublemill-for-ipad/id370791547?mt=8&quot;&gt;iPad&lt;/a&gt;, I decided to use different XCode projects for the lite, premium and iPad version, hence different source bases for the three Apps. For Word Buzz, we decided to use a different strategy. A multi-target project for full and lite version, which are both universal Apps.&lt;br/&gt;&lt;br/&gt;

Having different source bases has a couple of drawbacks, which I experienced the hard way. One of it is fixing bugs! It&#39;s is a copy-paste task, with all its pitfalls and pain in testing. In addition to that, XCode&#39;s support for handling multiple projects isn&#39;t exactly supporting you. However, evolving the 3 different Apps, was easy and didn&#39;t affect the others in any way.&lt;br/&gt;&lt;br/&gt;

Developing a multi-target project comes with its own set of challenges. You are basically programming based on a &lt;a href=&quot;http://en.wikipedia.org/wiki/C_preprocessor#Macro_definition_and_expansion&quot;&gt;preprocessor conditional inclusion or exclusion&lt;/a&gt;, which I&#39;ve explained in an &lt;a href=&quot;http://dlinsin.blogspot.com/2010/08/testing-apps-with-in-app-purchases-in.html&quot;&gt;earlier blog post&lt;/a&gt;. For Word Buzz is was quite easy to cut out the additional themes and the Game Center support. However, I can imagine it can become quite complicated if you want to exclude sophisticated features. XCode comes with awesome support for multiple targets and its Organizer can still handle releases for two different versions, although it&#39;s one source base. In order to get me started, I used &lt;a href=&quot;http://chris-fletcher.com/2010/10/14/how-to-create-a-lite-version-of-your-iphone-app/&quot;&gt;Chris Fletcher&#39;s blog post&lt;/a&gt; on building a lite version for your iPhone App. It covers the basics and brings you up to speed. &lt;br/&gt;&lt;br/&gt;

When it comes to evolving Word Buzz, we needed to shift our minds from the source-based to a SCM-based evolution model. We needed to maintain different branches, which would get quite complicated from time to time. Thanks to Git and &lt;a href=&quot;http://github.com&quot;&gt;github&lt;/a&gt;, we never experienced any problems bringing the various versions (branches) back together. Once you&#39;ve changed your mental model to a DSCM system, it&#39;s hard to switch back, at least for me.&lt;br/&gt;&lt;br/&gt;

We are quite happy to have used multiple targets. Everything is covered under the hood of one XCode project and fixes go right into both versions. Check out &lt;a href=&quot;http://itunes.apple.com/app/word-buzz-hd-lite/id404852163?mt=8&quot;&gt;Word Buzz Lite&lt;/a&gt; and let us know what you think!
 </content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/589707145751741695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/589707145751741695' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/589707145751741695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/589707145751741695'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2010/12/word-buzz-lite.html' title='Word Buzz Lite'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghZf-LPa7Mmstui4oPo0_DNtQdEgUncA1i_AL9fpugYwVOrQWahjKawiOVFqbAq07siUS58EQkJBEkPIeZ3tWoHN6XKpxA5s2Z3NK9bpY_W7EL1ZYDPTbnogmavykwwWoLpLYD/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-4335464276789098072</id><published>2010-12-06T06:30:00.000+01:00</published><updated>2010-12-06T08:32:06.266+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="ipod"/><category scheme="http://www.blogger.com/atom/ns#" term="objective-c"/><category scheme="http://www.blogger.com/atom/ns#" term="wordbuzz"/><title type='text'>Why Word Buzz doesn&amp;#39;t support iOS 3.1</title><content type='html'>&lt;a href=&quot;http://itunes.apple.com/app/word-buzz/id388372038?mt=8&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghZf-LPa7Mmstui4oPo0_DNtQdEgUncA1i_AL9fpugYwVOrQWahjKawiOVFqbAq07siUS58EQkJBEkPIeZ3tWoHN6XKpxA5s2Z3NK9bpY_W7EL1ZYDPTbnogmavykwwWoLpLYD/?imgmax=800&quot; alt=&quot;114x114.png&quot; border=&quot;0&quot; width=&quot;114&quot; height=&quot;114&quot; style=&quot;float:left;padding-right:10px;&quot; /&gt;&lt;/a&gt; Word Buzz supports 3.2+, which means it doesn&#39;t support iOS 3 on iPhone. Although, my software developer ego doesn&#39;t like the fact, that we don&#39;t support the older versions of iOS, it was the right decision to do so.&lt;br/&gt;&lt;br/&gt;

It was a business decision to not support iOS 3.1, that&#39;s the short story. Rumors have it, that there are &lt;a href=&quot;https://twitter.com/stroughtonsmith/status/1300025644687361&quot;&gt;less than 10%&lt;/a&gt; of iOS 3.x devices out there - including iPads. That&#39;s a small enough number, to justify locking out the folks, which &lt;a href=&quot;http://twitter.com/furryfishApps/status/4247028213227520&quot;&gt;haven&#39;t upgraded&lt;/a&gt; yet. &lt;br/&gt;&lt;br/&gt;

The long story is, that we simply didn&#39;t develop with iOS 3.1 in mind. The are so many new features in iOS 3.2, which we wanted to use, that we couldn&#39;t just port it back. Let me give you a few examples:&lt;br/&gt;&lt;br/&gt;

Since iOS 3.2 you can use custom fonts in an easy and simple fashion. You add an array to your &lt;em&gt;Info.plist&lt;/em&gt; called &lt;em&gt;UIAppFonts&lt;/em&gt; and each item contains the filename of the font you put into your App bundle. There has been &lt;a href=&quot;http://stackoverflow.com/questions/360751/can-i-embed-a-custom-font-in-an-iphone-application&quot;&gt;no easy way&lt;/a&gt; of accomplishing this before iOS 3.2, so we didn&#39;t want to sacrifice design and roll-out the 3.1 version with a system font.&lt;br/&gt;&lt;br/&gt;

Another great new feature in iOS 3.2 are &lt;a href=&quot;http://developer.apple.com/library/ios/#documentation/general/conceptual/iPadProgrammingGuide/GestureSupport/GestureSupport.html&quot;&gt;Gesture Recognizers&lt;/a&gt;. If you don&#39;t know what I&#39;m talking about stop right here and go read up on it - you are missing out! Although, Word Buzz doesn&#39;t use Gesture Recognizers extensively, we didn&#39;t wanna g back to the 19th century and use those old &lt;a href=&quot;http://developer.apple.com/library/ios/documentation/general/conceptual/Devpedia-CocoaApp/EventHandlingiPhone.html#//apple_ref/doc/uid/TP40009071-CH13&quot;&gt;UITouch event handling&lt;/a&gt; stuff.&lt;br/&gt;&lt;br/&gt;

Those were just the two most obvious examples out of many! We sat down and tried to make Word Buzz run on our iPhone 3G, which still runs 3.1.3, but after a day worth of coding, we gave up. We&#39;d love to make it run, but we&#39;ll rather invest in future proofing Word Buzz, using &lt;a href=&quot;http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html&quot;&gt;Blocks&lt;/a&gt; and &lt;a href=&quot;http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html&quot;&gt;GCD&lt;/a&gt;! We can&#39;t wait to drop iOS 3.2 support! 

</content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/4335464276789098072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/4335464276789098072' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/4335464276789098072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/4335464276789098072'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2010/12/why-word-buzz-doesn-support-ios-31.html' title='Why Word Buzz doesn&amp;#39;t support iOS 3.1'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghZf-LPa7Mmstui4oPo0_DNtQdEgUncA1i_AL9fpugYwVOrQWahjKawiOVFqbAq07siUS58EQkJBEkPIeZ3tWoHN6XKpxA5s2Z3NK9bpY_W7EL1ZYDPTbnogmavykwwWoLpLYD/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-5490318674545634728</id><published>2010-11-29T18:17:00.000+01:00</published><updated>2010-11-29T18:19:21.513+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="ipod"/><category scheme="http://www.blogger.com/atom/ns#" term="wordbuzz"/><title type='text'>Word Buzz to support Game Center</title><content type='html'>&lt;a href=&quot;http://itunes.apple.com/app/word-buzz/id388372038?mt=8&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghZf-LPa7Mmstui4oPo0_DNtQdEgUncA1i_AL9fpugYwVOrQWahjKawiOVFqbAq07siUS58EQkJBEkPIeZ3tWoHN6XKpxA5s2Z3NK9bpY_W7EL1ZYDPTbnogmavykwwWoLpLYD/?imgmax=800&quot; alt=&quot;114x114.png&quot; border=&quot;0&quot; width=&quot;114&quot; height=&quot;114&quot; style=&quot;float:left;padding-right:10px;&quot; /&gt;&lt;/a&gt; Today &lt;a href=&quot;http://twitter.com/furryfishApps&quot;&gt;furryfishApps&lt;/a&gt; is proud to announce, that &lt;a href=&quot;http://itunes.apple.com/app/word-buzz/id388372038?mt=8&quot;&gt;Word Buzz&lt;/a&gt; now supports Game Center. A lot of work went into making this happen and we learned quite a bit on the way. I won&#39;t go into technical detail here, but rather cover what we&#39;ve implemented.&lt;br/&gt;&lt;br/&gt;

Word Buzz lets you share your highscore and &lt;a href=&quot;https://word-buzz.appspot.com/index.jsp?badge=rookie&quot;&gt;achievements&lt;/a&gt; on Game Center. It comes with over 16 different themes (set of words) and a lot more available for download. Each of those themes gets its own score, which will be added to your overall highscore. The sum of all highscores is shared on Game Center. &lt;br/&gt;&lt;br/&gt;

&lt;strong&gt;Why didn&#39;t we just share the highscore of each theme?&lt;/strong&gt; &lt;em&gt;We couldn&#39;t! Game Center lets you only share up to 20 different highscores, which is probably reasonable. It might be a bit confusing to have 40 different highscore lists. &lt;/em&gt;&lt;br/&gt;&lt;br/&gt;

Word Buzz is available on all iOS devices. You can play on your iPhone as well as on your iPad or iPod touch. Unfortunately, there is no way with Game Center to sync more than 20 highscores between devices. That means, you cannot just pick up with your iPad, where you left off with your iPhone. We are working on a homegrown solution, but until that happens, it&#39;s best to stick on one device. &lt;br/&gt;&lt;br/&gt;

When playing Word Buzz, you can unlock over 10 different achievements. All of them are shared on Game Center automatically, as soon as you unlock them. &lt;br/&gt;&lt;br/&gt;

&lt;strong&gt;What happens if you are offline?&lt;/strong&gt; &lt;em&gt;Don&#39;t worry! Your achievements and highscores are safely stored on the device and uploaded to Game Center as soon as you sign in!&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;

Go challenge your friends and enjoy &lt;a href=&quot;http://twitter.com/WordBuzzApp&quot;&gt;Word Buzz&lt;/a&gt; with Game Center. 
 </content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/5490318674545634728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/5490318674545634728' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/5490318674545634728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/5490318674545634728'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2010/11/word-buzz-to-support-game-center.html' title='Word Buzz to support Game Center'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghZf-LPa7Mmstui4oPo0_DNtQdEgUncA1i_AL9fpugYwVOrQWahjKawiOVFqbAq07siUS58EQkJBEkPIeZ3tWoHN6XKpxA5s2Z3NK9bpY_W7EL1ZYDPTbnogmavykwwWoLpLYD/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-6152988939632488410</id><published>2010-11-22T17:10:00.001+01:00</published><updated>2010-11-22T17:12:07.387+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="ipod"/><category scheme="http://www.blogger.com/atom/ns#" term="karlsruhe"/><category scheme="http://www.blogger.com/atom/ns#" term="mac"/><category scheme="http://www.blogger.com/atom/ns#" term="objective-c"/><category scheme="http://www.blogger.com/atom/ns#" term="wordbuzz"/><title type='text'>Game Center Presentation at Cocoa Heads Karlsruhe</title><content type='html'>&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbP5H6G73rteWXnpGOxgwD-ycaRsE5bwps7PBkFmuwNHtTpQ4mKKRmlECGKbPEwLLbp6uDbLVChgF1h2dlQYG4Wf8j-o7Lw3T11ZLl3Sa8DJrFsdO_ZEDxMRlTheSUHbvOlmsz/?imgmax=800&quot; alt=&quot;hero-gamecenter.png&quot; border=&quot;0&quot; width=&quot;114&quot; height=&quot;114&quot; style=&quot;float:left;padding-right:10px;&quot; /&gt;On Wednesday, I&#39;ll be giving a presentation on Apple&#39;s &lt;a href=&quot;http://www.apple.com/game-center/&quot;&gt;Game Center&lt;/a&gt; at the local &lt;a href=&quot;http://twitter.com/cocoaheads_ka/status/6628243050336256&quot;&gt;CocoaHeads&lt;/a&gt; Group, here in Karlsruhe. 
&lt;br/&gt;&lt;br/&gt;
Game Center is Apple&#39;s social gaming network, that lets you invite friends to play, share your highscore and achievements through leaderboards and it even auto-matches you with other players for online-multiplayer games.
&lt;br/&gt;&lt;br/&gt;
If you are interested in Game Center, drop by &lt;a href=&quot;http://retrogames.info/&quot;&gt;RetroGames&lt;/a&gt; on &lt;a href=&quot;http://groups.google.com/group/cocoaheads-karlsruhe/t/2d0a42fee498f4bc&quot;&gt;Wednesday 24th of November at 19:00&lt;/a&gt;. </content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/6152988939632488410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/6152988939632488410' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/6152988939632488410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/6152988939632488410'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2010/11/game-center-presentation-at-cocoa-heads.html' title='Game Center Presentation at Cocoa Heads Karlsruhe'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbP5H6G73rteWXnpGOxgwD-ycaRsE5bwps7PBkFmuwNHtTpQ4mKKRmlECGKbPEwLLbp6uDbLVChgF1h2dlQYG4Wf8j-o7Lw3T11ZLl3Sa8DJrFsdO_ZEDxMRlTheSUHbvOlmsz/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-6801485193299688608</id><published>2010-11-15T17:10:00.000+01:00</published><updated>2010-11-15T17:10:00.880+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="ipod"/><category scheme="http://www.blogger.com/atom/ns#" term="objective-c"/><category scheme="http://www.blogger.com/atom/ns#" term="wordbuzz"/><title type='text'>Universal App - Word Buzz goes iPhone/iPod touch</title><content type='html'>&lt;a href=&quot;http://itunes.apple.com/app/word-buzz/id388372038?mt=8&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghZf-LPa7Mmstui4oPo0_DNtQdEgUncA1i_AL9fpugYwVOrQWahjKawiOVFqbAq07siUS58EQkJBEkPIeZ3tWoHN6XKpxA5s2Z3NK9bpY_W7EL1ZYDPTbnogmavykwwWoLpLYD/?imgmax=800&quot; alt=&quot;114x114.png&quot; border=&quot;0&quot; width=&quot;114&quot; height=&quot;114&quot; style=&quot;float:left;padding-right:10px;&quot; /&gt;&lt;/a&gt; We have been working on bringing &lt;a href=&quot;http://furryfishApps.com/wordbuzz&quot;&gt;Word Buzz&lt;/a&gt; to iPhone and iPod touch for more than a month now. We started out with an iPad only version, because in the beginning we thought the concept of Word Buzz wouldn&#39;t work on a smaller device. After a none-stop coding weekend and a heavy testing session, we knew it would work and started hacking on iPhone and iPod touch support. &lt;br /&gt;&lt;br /&gt;We decided to build a universal App, because of pervasive Game Center support and a unique selling point! The latter is a no brainer: you are willing to spend a couple more bugs, if you get an iPad version for free. The former is a technical limitation of Game Center. You can only hook up your leaderboards and achievements with one App Id. &lt;br /&gt;&lt;br /&gt;Although it was easy enough to port Word Buzz to iPhone and iPod touch, we ran into a couple of pitfalls and one of them is worth sharing with you: the default device of your universal App! What does that mean? Well, if you want to have different &lt;em&gt;xib&lt;/em&gt; files in your App for iPhone and iPad, you need to qualify them with a suffix &lt;em&gt;-iPhone / -iPad&lt;/em&gt;. In your &lt;em&gt;Info.plist&lt;/em&gt;, you configure your alternate main &lt;em&gt;xib&lt;/em&gt; with &lt;em&gt;NSMainNibFile~iphone / NSMainNibFile~ipad&lt;/em&gt;. Since we started out with an iPad App, we decided to make iPad the default, meaning my alternate main &lt;em&gt;xib&lt;/em&gt; configuration in Info.plist was &lt;em&gt;NSMainNibFile~iphone&lt;/em&gt; and point to &lt;em&gt;MainWindow-iPhone.xib&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;This works great for iPhone and iPads, but it doesn&#39;t work for iPod touches and it also doesn&#39;t work with iOS 3.x. Somehow iPod touches (even with iOS 4) and iPhones with iOS 3.x don&#39;t respect the &lt;em&gt;NSMainNibFile~iphone&lt;/em&gt; configuration in &lt;em&gt;Info.plist&lt;/em&gt;. They always use the &lt;em&gt;NSMainNibFile&lt;/em&gt; config without any suffix. &lt;br /&gt;&lt;br /&gt;We only found out about this after testing on an actual device, which shows how important testing on each and every device is. We decided to make iPhone / iPod touch devices the default and qualify every iPad resource with &lt;em&gt;-iPad&lt;/em&gt;, just like Apple actually intended it to be done. &lt;br /&gt;&lt;br /&gt;Word Buzz for iPad is available on the &lt;a href=&quot;http://itunes.apple.com/app/word-buzz/id388372038?mt=8&quot;&gt;App Store&lt;/a&gt;, the iPhone / iPod touch version is coming in a couple of days as a free update. Let us know what you think about it in the comments or on &lt;a href=&quot;http://twitter.com/WordBuzzApp&quot;&gt;Twitter&lt;/a&gt;. </content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/6801485193299688608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/6801485193299688608' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/6801485193299688608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/6801485193299688608'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2010/11/universal-app-word-buzz-goes-iphoneipod.html' title='Universal App - Word Buzz goes iPhone/iPod touch'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghZf-LPa7Mmstui4oPo0_DNtQdEgUncA1i_AL9fpugYwVOrQWahjKawiOVFqbAq07siUS58EQkJBEkPIeZ3tWoHN6XKpxA5s2Z3NK9bpY_W7EL1ZYDPTbnogmavykwwWoLpLYD/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-1416515902734565989</id><published>2010-11-06T08:48:00.001+01:00</published><updated>2010-11-06T08:48:34.136+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="twitter"/><category scheme="http://www.blogger.com/atom/ns#" term="wordbuzz"/><title type='text'>Word Buzz getting a better Twitter integration!</title><content type='html'>&lt;a href=&quot;http://itunes.apple.com/app/word-buzz/id388372038?mt=8&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghZf-LPa7Mmstui4oPo0_DNtQdEgUncA1i_AL9fpugYwVOrQWahjKawiOVFqbAq07siUS58EQkJBEkPIeZ3tWoHN6XKpxA5s2Z3NK9bpY_W7EL1ZYDPTbnogmavykwwWoLpLYD/?imgmax=800&quot; alt=&quot;114x114.png&quot; border=&quot;0&quot; width=&quot;114&quot; height=&quot;114&quot; style=&quot;float:left;padding-right:10px;&quot; /&gt;&lt;/a&gt;If you follow our &lt;a href=&quot;http://twitter.com/furryfishApps&quot;&gt;tweets&lt;/a&gt;, which you should, you might have &lt;a href=&quot;http://twitter.com/furryfishApps/status/29370826939&quot;&gt;seen&lt;/a&gt; that we have been working hard on a better Twitter integration for &lt;a href=&quot;http://furryfishApps.com/wordbuzz&quot;&gt;Word Buzz&lt;/a&gt;. When looking around on github, I found a &lt;a href=&quot;https://github.com/mattgemmell/MGTwitterEngine&quot;&gt;lot&lt;/a&gt; of &lt;a href=&quot;https://github.com/bengottlieb/Twitter-OAuth-iPhone&quot;&gt;frameworks&lt;/a&gt; for Twitter and iOS, but only &lt;a href=&quot;http://github.com/st3fan/iphone-twitter&quot;&gt;Stefan&#39;s&lt;/a&gt; was lightweight and easy enough to integrate it into Word Buzz.&lt;br /&gt;&lt;br /&gt;Most of the frameworks are full blown Twitter engines, which is not what we need for Word Buzz. Our requirements are simple: share your achievements (maybe your highscore in the future) with your followers. In addition to that, Twitter is our support channel. We wanted to allow posting public messages to &lt;a href=&quot;https://twitter.com/WordBuzzApp&quot;&gt;@WordBuzzApp&lt;/a&gt; from within the App. Sounds easy, right? No need to pull in a full fledged Twitter engine for that!&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg89zd5mN9x5c2R8DmrYk589cJiN6yZJTMo4RWvZNAN0LSspMJvx1JNqezxHYUHU9aUczQRVNB5zDnNaEAKW-c3B-Y2q4mBGJAhpEcZKhthcyK-LXZVtXOBjRZWZu2XVaHm_JCd/?imgmax=800&quot; alt=&quot;iphone-twitter.png&quot; border=&quot;0&quot; width=&quot;184&quot; height=&quot;358&quot; style=&quot;float:right;padding:5px;&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Stefan&#39;s provides an API, which is really easy to use and integrate. There are no 3rd party dependencies, no need to fiddle with your &lt;a href=&quot;http://dlinsin.blogspot.com/2010/05/don-forget-your-linker-flags.html&quot;&gt;linker flags&lt;/a&gt; - just an API to use! It even comes with a reasonable UI in Twitter style colors. Unfortunately, there was no iPad UI, which we had to implement myself. However, it was easy enough to come up with a Xib for iPad. Stefan&#39;s API provides delegate protocols, which you can implement to handle events such as &quot;authentication succeeded&quot;. This way it&#39;s easy to separate the Twitter logic from your own code. The UIViewControllers provided, handle the most basic tasks like checking if you entered enough information to process with authentication.&lt;br /&gt;&lt;br /&gt;We are using xAuth for authentication, which Twitter has to enable for your App. It took a couple of days until they came around to let us in, but it was the best solutions. Stefan&#39;s API provides xAuth out of the box and it works seamlessly. We added a Keychain integration to save your credentials and a flag in Settings.app to reset them. &lt;br /&gt;&lt;br /&gt;Overall, it took us about 1 days to natively integrate Twitter into &lt;a href=&quot;http://furryfishApps.com/wordbuzz&quot;&gt;Word Buzz&lt;/a&gt; - thanks to Stefan&#39;s API! If anybody is interested, we are happy to provide the iPad UI and the Keychain integration.</content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/1416515902734565989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/1416515902734565989' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/1416515902734565989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/1416515902734565989'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2010/11/word-buzz-getting-better-twitter.html' title='Word Buzz getting a better Twitter integration!'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghZf-LPa7Mmstui4oPo0_DNtQdEgUncA1i_AL9fpugYwVOrQWahjKawiOVFqbAq07siUS58EQkJBEkPIeZ3tWoHN6XKpxA5s2Z3NK9bpY_W7EL1ZYDPTbnogmavykwwWoLpLYD/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-9013621125989168712</id><published>2010-10-28T21:47:00.000+02:00</published><updated>2010-10-28T21:52:45.798+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="mobile"/><category scheme="http://www.blogger.com/atom/ns#" term="wordbuzz"/><title type='text'>What&amp;#39;s new?</title><content type='html'>For the past couple of weeks it has been rather quiet here on my blog and there&#39;s a reason for that, as you can imagine. &lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvDANGZJn6gofwHF2TRlNxdEXMFuBSCF4bFpyb4Hw0bUGemeIn-QeURvIYc952-NkpkcKmPtKgFSZ1aEoMXY9eWOKbhaQGoIFimy6jmSFO5OmSaSGYHcS0wsqKcMBWaCFw2Byc/?imgmax=800&quot; alt=&quot;furryfishApps.png&quot; border=&quot;0&quot; width=&quot;249&quot; height=&quot;63&quot; style=&quot;float:left;padding:10px;&quot; /&gt;First of all, I&#39;d like to announce our new company &lt;a href=&quot;http://furryfishApps.com&quot;&gt;furryfishApps&lt;/a&gt;, which I&#39;ve co-founded with my &lt;a href=&quot;http://ipublicity.com&quot;&gt;wife&lt;/a&gt; Sutini. My future private endeavors in terms of iOS development will all take place under the hood of furryfishApps. Sutini is in charge of all the marketing, social media and publicity tasks, which are so important, but we developers never have time for. I&#39;m glad to have her on board! &lt;br /&gt;&lt;br /&gt;We are still in the midst of figuring out what to put on our website, but we already have an awesome logo and you can follow us on &lt;a href=&quot;http://twitter.com/furryfishApps&quot;&gt;Twitter&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghZf-LPa7Mmstui4oPo0_DNtQdEgUncA1i_AL9fpugYwVOrQWahjKawiOVFqbAq07siUS58EQkJBEkPIeZ3tWoHN6XKpxA5s2Z3NK9bpY_W7EL1ZYDPTbnogmavykwwWoLpLYD/?imgmax=800&quot; alt=&quot;114x114.png&quot; border=&quot;0&quot; width=&quot;114&quot; height=&quot;114&quot; style=&quot;float:right;&quot; /&gt;&lt;br /&gt;Our first App is a fast and engaging spelling game called &lt;a href=&quot;http://furryfishapps.com/wordbuzz/&quot;&gt;Word Buzz&lt;/a&gt;! It&#39;s your job to spell a bunch of words as fast as possible, without making any mistake. You&#39;ll be scored on how fast you can spell and there are a whole lot of achievements for you to unlock. Go grab it here on the &lt;a href=&quot;http://itunes.apple.com/app/word-buzz/id388372038?mt=8&quot;&gt;App Store&lt;/a&gt;. We welcome any feedback on &lt;a href=&quot;http://twitter.com/WordBuzzApp&quot;&gt;Twitter&lt;/a&gt; or &lt;a href=&quot;mailto:wordbuzz[AT]furryfishapps.com&quot;&gt;Email&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Word Buzz is iPad only at the moment, but an iPod/iPhone version with Game Center support is &lt;a href=&quot;http://twitter.com/WordBuzzApp/status/27250806573&quot;&gt;underway&lt;/a&gt;. I&#39;ll have some posts coming up soon on how the development of Word Buzz came along. It was a pretty exciting ride, as you can imagine. &lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/9013621125989168712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/9013621125989168712' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/9013621125989168712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/9013621125989168712'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2010/10/what-new.html' title='What&amp;#39;s new?'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvDANGZJn6gofwHF2TRlNxdEXMFuBSCF4bFpyb4Hw0bUGemeIn-QeURvIYc952-NkpkcKmPtKgFSZ1aEoMXY9eWOKbhaQGoIFimy6jmSFO5OmSaSGYHcS0wsqKcMBWaCFw2Byc/s72-c?imgmax=800" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-5234527914903556848</id><published>2010-09-22T07:00:00.000+02:00</published><updated>2010-09-22T07:05:11.189+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="ipod"/><category scheme="http://www.blogger.com/atom/ns#" term="objective-c"/><title type='text'>APN Device Tokens</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://mobile.synyx.de&quot;&gt;&lt;img style=&quot;float:left;margin:0 10px 10px 0;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5m2OEf_3ehyOodYTzyOve5bsUChzXgc6E3aqWriAIQBC1roA6B7kRyLw-_ktEr99DnlJGQYJP74_Du1C0wEPr9_RC3dqoyT3HqsIuTJV-zVHA-OGqq7epld1Ml9Yw8E5GeJ9x/s144/logo_mobile_RGB_300px.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;&quot; /&gt;&lt;/a&gt;&lt;em&gt;I&#39;m writing for the &lt;a href=&quot;http://www.synyx.de&quot;&gt;Synyx GmbH &amp; Co. KG&lt;/a&gt; mobile solutions blog. From time to time, I&#39;ll cross post articles here, if I think they are of interest for you. If you&#39;d like to read all of my other posts, subscribe to the &lt;a href=&quot;http://mobile.synyx.de&quot;&gt;Synyx Mobile Solutions Blog&lt;/a&gt;.&lt;/em&gt;&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;When you enable Apple Push Notifications (APN) for your App, your device generates a unique device token and pass it to the &lt;em&gt;didRegisterForRemoteNotificationsWithDeviceToken&lt;/em&gt; method in your App delegate. Usually, you&#39;ll hand the token to &lt;a href=&quot;http://mobile.synyx.de/2010/07/sending-apple-push-notifications-with-notnoops-java-apns-library/&quot;&gt;your server&lt;/a&gt; in order for it to push notifications to your device. &lt;br /&gt;&lt;br /&gt;There are &lt;a href=&quot;http://stackoverflow.com/questions/1943722/iphone-apns-device-tokens-in-sandbox-vs-production/2261758#2261758&quot;&gt;different tokens&lt;/a&gt; for production and sandbox, depending on which provisioning profile you build/sign your App with. One &lt;a href=&quot;http://dlinsin.blogspot.com/2010/07/push-notifications-in-production.html&quot;&gt;more gotcha&lt;/a&gt;, you need to be aware of when it comes to those device tokens: &lt;strong&gt;don&#39;t mix production and sandbox tokens&lt;/strong&gt;!  &lt;br /&gt;&lt;br /&gt;If you try to send a push notification to the production servers, using a device token meant for the sandbox, Apple&#39;s servers totally block all other notification, which you are trying to send with the same connection. If you have a scheduled  push notification like we do with &quot;I think I spider&quot;, one wrong device token ruins the fun for everyone!&lt;br /&gt;&lt;br /&gt;We decided to separate our production and test environment and use &lt;a href=&quot;http://dlinsin.blogspot.com/2010/08/testing-apps-with-in-app-purchases-in.html&quot;&gt;preprocessor conditional inclusion&lt;/a&gt; to point to different urls in our App. Unfortunately, we had to learn the hard way how tedious this gotcha can be to track down!&lt;br /&gt;&lt;br /&gt;&lt;small&gt;Supported by:&lt;br/&gt;Sherweb - &lt;a href=&quot;http://www.sherweb.com/hosted-exchange&quot;&gt;Hosted Exchange Hosting&lt;/a&gt;&lt;br/&gt;Vircom - &lt;a href=&quot;http://www.vircom.com/&quot;&gt;Email Security Software&lt;/a&gt;&lt;/small&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/5234527914903556848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/5234527914903556848' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/5234527914903556848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/5234527914903556848'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2010/09/apn-device-tokens.html' title='APN Device Tokens'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5m2OEf_3ehyOodYTzyOve5bsUChzXgc6E3aqWriAIQBC1roA6B7kRyLw-_ktEr99DnlJGQYJP74_Du1C0wEPr9_RC3dqoyT3HqsIuTJV-zVHA-OGqq7epld1Ml9Yw8E5GeJ9x/s72-c/logo_mobile_RGB_300px.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-8104474252871907974</id><published>2010-09-14T07:32:00.001+02:00</published><updated>2010-09-14T07:34:43.360+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="fun"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="ipod"/><title type='text'>I think I Spider</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://mobile.synyx.de&quot;&gt;&lt;img style=&quot;float:left;margin:0 10px 10px 0;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5m2OEf_3ehyOodYTzyOve5bsUChzXgc6E3aqWriAIQBC1roA6B7kRyLw-_ktEr99DnlJGQYJP74_Du1C0wEPr9_RC3dqoyT3HqsIuTJV-zVHA-OGqq7epld1Ml9Yw8E5GeJ9x/s144/logo_mobile_RGB_300px.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;&quot; /&gt;&lt;/a&gt;&lt;em&gt;I&#39;m writing for the &lt;a href=&quot;http://www.synyx.de&quot;&gt;Synyx GmbH &amp; Co. KG&lt;/a&gt; mobile solutions blog. From time to time, I&#39;ll cross post articles here, if I think they are of interest for you. If you&#39;d like to read all of my other posts, subscribe to the &lt;a href=&quot;http://mobile.synyx.de&quot;&gt;Synyx Mobile Solutions Blog&lt;/a&gt;.&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href=&quot;http://itunes.apple.com/de/app/i-think-i-spider/id390639989?mt=8&quot;&gt;&lt;img src=&quot;http://mobile.synyx.de/wp-content/uploads/2010/09/app-icon-512px.png&quot; alt=&quot;I Think I Spider&quot; border=&quot;0&quot; width=&quot;128&quot; height=&quot;128&quot; style=&quot;float:left;padding-right:5px&quot; /&gt;&lt;/a&gt;I&#39;m proud to present, that our first own App has made it to the &lt;a href=&quot;http://itunes.apple.com/de/app/i-think-i-spider/id390639989?mt=8&quot;&gt;App Store&lt;/a&gt; last week. It&#39;s a beautiful mobile interface to the web site &lt;a href=&quot;http://ithinkispider.com&quot;&gt;http://ithinkispider.com&lt;/a&gt;. You can find out more over at the &lt;a href=&quot;http://mobile.synyx.de/2010/09/i-think-i-spider-1-0-released/&quot;&gt;Synyx Mobile Solutions Blog&lt;/a&gt;, or just hit the App icon and download it for free from the App Store! &lt;br /&gt;&lt;br /&gt;My lovely mister singing club!</content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/8104474252871907974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/8104474252871907974' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/8104474252871907974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/8104474252871907974'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2010/09/i-think-i-spider.html' title='I think I Spider'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5m2OEf_3ehyOodYTzyOve5bsUChzXgc6E3aqWriAIQBC1roA6B7kRyLw-_ktEr99DnlJGQYJP74_Du1C0wEPr9_RC3dqoyT3HqsIuTJV-zVHA-OGqq7epld1Ml9Yw8E5GeJ9x/s72-c/logo_mobile_RGB_300px.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-5671217135163635765</id><published>2010-08-31T07:29:00.001+02:00</published><updated>2010-09-03T09:57:36.796+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="ipod"/><category scheme="http://www.blogger.com/atom/ns#" term="mobile"/><title type='text'>Testing Apps with In App Purchases in Simulator</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://mobile.synyx.de&quot;&gt;&lt;img style=&quot;float:left;margin:0 10px 10px 0;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5m2OEf_3ehyOodYTzyOve5bsUChzXgc6E3aqWriAIQBC1roA6B7kRyLw-_ktEr99DnlJGQYJP74_Du1C0wEPr9_RC3dqoyT3HqsIuTJV-zVHA-OGqq7epld1Ml9Yw8E5GeJ9x/s144/logo_mobile_RGB_300px.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;&quot; /&gt;&lt;/a&gt;&lt;em&gt;I&#39;m writing for the &lt;a href=&quot;http://www.synyx.de&quot;&gt;Synyx GmbH &amp; Co. KG&lt;/a&gt; mobile solutions blog. From time to time, I&#39;ll cross post articles here, if I think they are of interest for you. If you&#39;d like to read all of my other posts, subscribe to the &lt;a href=&quot;http://mobile.synyx.de&quot;&gt;Synyx Mobile Solutions Blog&lt;/a&gt;.&lt;/em&gt;&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;If you add a store to your app and use &lt;a href=&quot;http://developer.apple.com/iphone/library/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008267-CH1-SW1&quot;&gt;In App Purchases&lt;/a&gt; to collect your payments, there are a couple of limitations your have to live with. One of those limitations is &lt;a href=&quot;http://developer.apple.com/iphone/library/documentation/NetworkingInternet/Conceptual/StoreKitGuide/DevelopingwithStoreKit/DevelopingwithStoreKit.html#//apple_ref/doc/uid/TP40008267-CH103-SW1&quot;&gt;not being able to fully test your App in the iPhone Simulator&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Store Kit does not operate in iPhone Simulator. When running your application in iPhone Simulator, Store Kit logs a warning if your application attempts to retrieve the payment queue. Testing the store must be done on actual devices.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Although, there is not way to test Store Kit itself, you can still test the parts of your App that use and build on the information retrieved from Store Kit. You can use a &lt;a href=&quot;http://en.wikipedia.org/wiki/C_preprocessor#Macro_definition_and_expansion&quot;&gt;preprocessor conditional inclusion&lt;/a&gt; to determine, whether you are running on the simulator and then &quot;mock&quot; the Store Kit calls or don&#39;t execute them at all.&lt;br /&gt;&lt;br /&gt;&lt;script src=&quot;http://gist.github.com/553246.js?file=gistfile1.m&quot;&gt;&lt;/script&gt;&lt;noscript&gt;&lt;pre&gt;#if TARGET_IPHONE_SIMULATOR&lt;br /&gt;  // mock product description		&lt;br /&gt;#else&lt;br /&gt;  SKProductsRequest *productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIds];&lt;br /&gt;  productRequest.delegate = self;&lt;br /&gt;  [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;&lt;br /&gt;  [productRequest start];		&lt;br /&gt;#endif&lt;/pre&gt;&lt;/noscript&gt;&lt;br /&gt;&lt;br /&gt;Keep in mind: this might not work for your App, however, it did work for my Apps and it&#39;s better than not testing your code at all. The optimal solution would definitely be to connect to the In App Purchase Sandbox environment from the Simulator. </content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/5671217135163635765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/5671217135163635765' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/5671217135163635765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/5671217135163635765'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2010/08/testing-apps-with-in-app-purchases-in.html' title='Testing Apps with In App Purchases in Simulator'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5m2OEf_3ehyOodYTzyOve5bsUChzXgc6E3aqWriAIQBC1roA6B7kRyLw-_ktEr99DnlJGQYJP74_Du1C0wEPr9_RC3dqoyT3HqsIuTJV-zVHA-OGqq7epld1Ml9Yw8E5GeJ9x/s72-c/logo_mobile_RGB_300px.png" height="72" width="72"/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-17320980584213312</id><published>2010-08-12T06:56:00.001+02:00</published><updated>2010-08-12T06:56:24.090+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="objective-c"/><title type='text'>Private Properties in Objective-C</title><content type='html'>When a co-worker asked me if there&#39;s a way to declare a Objective-C property to be private, I could come up with an answer. Even after googling for a while, I couldn&#39;t find an example, easy enough to understand. Every time I have to search for something more than a couple of minutes and I can&#39;t find a &lt;a href=&quot;http://stackoverflow.com/questions/1408350/is-it-bad-to-use-properties-for-private-variables-just-for-the-memory-manageme&quot;&gt;definite source&lt;/a&gt; for an answer, I think it&#39;s worth a blog post. &lt;br /&gt;&lt;br /&gt;Declaring a private property is easy, once you understood the &lt;a href=&quot;https://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocCategories.html#//apple_ref/doc/uid/TP30001163-CH20-SW2&quot;&gt;concept&lt;/a&gt; of &lt;em&gt;Categories&lt;/em&gt; and &lt;em&gt;Extensions&lt;/em&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;A category can add methods to any class, including the root class. Methods added to NSObject become available to all classes that are linked to your code.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Maybe you&#39;ve used this before to enhance the functionality of a framework class. I&#39;ve used it e.g. to add a shuffle method to &lt;em&gt;NSArray&lt;/em&gt;. &lt;em&gt;Extensions&lt;/em&gt; take the concept of a &lt;em&gt;category&lt;/em&gt; one step further:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Class extensions are like “anonymous” categories, except that the methods they declare must be implemented in the main @implementation block for the corresponding class.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;With an extension, you can easily implement private property declarations:&lt;br /&gt;&lt;br /&gt;&lt;script src=&quot;http://gist.github.com/518655.js&quot;&gt;&lt;/script&gt;&lt;noscript&gt;&lt;pre&gt;// Person.h&lt;br /&gt;&lt;br /&gt;@interface Person {&lt;br /&gt; NSString *name;&lt;br /&gt; @private&lt;br /&gt; NSNumber *age;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@property (retain) NSString *name;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;// Person.m&lt;br /&gt;&lt;br /&gt;#import &quot;Person.h&quot;&lt;br /&gt;&lt;br /&gt;// class extension&lt;br /&gt;@interface Person () {&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt; @property (retain) NSNumber *age;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@implementation&lt;br /&gt;&lt;br /&gt;@synthesize name,age;&lt;br /&gt;&lt;br /&gt;// other stuff&lt;br /&gt;&lt;br /&gt;@end&lt;/pre&gt;&lt;/noscript&gt;&lt;br /&gt;&lt;br /&gt;The &lt;em&gt;@private&lt;/em&gt; declaration takes care of protecting the instance variable age, only the Person implementation is allowed to access it. The class &lt;em&gt;extension&lt;/em&gt; in Person.m declares the &lt;em&gt;property&lt;/em&gt; and it&#39;s being &lt;em&gt;synthesized&lt;/em&gt; just the way you would with a public &lt;em&gt;property&lt;/em&gt;. &lt;br /&gt;&lt;br /&gt;Due to the anonymous nature of the class &lt;em&gt;extension&lt;/em&gt;, nobody including the Person.h file can see the &lt;em&gt;synthesized&lt;/em&gt; getters and setters, hence a private &lt;em&gt;property&lt;/em&gt;.&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/17320980584213312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/17320980584213312' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/17320980584213312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/17320980584213312'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2010/08/private-properties-in-objective-c.html' title='Private Properties in Objective-C'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-6065680816213900468</id><published>2010-08-06T09:52:00.001+02:00</published><updated>2010-08-06T09:56:24.721+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="objective-c"/><title type='text'>Improve your dealloc method</title><content type='html'>If you are programming for any iOS device, chances are high, you&#39;ve came across &lt;em&gt;properties&lt;/em&gt;. They give you these tedious accessor methods for free and in addition to that some nice memory management features. &lt;br /&gt;&lt;br /&gt;While explaining a colleague how to implement &lt;em&gt;dealloc&lt;/em&gt;, he pointed me to the excellent &lt;a href=&quot;http://cocoadevcentral.com/d/learn_objectivec/&quot;&gt;Objective-C guide &lt;/a&gt;of &lt;a href=&quot;http://cocoadevcentral.com&quot;&gt;Cocoa Dev Central.&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;script src=&quot;http://gist.github.com/511002.js&quot;&gt;&lt;/script&gt;&lt;noscript&gt;&lt;pre&gt;// Person.h&lt;br /&gt;&lt;br /&gt;@interface Person {&lt;br /&gt; NSString *name;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@property (retain) NSString *name;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;// Person.m&lt;br /&gt;&lt;br /&gt;#import &quot;Person.h&quot;&lt;br /&gt;&lt;br /&gt;@implementation&lt;br /&gt;&lt;br /&gt;@synthesize name;&lt;br /&gt;&lt;br /&gt;// other stuff&lt;br /&gt;&lt;br /&gt;- (void) dealloc {&lt;br /&gt;    [name release];&lt;br /&gt;    name = nil;&lt;br /&gt;    [super dealloc];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@end&lt;/pre&gt;&lt;/noscript&gt;You can see a pretty straightforward implementation of an Objective-C class there, with an implementation of &lt;em&gt;dealloc&lt;/em&gt;, the way you are used to. However, since we have synthesized getters and setters, we can simply write the following:&lt;br /&gt;&lt;br /&gt;&lt;script src=&quot;http://gist.github.com/511003.js&quot;&gt;&lt;/script&gt;&lt;noscript&gt;&lt;pre&gt;- (void) dealloc {&lt;br /&gt;    self.name = nil;&lt;br /&gt;    [super dealloc];&lt;br /&gt;}&lt;/pre&gt;&lt;/noscript&gt;Basically, the implementation of the accessor at runtime handle memory management for us here, which I think is pretty neat. &lt;br /&gt; </content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/6065680816213900468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/6065680816213900468' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/6065680816213900468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/6065680816213900468'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2010/08/improve-your-dealloc-method.html' title='Improve your dealloc method'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-4871584553496424221</id><published>2010-07-19T06:10:00.000+02:00</published><updated>2010-07-19T06:16:53.962+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="gae"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="ipod"/><title type='text'>Apple Push Notifications on Google Appengine</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://doublemill.blogspot.com&quot;&gt;&lt;img style=&quot;float:left;margin:0 10px 10px 0;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik5KOTzJrAmRx6FJfZTtu0uzRfpmaWgv2PMwNn_HRABbe6prGI-ncdFFrCKMUwbID7wnP-aLbGwKnmlNKl1yDi1y_1_jxjgZjVqPp2tPC3cRwmtyOq3FLD4G235GdLTw4FCK1s/?imgmax=144&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5191388009271083842&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;Last year, I worked on a Nine Men&#39;s Morris (Mühle) implementation for Android, called &lt;a href=&quot;http://doublemill.blogspot.com/&quot;&gt;Doublemill&lt;/a&gt;. Since I&#39;m an iPhone user, I decided to port the game to iPhone/iPod touch and the iPad. There are 3 versions: &lt;a href=&quot;http://itunes.apple.com/app/doublemill/id368886888?mt=8&quot;&gt;Doublemill Premium&lt;/a&gt;, &lt;a href=&quot;http://itunes.apple.com/de/app/doublemill-lite/id362714027?mt=8&quot;&gt;Doublemill Lite&lt;/a&gt; and &lt;a href=&quot;http://itunes.apple.com/app/doublemill-for-ipad/id370791547?mt=8&quot;&gt;Doublemill for iPad&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I&#39;ve written about the &lt;a href=&quot;http://dlinsin.blogspot.com/search/label/gae&quot;&gt;Google Appengine (GAE)&lt;/a&gt; a couple of times before and the same goes for &lt;a href=&quot;http://dlinsin.blogspot.com/2010/05/apple-push-notifications-gotchas.html&quot;&gt;Apple Push Notifications (APN)&lt;/a&gt;. For Doublemill I had to bring those two technologies together and it was a pain and pleasure at the same time.&lt;br /&gt;&lt;br /&gt;Let me start with &lt;a href=&quot;http://dlinsin.blogspot.com/2010/07/push-notifications-in-production.html&quot;&gt;the pain&lt;/a&gt;! Apples Push Notifications in a restricted environment like the Google Appengine is no fun to implement! My first approach was to use &lt;a href=&quot;http://github.com/notnoop/java-apns&quot;&gt;notnoop&#39;s java-apn&lt;/a&gt;, which I&#39;ve used before and works quite well. Unfortunately, there is &lt;a href=&quot;http://code.google.com/p/googleappengine/issues/detail?id=792&amp;colspec=ID%20Type%20Status%20Priority%20Stars%20Owner%20Summary%20Log%20Component&quot;&gt;currently no way&lt;/a&gt; of using a client certificate, which you&#39;ll need in order to talk to Apple&#39;s server on the Google Appengine. There are some &lt;em&gt;javax.security&lt;/em&gt; classes missing on GAE.&lt;br /&gt;&lt;br /&gt;That&#39;s where the pleasure part begins! Thanks to &lt;a href=&quot;http://urbanairship.com/&quot;&gt;Urban Airship&lt;/a&gt;, it&#39;s easy to hook up your application running on Google Appengine to Apple&#39;s Push Notifications! And the best part - it&#39;s free (although not unlimited)! Urban Airshipe provides an &lt;a href=&quot;http://urbanairship.com/docs/push_index.html&quot;&gt;easy to use REST interface&lt;/a&gt;, which you can call from your Java code on GAE with a good old &lt;em&gt;HttpURLConnection&lt;/em&gt;. It uses Basic Auth over Https to ensure that only your application can send Push Notifications to your iPhone App.&lt;br /&gt;&lt;br /&gt;I won&#39;t provide any code for you here, because it&#39;s the basic concept that&#39;s the most interesting part when bringing APN to GAE. The first thing you need to do, is store your user&#39;s deviceToken. You should do that each time the App launches, to ensure it&#39;s the correct token. That token, along with the information you want to present to your user, needs to be passed to Urban Airship&#39;s REST interface, everytime you want to send a notification. A Cron Job or Task on Google Appengine could handle that for you. &lt;br /&gt;&lt;br /&gt;If your application is designed with notifications in mind, then it&#39;s quite easy to bring Apple Push Notifications to the Google Appengine, thanks to Urban Airship!&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/4871584553496424221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/4871584553496424221' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/4871584553496424221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/4871584553496424221'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2010/07/apple-push-notifications-on-google.html' title='Apple Push Notifications on Google Appengine'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik5KOTzJrAmRx6FJfZTtu0uzRfpmaWgv2PMwNn_HRABbe6prGI-ncdFFrCKMUwbID7wnP-aLbGwKnmlNKl1yDi1y_1_jxjgZjVqPp2tPC3cRwmtyOq3FLD4G235GdLTw4FCK1s/s72-c?imgmax=144" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-2481283744772349161</id><published>2010-07-06T06:08:00.000+02:00</published><updated>2010-07-06T06:13:35.808+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="ipod"/><category scheme="http://www.blogger.com/atom/ns#" term="mobile"/><title type='text'>Push Notifications in Production</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://doublemill.blogspot.com&quot;&gt;&lt;img style=&quot;float:left;margin:0 10px 10px 0;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik5KOTzJrAmRx6FJfZTtu0uzRfpmaWgv2PMwNn_HRABbe6prGI-ncdFFrCKMUwbID7wnP-aLbGwKnmlNKl1yDi1y_1_jxjgZjVqPp2tPC3cRwmtyOq3FLD4G235GdLTw4FCK1s/?imgmax=144&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5191388009271083842&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;Last year, I worked on a Nine Men&#39;s Morris (Mühle) implementation for Android, called &lt;a href=&quot;http://doublemill.blogspot.com/&quot;&gt;Doublemill&lt;/a&gt;. Since I&#39;m an iPhone user, I decided to port the game to iPhone/iPod touch and the iPad. There are 3 versions: &lt;a href=&quot;http://itunes.apple.com/app/doublemill/id368886888?mt=8&quot;&gt;Doublemill Premium&lt;/a&gt;, &lt;a href=&quot;http://itunes.apple.com/de/app/doublemill-lite/id362714027?mt=8&quot;&gt;Doublemill Lite&lt;/a&gt; and &lt;a href=&quot;http://itunes.apple.com/app/doublemill-for-ipad/id370791547?mt=8&quot;&gt;Doublemill for iPad&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In a &lt;a href=&quot;http://dlinsin.blogspot.com/2010/05/apple-push-notifications-gotchas.html&quot;&gt;previous blog post&lt;/a&gt; I highlighted a couple of gotchas you need to be aware of when implementing Apple Push Notifications. Unfortunately, I didn&#39;t really pay attention to one of them myself:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The first problem I ran into, had to do with my provisioning profile for development. I enabled APN in my Provisioning Portal, installed the certificate and implemented all the delegate methods according to the documentation, but somehow the method&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;was called with error code 3000 - &quot;no valid &#39;aps-environment&#39; entitlement string found for application&quot;. I was pretty sure, I setup everything correctly. However, &lt;a href=&quot;http://unlikelyteacher.com/2010/04/05/apple-push-notification-failed-to-register-with-error-error-domainnscocoaerrordomain/&quot;&gt;I missed &lt;/a&gt;one little thing: &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;After you have generated your Client SSL certificate, create a new provisioning profile containing the App ID you wish to use for notifications.&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This bit me after submitting &lt;a href=&quot;http://itunes.apple.com/app/doublemill/id368886888?mt=8&quot;&gt;Doublemill Premium&lt;/a&gt; to the App Store and being rejected for promoting Push Notifications in my App description, but according to Apple, not implementing it. During beta testing, everything worked fine. I had a correct implementation and the App was asking me for permission to use Push Notifications. &lt;br /&gt;&lt;br /&gt;However, I did forget to create a new distribution provisioning profile for the App Store, after enabling Push Notifications for production. So, it didn&#39;t work for the reviewer at Apple. Forgetting about something like this is very painful, especially since I&#39;m waiting for the 3rd round of review for the next release of Doublemill. That makes it 3 weeks since the initial submission. &lt;br /&gt;&lt;br /&gt;When asking about this on the Apple Developer Forums, Mike was so kind to point out a neat trick on the command line, which helps you identify, whether APN for production is enabled: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;codesign -dvvvv --entitlements - /path/to/App&lt;br/&gt;&lt;br /&gt;&amp;lt;key&amp;gt;aps-environment&amp;lt;/key&amp;gt;&lt;br /&gt;&amp;lt;string&amp;gt;production&amp;lt;/string&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If you see &lt;em&gt;aps-environment=production&lt;/em&gt;, you should be save. Push notifications should work. If the key is missing, then you should create a new provisioning profile and rebuild you App with that. &lt;br /&gt;&lt;br /&gt;It would be nice if Apple built this kind of checks into XCode or at least invalidate the provisioning profiles as soon as you enable Push Notifications in your App ID.</content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/2481283744772349161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/2481283744772349161' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/2481283744772349161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/2481283744772349161'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2010/07/push-notifications-in-production.html' title='Push Notifications in Production'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik5KOTzJrAmRx6FJfZTtu0uzRfpmaWgv2PMwNn_HRABbe6prGI-ncdFFrCKMUwbID7wnP-aLbGwKnmlNKl1yDi1y_1_jxjgZjVqPp2tPC3cRwmtyOq3FLD4G235GdLTw4FCK1s/s72-c?imgmax=144" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-6134079167777938199</id><published>2010-06-30T06:20:00.000+02:00</published><updated>2010-06-30T06:46:01.331+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="ipod"/><category scheme="http://www.blogger.com/atom/ns#" term="objective-c"/><category scheme="http://www.blogger.com/atom/ns#" term="quality"/><category scheme="http://www.blogger.com/atom/ns#" term="testing"/><title type='text'>UI Prototyping iPhone Apps</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://mobile.synyx.de&quot;&gt;&lt;img style=&quot;float:left;margin:0 10px 10px 0;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5m2OEf_3ehyOodYTzyOve5bsUChzXgc6E3aqWriAIQBC1roA6B7kRyLw-_ktEr99DnlJGQYJP74_Du1C0wEPr9_RC3dqoyT3HqsIuTJV-zVHA-OGqq7epld1Ml9Yw8E5GeJ9x/s144/logo_mobile_RGB_300px.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;&quot; /&gt;&lt;/a&gt;&lt;em&gt;I&#39;m writing for the &lt;a href=&quot;http://www.synyx.de&quot;&gt;Synyx GmbH &amp; Co. KG&lt;/a&gt; mobile solutions blog. From time to time, I&#39;ll cross post articles here, if I think they are of interest for you. If you&#39;d like to read all of my other posts, subscribe to the &lt;a href=&quot;http://mobile.synyx.de&quot;&gt;Synyx Mobile Solutions Blog&lt;/a&gt;.&lt;/em&gt;&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;Before &lt;a href=&quot;http://dlinsin.blogspot.com/2010/06/wwdc10.html&quot;&gt;flying off to WWDC&lt;/a&gt; last month, I watched a whole bunch of sessions from 2009. Among others a session on &quot;Prototyping iPhone User Interfaces&quot; by Bret Victor. If you haven&#39;t watched it and you&#39;ve got access to the WWDC videos - stop right here and watch the video!&lt;br /&gt;&lt;br /&gt;In his session, Bret shows how to prototype an interface only by interacting with screenshots! It&#39;s amazing that a simple screenshot on the device can show you so much more than by just looking at it in a document or print out. It inspired me to use his framework and the whole process for our own development. &lt;br /&gt;&lt;br /&gt;Unfortunately, the code for the session isn&#39;t available and neither Bret nor the frameworks evangelist, mentioned in the presentation, got back to me about the code. After some digging, I found &lt;a href=&quot;http://www.fruitstandsoftware.com/blog/2009/07/uiview-manipulation-made-easier-with-a-category/&quot;&gt;Michael Fey&#39;s blog&lt;/a&gt;, who was able to successfully reverse engineer the missing parts of source code, which were not shown in the presentation.&lt;br /&gt;&lt;br /&gt;Michael&#39;s &lt;em&gt;UIViewAdditions&lt;/em&gt; basically allow easy access to frame properties and give you a neat init method, which adds the passed &lt;em&gt;UIView&lt;/em&gt; as a parent:&lt;br /&gt;&lt;br /&gt;&lt;script src=&quot;http://gist.github.com/455669.js&quot;&gt;&lt;/script&gt;&lt;noscript&gt;&lt;pre&gt;- (id)initWithParent:(UIView *)parent {&lt;br /&gt;  self = [self initWithFrame:CGRectZero];&lt;br /&gt;  if (!self)&lt;br /&gt;    return nil;&lt;br /&gt;  [parent addSubview:self];&lt;br /&gt;  return self;&lt;br /&gt;}&lt;br /&gt;+ (id) viewWithParent:(UIView *)parent {&lt;br /&gt;  return [[[self alloc] initWithParent:parent] autorelease];&lt;br /&gt;}&lt;/pre&gt;&lt;/noscript&gt;&lt;br /&gt;&lt;br /&gt;There wasn&#39;t much left to do for me. I only coded the class &lt;em&gt;Root&lt;/em&gt;, which is the parent of all &lt;em&gt;UIImageView&lt;/em&gt; instances. It provides a couple of methods to slide images back and forth:&lt;br /&gt;&lt;br /&gt;&lt;script src=&quot;http://gist.github.com/455671.js&quot;&gt;&lt;/script&gt;&lt;noscript&gt;&lt;pre&gt;@synthesize pageIndex = _pageIndex;&lt;br/&gt;&lt;br /&gt;- (id) initWithParent:(UIView *)parent {&lt;br /&gt;  self = [super initWithParent:parent];&lt;br /&gt;  if (self == nil) {&lt;br /&gt;    return nil;&lt;br /&gt;  }&lt;br /&gt;  self.userInteractionEnabled = YES;&lt;br /&gt;  self.size = self.window.size;&lt;br /&gt;  [[UIImageView viewWithParent:self] setImageWithName:@&quot;dailies&quot;];&lt;br /&gt;  self.pageIndex = 0;&lt;br /&gt;  return self;&lt;br /&gt;}&lt;br/&gt;&lt;br /&gt;- (void)setPageIndex:(int)index {&lt;br /&gt;  if (index &amp;lt; 0 || index &amp;gt;= [self.subviews count]) {&lt;br /&gt;    return;&lt;br /&gt;  }&lt;br /&gt;  _pageIndex = index;&lt;br /&gt;  for (int i = 0; i &amp;lt; [self.subviews count]; i++) {&lt;br /&gt;    UIImageView *page = [self.subviews objectAtIndex:i];&lt;br /&gt;    page.x = (i &amp;lt; _pageIndex) ? -self.width : (i &amp;gt; _pageIndex) ? self.width : 0;&lt;br /&gt;  }&lt;br /&gt;}&lt;br/&gt;&lt;br /&gt;- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {&lt;br /&gt;  self.pageIndex++;&lt;br /&gt;}&lt;/pre&gt;&lt;/noscript&gt;&lt;br /&gt;&lt;br /&gt;With those two classes and a couple of screenshots, it is fairly easy to create an App that looks and feels almost real. I created a short demo video, which shows how easy it is to get a good feeling if your App is going to work or not:&lt;br /&gt;&lt;br /&gt;&lt;object width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/UMs3i51mghM&amp;hl=en_US&amp;fs=1&amp;&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/UMs3i51mghM&amp;hl=en_US&amp;fs=1&amp;&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Now don&#39;t forget those are only screenshots and the App might need to load stuff over the network or do some animation, hence it might not feel the same. However, this process of prototyping an UI is powerful enough to give you an idea, whether the workflow or the UI in general is going to &quot;work&quot; or needs some tweaking. &lt;br /&gt;&lt;br /&gt;You can download the source code for the two classes, along with a sample project from &lt;a href=&quot;http://github.com/dlinsin/district9/tree/master/UIPrototyping/&quot;&gt;github&lt;/a&gt;.&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/6134079167777938199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/6134079167777938199' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/6134079167777938199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/6134079167777938199'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2010/06/ui-prototyping-iphone-apps.html' title='UI Prototyping iPhone Apps'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5m2OEf_3ehyOodYTzyOve5bsUChzXgc6E3aqWriAIQBC1roA6B7kRyLw-_ktEr99DnlJGQYJP74_Du1C0wEPr9_RC3dqoyT3HqsIuTJV-zVHA-OGqq7epld1Ml9Yw8E5GeJ9x/s72-c/logo_mobile_RGB_300px.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-1037446854129980755</id><published>2010-06-14T06:01:00.000+02:00</published><updated>2010-06-14T06:45:03.913+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="ipod"/><category scheme="http://www.blogger.com/atom/ns#" term="traveling"/><title type='text'>WWDC10</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://developer.apple.com/wwdc&quot;&gt;&lt;img style=&quot;float:left;margin:0 10px 10px 0;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgwFx0O67tGkZaQIqVQdIrfRrJkvU3C9wfSJamFUlp_f-bzQzMQmx_kASRIrV9iUHhNZtxFuOm-txPX7CIqiuSD_9GM-0O4uWFG_PdDR1o1vsJud_9wZu2GuiQlriNy2Y_SRjo/s288/IMG_1338.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5191388009271083842&quot; /&gt;&lt;/a&gt;It was my &lt;a href=&quot;http://developer.apple.com/wwdc/&quot;&gt;first WWDC&lt;/a&gt; this year and I&#39;m blown away in any aspect! In order to not sound like an Apple fan boy, I&#39;ll highlight 3 aspects, which every conference has and compare them to my &lt;a href=&quot;http://dlinsin.blogspot.com/2010/03/mobile-times-2010.html&quot;&gt;previous developer conference experiences&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;The speakers were all Apple engineers. They knew how to present and almost all of them were very entertaining and fun to listen to. Most important of all - they knew what they were talking about! This is something no conference I&#39;ve ever been to can compete with - not even the &lt;a href=&quot;http://dlinsin.blogspot.com/2009/05/springone-2009-recap.html&quot;&gt;Spring Source conferences&lt;/a&gt;! They were close, but mostly featured some pretty bad talks from none Spring Source consultants, which kind of ruined the experience!&lt;br /&gt;&lt;br /&gt;This is one aspect that makes the conference worth attending. I could simply go up to the Core Animations guy and ask him why the stuff is not working as I expect it to. The best thing was, I got and answer that actually &lt;a href=&quot;http://itunes.apple.com/app/doublemill-fur-ipad/id370791547?mt=8&quot;&gt;solved my problem&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Another aspect is the choice of topics and the quality of the presentations! Everything kind of fits in nicely to the whole App theme. You could listen to talks on Interface Design, followed by an in depth session on Core Animation and finish off with listening to the latest innovations on the new iPhone 4. The quality of each talk was amazing! This is the first conference ever, where I wasn&#39;t close to dozing off once! Every session was interesting and inspiring, although they sometimes overlapped in terms of content!&lt;br /&gt;&lt;br /&gt;To be fair, I&#39;m kind of new to the iPhone platform, so if everything was interesting for me. I don&#39;t know how that holds true for fellow developers working on iPhone Apps for a couple of years. Other conferences I attended had quality talks, too - no doubt! &lt;a href=&quot;http://dlinsin.blogspot.com/2008/12/devoxx-2008-coming.html&quot;&gt;Devoxx&lt;/a&gt;, e.g. always had great talks, but there was mostly one or two a day and the rest was mostly boring. &lt;br /&gt;&lt;br /&gt;Third and last is the organizational aspect of the conference. It&#39;s amazing how Apple manages to keep 5000 developers under control. The food, although not extensive, was very good. Soft drinks all through the day, as well as breakfast and lunch. Another thing that I was blown away is the Wifi. Apple managed to provide a fairly stable internet connection for 5000 developers with probably more than 10000 devices. It didn&#39;t always work, as you could see in Steve&#39;s keynote, but most of the time it was stable and fast. &lt;br /&gt;&lt;br /&gt;Even though I had to travel almost a day, going back and forth to San Francisco and the conference tickets are super expensive, it&#39;s definitely worth it. So WWDC11, here I come!</content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/1037446854129980755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/1037446854129980755' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/1037446854129980755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/1037446854129980755'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2010/06/wwdc10.html' title='WWDC10'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgwFx0O67tGkZaQIqVQdIrfRrJkvU3C9wfSJamFUlp_f-bzQzMQmx_kASRIrV9iUHhNZtxFuOm-txPX7CIqiuSD_9GM-0O4uWFG_PdDR1o1vsJud_9wZu2GuiQlriNy2Y_SRjo/s72-c/IMG_1338.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-490756251327029388</id><published>2010-06-02T06:43:00.000+02:00</published><updated>2010-06-02T07:47:31.527+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><title type='text'>Book Review: The Business of iPhone App Development</title><content type='html'>&lt;span style=&quot;font-style:italic;&quot;&gt;&lt;a href=&quot;http://www.apress.com&quot;&gt;Apress&lt;/a&gt; was kind enough to pass me a copy of this book, which I agreed to review in return.&lt;/span&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://www.amazon.de/gp/product/1430224592?ie=UTF8&amp;tag=mytakeonthing-21&amp;linkCode=as2&amp;camp=1638&amp;creative=6742&amp;creativeASIN=1430224592&quot;&gt;&lt;img style=&quot;float:left;margin:0 10px 10px 0;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3eIOi-U8uEzgNZmGLNXO8IMYGsKQMcYeZ0T2GIIJlHuZkBl9YEcbszu4icw4S8WncTmaEPJpPMElb3mw3e1oGWHTbLGykut30gvJN8fscUUQ427tvXbUGTUXxHAs3rlHO2ZdT/s144/9781430227335.gif&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;&quot; /&gt;&lt;/a&gt;After the &lt;a href=&quot;http://dlinsin.blogspot.com/2009/12/book-review-iphone.html&quot;&gt;last book I reviewed&lt;/a&gt;, which was rather technical, I decided to go for a book with a tad more business angle. Personally, I was disappointed by this book, but that might not be the case for you.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.amazon.de/gp/product/1430224592?ie=UTF8&amp;tag=mytakeonthing-21&amp;linkCode=as2&amp;camp=1638&amp;creative=6742&amp;creativeASIN=1430224592&quot;&gt;Business of iPhone App Development&lt;/a&gt; covers exactly what the title promises: the whole process, beginning with the idea of an App over development to submitting it to the store. It&#39;s chopped up in &lt;a href=&quot;http://books.google.com/books?id=gebdTqLjj5EC&amp;lpg=PP1&amp;pg=PR4#v=onepage&amp;q&amp;f=false&quot;&gt;10 chapter&lt;/a&gt;, covering various steps of the process. &lt;br /&gt;&lt;br /&gt;I&#39;m not going into great detail explaining the content of the book. Instead, I&#39;ll write about what I didn&#39;t like. I think that should help you make a decision whether to get the book or not.&lt;br /&gt;&lt;br /&gt;The reason why I didn&#39;t like this book is very simple: most of the information in this book can be obtained from the net or using common sense!&lt;br /&gt;&lt;br /&gt;Let me elaborate: I think being able to obtain any information on the net these days is quite obvious. That doesn&#39;t mean you shouldn&#39;t buy this book. If you need a compact resource on topics like &quot;Setting Up Xcode&quot; or &quot;Submission to the App Store&quot;, this book is definitely worth getting. If you have done this before, like me, you will be disappointed, because there&#39;s nothing new! If you are looking into more business-related topics, there&#39;s definitely topics worth reading. However, most of the technical content can be found in Apple&#39;s documentation or on stackoverflow.com. Since the book has a lot of technical chapters, I was a little bored revisiting information I already knew.&lt;br /&gt;&lt;br /&gt;The more business-like chapters are definitely worth reading, especially if you are new to the whole App Store game. However, in my opinion a huge portion of the presented information are simple common sense! Using marketing channels like Twitter or Social Media like Facebook is standard these days and I believe there are no developers out there not knowing about those. However, some of the information seem like common sense, but it&#39;s great to have a resource to revisit from time to time, like e.g. &lt;a href=&quot;http://dlinsin.blogspot.com/2010/05/lessons-learned-iphone-review.html&quot;&gt;App Store Rejection reasons&lt;/a&gt;. Another great chapter is &quot;Protecting Your Intellectual Property&quot;, which you probably can&#39;t find anywhere else. It covers EULAs, licensing and trademarks.&lt;br /&gt;&lt;br /&gt;Overall, &lt;a href=&quot;http://www.amazon.de/gp/product/1430224592?ie=UTF8&amp;tag=mytakeonthing-21&amp;linkCode=as2&amp;camp=1638&amp;creative=6742&amp;creativeASIN=1430224592&quot;&gt;Business of iPhone App Development&lt;/a&gt; encompasses a lot of information and the authors did a great job, trying to cover a lot of ground. However, I can only fully recommend this book to you, if you are new to the world of &lt;a href=&quot;http://www.amazon.de/gp/product/1430224592?ie=UTF8&amp;tag=mytakeonthing-21&amp;linkCode=as2&amp;camp=1638&amp;creative=6742&amp;creativeASIN=1430224592&quot;&gt;iPhone development&lt;/a&gt;. Otherwise, you might want to think about it twice.</content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/490756251327029388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/490756251327029388' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/490756251327029388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/490756251327029388'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2010/06/book-review-business-of-iphone-app.html' title='Book Review: The Business of iPhone App Development'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3eIOi-U8uEzgNZmGLNXO8IMYGsKQMcYeZ0T2GIIJlHuZkBl9YEcbszu4icw4S8WncTmaEPJpPMElb3mw3e1oGWHTbLGykut30gvJN8fscUUQ427tvXbUGTUXxHAs3rlHO2ZdT/s72-c/9781430227335.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-6783699392065198089</id><published>2010-05-28T06:05:00.000+02:00</published><updated>2010-05-28T06:05:00.671+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="ipod"/><category scheme="http://www.blogger.com/atom/ns#" term="objective-c"/><title type='text'>Apple Push Notifications Gotchas</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://doublemill.blogspot.com&quot;&gt;&lt;img style=&quot;float:left;margin:0 10px 10px 0;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik5KOTzJrAmRx6FJfZTtu0uzRfpmaWgv2PMwNn_HRABbe6prGI-ncdFFrCKMUwbID7wnP-aLbGwKnmlNKl1yDi1y_1_jxjgZjVqPp2tPC3cRwmtyOq3FLD4G235GdLTw4FCK1s/?imgmax=144&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5191388009271083842&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;Last year, I worked on a Nine Men&#39;s Morris (Mühle) implementation for Android, called &lt;a href=&quot;http://doublemill.blogspot.com/&quot;&gt;Doublemill&lt;/a&gt;. Since I&#39;m an iPhone user, I decided to port the game to iPhone/iPod touch and the iPad. There are 3 versions: &lt;a href=&quot;http://itunes.apple.com/app/doublemill/id368886888?mt=8&quot;&gt;Doublemill Premium&lt;/a&gt;, &lt;a href=&quot;http://itunes.apple.com/de/app/doublemill-lite/id362714027?mt=8&quot;&gt;Doublemill Lite&lt;/a&gt; and &lt;a href=&quot;http://itunes.apple.com/app/doublemill-for-ipad/id370791547?mt=8&quot;&gt;Doublemill for iPad&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I&#39;m implementing Apple Push Notifications (APN) for Doublemill Premium right now and ran into some gotchas, which I&#39;m pretty sure are implemented somewhere else, but I&#39;m gonna share them here with you. If you are new to APN, checkout Apple&#39;s documentation. It&#39;s pretty good and will get you quite far.&lt;br /&gt;&lt;br /&gt;The first problem I ran into, had to do with my provisioning profile for development. I enabled APN in my Provisioning Portal, installed the certificate and implemented all the delegate methods according to the documentation, but somehow the method&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;was called with error code 3000 - &quot;no valid &#39;aps-environment&#39; entitlement string found for application&quot;. I was pretty sure, I setup everything correctly. However, &lt;a href=&quot;http://unlikelyteacher.com/2010/04/05/apple-push-notification-failed-to-register-with-error-error-domainnscocoaerrordomain/&quot;&gt;I missed &lt;/a&gt;one little thing: &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;After you have generated your Client SSL certificate, create a new provisioning profile containing the App ID you wish to use for notifications.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;That&#39;s what the Provisioning Portal tells you to do after you enabled APN. Your existing provisioning profiles are not being hooked up to APN, you really need to create new ones.&lt;br /&gt;&lt;br /&gt;Another problem I ran into is a blocked Wifi port. Apple&#39;s documentation says:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;If a cellular or WiFi connection is not available, neither the application:didRegisterForRemoteNotificationsWithDeviceToken: method or the application:didFailToRegisterForRemoteNotificationsWithError: method is called. For WiFi connections, this sometimes occurs when the device cannot connect with APNs over port 5223.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;That also means neither of the methods is called when 5223 is blocked. Fortunately I came across a very helpful post on the Apple Developer Forums (sorry can&#39;t link to that here), which pointed me to a &lt;a href=&quot;http://www.atnan.com/2009/7/27/enabling-verbose-push-notification-service-apns-logs&quot;&gt;mobileconfig&lt;/a&gt;, enabling APN logging. If you have your phone connected and can see the log statements, you can find out if your port is blocked or something else is wrong. Don&#39;t forget to restart your phone after installing the mobileconfig, in order to enable the logging. For Doublemill the statements look something like this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Connecting courier stream to sandbox.push.apple.com on port 5223&lt;br/&gt;&lt;br /&gt;Connecting courier stream to push.apple.com on port 5223&lt;br/&gt;&lt;br /&gt;Connecting to courier 2-courier.sandbox.push.apple.com&lt;br/&gt;&lt;br /&gt;Connecting to courier 19-courier.push.apple.com&lt;br/&gt;&lt;br /&gt;Connected to courier 2-courier.sandbox.push.apple.com (17.000.34.73)&lt;br/&gt;&lt;br /&gt;Sending connect message with token &#39;xyz&#39;&lt;br/&gt;&lt;br /&gt;Connected to courier 19-courier.push.apple.com (17.000.36.88)&lt;br /&gt;Sending connect message with token &#39;abc&#39;&lt;br/&gt;&lt;br /&gt;Recieved connected response OK&lt;br/&gt;&lt;br /&gt;Sending filter message for enabled hashes { 34345 = &quot;de.linsin.games.doublemill&quot;; } and ignored hashes {}&lt;br/&gt;&lt;br /&gt;...&lt;br/&gt;&lt;br /&gt;Recieved connected response OK&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;These log statements are priceless, when hunting down the reason why you won&#39;t receive push notification in your application!&lt;br /&gt;&lt;br /&gt;The last gotcha for today is one that I couldn&#39;t really find in &lt;a href=&quot;http://developer.apple.com/iphone/library/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ProvisioningDevelopment/ProvisioningDevelopment.html#//apple_ref/doc/uid/TP40008194-CH104-SW2&quot;&gt;Apple&#39;s documentation&lt;/a&gt; or at least I didn&#39;t really understand it that way. Anyways, if you distribute your App with an Ad-Hoc provisioning profile, which you would do for &lt;a href=&quot;http://dlinsin.blogspot.com/2010/04/iphone-app-beta-testing.html&quot;&gt;beta testing&lt;/a&gt;, the destination of your push notifications are not the sandbox, but the production. Come to think of it - it does make sense. However, you do need to create the production certificate and a &lt;strong&gt;new&lt;/strong&gt; provisioning profile for it. Of course, your backend needs to be able to handle both destinations, as well! &lt;br /&gt;&lt;br /&gt;Overall, APN is a cool feature and if you are running a server for your App anyways, it actually is for free! If your backend is running on &lt;a href=&quot;http://dlinsin.blogspot.com/search/label/gae&quot;&gt;Google App Engine&lt;/a&gt;, it&#39;s a different story, which I&#39;ll talk about in a future blog post.&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/6783699392065198089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/6783699392065198089' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/6783699392065198089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/6783699392065198089'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2010/05/apple-push-notifications-gotchas.html' title='Apple Push Notifications Gotchas'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik5KOTzJrAmRx6FJfZTtu0uzRfpmaWgv2PMwNn_HRABbe6prGI-ncdFFrCKMUwbID7wnP-aLbGwKnmlNKl1yDi1y_1_jxjgZjVqPp2tPC3cRwmtyOq3FLD4G235GdLTw4FCK1s/s72-c?imgmax=144" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-6719742897849457779</id><published>2010-05-20T06:22:00.004+02:00</published><updated>2010-06-28T12:19:55.234+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="ipod"/><category scheme="http://www.blogger.com/atom/ns#" term="mobile"/><category scheme="http://www.blogger.com/atom/ns#" term="objective-c"/><title type='text'>Lessons learned - iPhone Review</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://mobile.synyx.de&quot;&gt;&lt;img style=&quot;float:left;margin:0 10px 10px 0;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5m2OEf_3ehyOodYTzyOve5bsUChzXgc6E3aqWriAIQBC1roA6B7kRyLw-_ktEr99DnlJGQYJP74_Du1C0wEPr9_RC3dqoyT3HqsIuTJV-zVHA-OGqq7epld1Ml9Yw8E5GeJ9x/s144/logo_mobile_RGB_300px.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;&quot; /&gt;&lt;/a&gt;&lt;em&gt;I&#39;m writing for the &lt;a href=&quot;http://www.synyx.de&quot;&gt;Synyx GmbH &amp; Co. KG&lt;/a&gt; mobile solutions blog. From time to time, I&#39;ll cross post articles here, if I think they are of interest for you. If you&#39;d like to read all of my other posts, subscribe to the &lt;a href=&quot;http://mobile.synyx.de&quot;&gt;Synyx Mobile Solutions Blog&lt;/a&gt;.&lt;/em&gt;&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;When you submit an App to the Apple App Store it has to go through a &quot;rigorous quality check&quot;, conducted by Apple. Although &lt;a href=&quot;http://apprejections.com/index.php/post/171&quot;&gt;there are &lt;/a&gt;&lt;a href=&quot;http://www.mobileorchard.com/avoiding-iphone-app-rejection-from-apple/&quot;&gt;plenty of resources &lt;/a&gt;&lt;a href=&quot;http://iphone.derheckser.com/2009/07/10/suffering-from-modus-operandi-of-reviewer-team/&quot;&gt;out there&lt;/a&gt;, here&#39;s a short rundown of what we&#39;ve learned ourselves so far:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Marketing Apps are not allowed&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;If the sole purpose of your App is marketing, you&#39;ll have a hard time getting your App through. You need to add what Apple calls &quot;user functionality&quot;. That could be something simple like a photo gallery or a feature to reserve a room or table.&lt;br /&gt;&lt;br /&gt;	&lt;li&gt;&lt;strong&gt;You cannot tease your users with features that they have to pay for&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;If you are offering a lite version of your App, you cannot add disabled functionality, which would be enabled in the paid version. A lite version usually is offered separately from a paid version, which means the user will constantly see disabled menu items or buttons, since the App will never be updated. Instead add a info section about the paid version in your App, which describes what the paid version offers.&lt;br /&gt;&lt;br /&gt;	&lt;li&gt;&lt;strong&gt;Don&#39;t ask your users to upgrade&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;You cannot add an alert in a free/lite version of your App, which asks users to upgrade or buy the paid version. Instead you should add a &quot;buy me&quot; button or a section in your App further describing what your paid version offers.&lt;br /&gt;&lt;br /&gt;	&lt;li&gt;&lt;strong&gt;Build a working App&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;You are definitely rejected if your App is buggy! If the reviewer thinks he found a bug, he&#39;ll reject your App. A crash is the worst case scenario, but &lt;a href=&quot;http://dlinsin.blogspot.com/2010/05/don-forget-your-linker-flags.html&quot;&gt;it happens&lt;/a&gt;. However, don&#39;t depend on Apple as your QA, because the review times are too long to go back and forth this way. &lt;br /&gt;&lt;br /&gt;	&lt;li&gt;&lt;strong&gt;Don&#39;t infringe Trademarks or Copyrights&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;Don&#39;t mention Apple, &lt;a href=&quot;http://www.geek.com/articles/mobile/apple-demands-a-developer-removes-android-references-from-iphone-app-2010024/&quot;&gt;Android&lt;/a&gt; or any other Trademark therefore - as long as you don&#39;t own it. You should also resist to use iPhone like icons or images.  &lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;If you respect all of these restrictions and gotchas, you should be save to get your App through the review process. I say &quot;should&quot;, because it all appears to depend on the person who reviews your App. Let us know what you experienced, submitting your Apps, I bet there are a lot more of these gotchas.</content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/6719742897849457779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/6719742897849457779' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/6719742897849457779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/6719742897849457779'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2010/05/lessons-learned-iphone-review.html' title='Lessons learned - iPhone Review'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5m2OEf_3ehyOodYTzyOve5bsUChzXgc6E3aqWriAIQBC1roA6B7kRyLw-_ktEr99DnlJGQYJP74_Du1C0wEPr9_RC3dqoyT3HqsIuTJV-zVHA-OGqq7epld1Ml9Yw8E5GeJ9x/s72-c/logo_mobile_RGB_300px.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-650416457592681242</id><published>2010-05-10T07:16:00.000+02:00</published><updated>2010-05-10T07:17:08.519+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="objective-c"/><title type='text'>Don&amp;#39;t Forget your Linker Flags</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://doublemill.blogspot.com&quot;&gt;&lt;img style=&quot;float:left;margin:0 10px 10px 0;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik5KOTzJrAmRx6FJfZTtu0uzRfpmaWgv2PMwNn_HRABbe6prGI-ncdFFrCKMUwbID7wnP-aLbGwKnmlNKl1yDi1y_1_jxjgZjVqPp2tPC3cRwmtyOq3FLD4G235GdLTw4FCK1s/?imgmax=144&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5191388009271083842&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;Last year, I worked on a Nine Men&#39;s Morris (Mühle) implementation for Android, called &lt;a href=&quot;http://doublemill.blogspot.com/&quot;&gt;Doublemill&lt;/a&gt;. Since I&#39;m an iPhone user, I decided to port the game to iPhone/iPod touch and the iPad. There are 3 versions: &lt;a href=&quot;http://itunes.apple.com/app/doublemill/id368886888?mt=8&quot;&gt;Doublemill Premium&lt;/a&gt;, &lt;a href=&quot;http://itunes.apple.com/de/app/doublemill-lite/id362714027?mt=8&quot;&gt;Doublemill Lite&lt;/a&gt; and Doublemill for iPad.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Doublemill is out the door and &lt;a href=&quot;http://itunes.apple.com/app/doublemill/id368886888?mt=8&quot;&gt;available for download&lt;/a&gt; in the App Store - finally! It has been more than two weeks since my submission. The reason why it took so long, besides Apple, which takes up to a week at the moment to review Apps, is my stupidity!&lt;br /&gt;&lt;br /&gt;I&#39;m using &lt;a href=&quot;http://github.com/gabriel/yajl-objc&quot;&gt;Objective-C bindings for YAJL&lt;/a&gt; to create and parse JSON in &lt;a href=&quot;http://doublemill.blogspot.com/2010/05/video-how-to-iii.html&quot;&gt;Doublemill&#39;s multiplayer feature&lt;/a&gt;. It comes with a &lt;a href=&quot;http://en.wikipedia.org/wiki/Objective-C#Categories&quot;&gt;Category&lt;/a&gt; for &lt;em&gt;NSString&lt;/em&gt;, which basically makes it a two liner to create a JSON representation of a string:&lt;br /&gt;&lt;br /&gt;&lt;script src=&quot;http://gist.github.com/395688.js&quot;&gt;&lt;/script&gt;&lt;noscript&gt;&lt;pre&gt;#import &quot;NSObject+YAJL.h&quot;&lt;br /&gt;&lt;br /&gt;NSDictionary *vals = [jsonResponse yajl_JSON];&lt;br /&gt;[player fill:vals];&lt;br /&gt;&lt;br /&gt;- (void)fill:(NSDictionary *)vals {&lt;br /&gt;	NSString *key;&lt;br /&gt;	for (key in vals) {&lt;br /&gt;		[self setValue:[vals objectForKey:key] forKey:key];&lt;br /&gt;	}&lt;br /&gt;}&lt;/pre&gt;&lt;/noscript&gt;&lt;br /&gt;&lt;br /&gt;Okay it&#39;s not a two liner, but it&#39;s close! Anyways, in order to add this library to your project, one way is to download the build and add the static library to your Xcode project. It&#39;ll work seamlessly in the Simulator. If you want to deploy it to your iPhone or any iPhone, you need to add linker flags:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Under &#39;Other Linker Flags&#39; in the Test target, add -ObjC and -all_load (So NSObject+YAJL category is loaded).&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This is very common and no big deal actually. If you want to know more about why you need this, &lt;a href=&quot;http://developer.apple.com/mac/library/qa/qa2006/qa1490.html&quot;&gt;check out the Apple Developer Connection&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;I added those flags for the my development environment and also for my &lt;a href=&quot;http://dlinsin.blogspot.com/2010/04/iphone-app-beta-testing.html&quot;&gt;beta testers&lt;/a&gt;. However, I totally missed this in my Xcode AppStore build configuration settings and since you cannot &lt;a href=&quot;http://furbo.org/2008/11/12/the-final-test/&quot;&gt;really test&lt;/a&gt; your final build, it went in review without those linker flags. &lt;br /&gt;&lt;br /&gt;The reviewer at Apple found the bug, which even resulted in a crash of Doublemill. I&#39;m grateful they found it, however I&#39;m not really happy, that I had to wait another week to get &lt;a href=&quot;http://itunes.apple.com/app/doublemill/id368886888?mt=8&quot;&gt;Doublemill&lt;/a&gt; out the door. In the end it was my mistake and I&#39;m sure in the future, I&#39;ll make sure to have those build profiles setup more carefully. </content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/650416457592681242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/650416457592681242' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/650416457592681242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/650416457592681242'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2010/05/don-forget-your-linker-flags.html' title='Don&amp;#39;t Forget your Linker Flags'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik5KOTzJrAmRx6FJfZTtu0uzRfpmaWgv2PMwNn_HRABbe6prGI-ncdFFrCKMUwbID7wnP-aLbGwKnmlNKl1yDi1y_1_jxjgZjVqPp2tPC3cRwmtyOq3FLD4G235GdLTw4FCK1s/s72-c?imgmax=144" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17885082.post-6484844251629083345</id><published>2010-05-03T06:16:00.001+02:00</published><updated>2010-05-03T06:16:06.823+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><title type='text'>iPad Apps have priority</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://doublemill.blogspot.com&quot;&gt;&lt;img style=&quot;float:left;margin:0 10px 10px 0;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik5KOTzJrAmRx6FJfZTtu0uzRfpmaWgv2PMwNn_HRABbe6prGI-ncdFFrCKMUwbID7wnP-aLbGwKnmlNKl1yDi1y_1_jxjgZjVqPp2tPC3cRwmtyOq3FLD4G235GdLTw4FCK1s/?imgmax=144&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5191388009271083842&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;Last year, I worked on a Nine Men&#39;s Morris (Mühle) implementation for Android, called &lt;a href=&quot;http://doublemill.blogspot.com/&quot;&gt;Doublemill&lt;/a&gt;. Since I&#39;m an iPhone user, I decided to port the game to iPhone/iPod touch and the iPad. There are 3 versions: Doublemill Premium, &lt;a href=&quot;http://itunes.apple.com/de/app/doublemill-lite/id362714027?mt=8&quot;&gt;Doublemill Lite&lt;/a&gt; and Doublemill for iPad.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I had to &lt;strong&gt;wait for a week&lt;/strong&gt;, after &lt;a href=&quot;http://doublemill.blogspot.com/2010/04/doublemill-premium-under-way.html&quot;&gt;submitting Doublemill Premium&lt;/a&gt; for review to the App Store, until Apple decided to have a look at it. Unfortunately, we were rejected - for a good reason! As it turned out, I didn&#39;t link my libraries correctly, which turned out to cause a crash every time you wanted to play online, but I digress... &lt;br /&gt;&lt;br /&gt;It took me roughly 2-3 hours to find the bug, fix it and resubmit the App. Now I&#39;m waiting for five days again. &lt;br /&gt;&lt;br /&gt;Yesterday, I finished polishing Doublemill for iPad, after reworking the UI and implementing a nicer Player vs. Player experience. Since it was a rainy day and there was only Star Trek on TV, I decided to submit it for review, since it would take at least a week until they had a look at it. I want to be ready for the European start of the iPad and if there&#39;s anything wrong with Doublemill for iPad, it would take at least 2 weeks to get it into the App Store - that&#39;s what I thought!&lt;br /&gt;&lt;br /&gt;After the usual email, you get after submitting, I &lt;strong&gt;instantly&lt;/strong&gt; received another, saying my App is &lt;strong&gt;in review&lt;/strong&gt;. Just like that - without waiting for a week. That got me really upset! I invested almost 4 weeks of my spare time, to gett Doublemill Premium ready and polished and I had to wait for a week until it was in review.&lt;br /&gt;&lt;br /&gt;To me this is a clear signal, that iPad Apps are more important to Apple than iPhone Apps - at the moment. I hope this will balance again soon. It is understandable, that they want the iPad App market filled as soon as possible, but that&#39;s no reason to make the iPhone App developers wait more than a week. That takes us back to where we were a year ago: waiting and waiting and waiting - just to be rejected!</content><link rel='replies' type='application/atom+xml' href='http://dlinsin.blogspot.com/feeds/6484844251629083345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17885082/6484844251629083345' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/6484844251629083345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17885082/posts/default/6484844251629083345'/><link rel='alternate' type='text/html' href='http://dlinsin.blogspot.com/2010/05/ipad-apps-have-priority.html' title='iPad Apps have priority'/><author><name>David Linsin</name><uri>http://www.blogger.com/profile/12280104990941617395</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFDK1CEyjmtWsiv4CwjeUKlaKK6bUGH_Vz4-MzhAWUB5H4fzjtST10oZk5JvyWjr0ygOiwgE3_hoT5yPZ6Yk7ynn2Z2VcVDdt2ZRDHAdKwNwpnU-7SJhGBRrDskPc9A/s220/1_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik5KOTzJrAmRx6FJfZTtu0uzRfpmaWgv2PMwNn_HRABbe6prGI-ncdFFrCKMUwbID7wnP-aLbGwKnmlNKl1yDi1y_1_jxjgZjVqPp2tPC3cRwmtyOq3FLD4G235GdLTw4FCK1s/s72-c?imgmax=144" height="72" width="72"/><thr:total>3</thr:total></entry></feed>