-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
497 lines (289 loc) · 21.2 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
<!DOCTYPE html>
<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
<head>
<meta charset="utf-8">
<title>iOS Geek</title>
<meta name="author" content="Nik Burns">
<!-- http://t.co/dKP3o1e -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="canonical" href="http://burnsoft.github.com/blog/index.html"/>
<link href="/blog/favicon.png" rel="shortcut icon" />
<link href="/blog/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
<script src="/blog/javascripts/modernizr-2.0.js"></script>
<script src="http://s3.amazonaws.com/ender-js/jeesh.min.js"></script>
<script src="/blog/javascripts/octopress.js" type="text/javascript"></script>
<link href="/blog/atom.xml" rel="alternate" title="iOS Geek" type="application/atom+xml"/>
<!--Fonts from Google's Web font directory at http://google.com/webfonts -->
<link href='http://fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic' rel='stylesheet' type='text/css'>
<link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic' rel='stylesheet' type='text/css'>
<link href='http://fonts.googleapis.com/css?family=Bangers' rel='stylesheet' type='text/css'>
</head>
<body >
<header><hgroup>
<h1><a href="/blog/">iOS Geek</a></h1>
<h2>code and general geekiness.</h2>
</hgroup>
</header>
<nav role=navigation><ul role=subscription data-subscription="rss">
<li><a href="/blog/atom.xml" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li>
</ul>
<form action="http://google.com/search" method="get">
<fieldset role="site-search">
<input type="hidden" name="q" value="site:burnsoft.github.com/blog" />
<input class="search" type="text" name="q" results="0" placeholder="Search"/>
</fieldset>
</form>
<ul role=main-navigation>
<li><a href="/blog/">Blog</a></li>
<li><a href="/blog/blog/archives">Archives</a></li>
<li><a href="http://www.burnsoft.co.uk">Burnsoft</a></li>
</ul>
</nav>
<div id="main">
<div id="content">
<div class="blog-index">
<article>
<header>
<h1 class="entry-title"><a href="/blog/blog/2012/02/17/url-today/">URL Today, Gone Tomorrow - iOS Settings</a></h1>
<p class="meta">
<time datetime="2012-02-17T23:30:00+00:00" pubdate data-updated="true" >Feb 17<span>th</span>, 2012</time></p>
</header>
<div class="entry-content"><h6>How Many Taps?</h6>
<p>I think that most iPhone users would agree that iOS settings are not the most user friendly of screens to navigate and by definition, I don’t think that they can be, as they cover tweaks and tunings that the average user won’t even know are possible. That’s not to say that settings are never visited; I just think that if a way was found to make it easier for a user to toggle their wifi/bluetooth or turn off 3G, then it would be embraced by users and developers alike.</p>
<p>Currently if you want to toggle your bluetooth settings, assuming you are already on your homescreen…</p>
<ol>
<li>Tap Settings</li>
<li>Scroll to General</li>
<li>Tap Bluetooth</li>
<li>Toggle button</li>
</ol>
<p>How about turn off your 3G connection…</p>
<ol>
<li>Tap Settings</li>
<li>Scroll to General</li>
<li>Tap Network</li>
<li>Toggle 3G</li>
</ol>
<p>Most things are 4 screens away. If an app used bluetooth and bluetooth was switched off, then the user would be asked to quit the app and follow the above instructions. It would be a lot easier and cleaner from a usability point of view if an app could send the user directly to the bluetooth settings, if the user so chose.</p>
<h5>Please give a warm welcome</h5>
<p>In iOS 5, Apple made it possible to go directly to the settings area you wanted with one URL call.
This can be done in your own application using:</p>
<figure role=code><div class="highlight"><table cellpadding="0" cellspacing="0"><tr><td class="gutter"><pre class="line-numbers"><span class='line'>1</span>
</pre></td><td class='code' width='100%'><pre><code class=''><div class='line'>[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=TWITTER"]];</div></code></pre></td></tr></table></div></figure>
<p>
or the URL could be called from within mobile Safari.<br/>
I don’t know who first found these, but they have been well documented and a quick google for ‘iOS settings URL scheme’ finds various sources of information.</p>
<h5>Try them out</h5>
<p>My latest app started out as a settings shortcut helper (I’ve previously blogged about its inception) and I open-sourced the settings functionality of it.</p>
<p>Swiping down into notification center and having your settings there is the easist use of these shortcuts IMHO, so if you are able to sign your own applications then I’d recommend trying it out. If not, then the images should give you an idea of what I’m talking about. <a href="https://github.com/Burnsoft/Settings-Swipe/" title="Settings Swipe">Github - Settings Swipe</a></p>
<h5>Enhancement request</h5>
<p>In the latest iOS 5.1 beta’s, these URL’s are no longer available.<br/>
Maybe they will make it in the next official release but their future is unknown. In the meantime we can try and show Apple that there is sufficient demand for this feature by requesting an enhancement request via their bugreporter.</p>
<p>If you find them useful, please duplicate rdar://5864941<br/>
The open radar comments are at <a href="http://openradar.appspot.com/10198949/" title="Open Radar">Open Radar - URL scheme</a></p>
</div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/blog/2011/12/20/iprefs-to-app-swipe-to-review-to-nowhere-dot-dot-dot/">iPrefs to App Swipe to Review to Nowhere….</a></h1>
<p class="meta">
<time datetime="2011-12-20T14:40:00+00:00" pubdate data-updated="true" >Dec 20<span>th</span>, 2011</time></p>
</header>
<div class="entry-content"><hr />
<p>Back in November 2011 I started working on a new app that used the Notification Center in iOS 4+ to launch other apps and perform daily tasks (compose iMessage, Tweet, mail etc).</p>
<h4>iPrefs</h4>
<p>It started life as an app called ‘iPrefs’ and the catalyst was the Settings URL scheme that became public knowledge at the iOS5 release. (e.g. prefs:root=AIRPLANE_MODE)</p>
<p>It made launching your settings easy, bluetooth was one swipe and a tap away, as was airplane mode. The app was fully localized in French, German, Italian and Spanish, would be free with one saved notification shortcut (in-app purchase for max of 10), worked great and was a really nice looking app, very similiar to the notification center.</p>
<p>Before I submitted to Apple for review, I checked the Store for any other apps using the prefs URL scheme and found one other, so thought that the prefs URL’s were ok to use.<br/>
-25th November - app uploaded.<br/>
-2nd December - app rejected. ‘Non public URL scheme’ was the reason for rejection.
<em>(I had other bugs to fix but on subsequent resolution center queries was made aware that under no circumstances could I use the prefs: urls, even to help a user add a Twitter account when none was available in iOS5)</em></p>
<p>The original code for iPrefs is available on <a href="https://github.com/Burnsoft/Settings-Swipe/" title="Settings Swipe">Github</a>.</p>
<p>OK, fair enough I thought. I understood that URL’s <strong><em>could</em></strong> change in the future, so I decided to just move on.</p>
<p><img class='' src='http://burnsoft.github.com/blog/images/blog_post_images/reviewStatus.jpg' width='' height='' alt='' title=''></p>
<h4>App Swipe</h4>
<p>I still knew that Notification Center had great potential (I now know that I wasn’t alone, @drbarnard @artysx @skorebrits were all working on similiar apps around this time) and decided to use its functionality for iPrefs.</p>
<p><img class='' src='http://burnsoft.github.com/blog/images/blog_post_images/one.png' width='' height='' alt='' title=''></p>
<p>With Apple not allowing the use of the settings URL scheme, I decided to use notification center as a quick way to launch my favourite apps.</p>
<p><span class='has-pullquote' data-pullquote='choose a contact to start the call/sms with'>
So I set to work, updating iPrefs to enable the user to choose from a small list of apps, including email, SMS, FaceTime, Facebook and various Twitter clients. You could choose a contact to start the call/sms with, compose a Tweet template, open Ebay or Facebook etc, basically making iPrefs a frequently used task list.<br/>
With the apps appearing in notification center, you now had a really quick way to switch between apps that didn’t involved double tapping any homescreens or sideways swipe navigations, which was a win in my book. <br/>
I just needed a new name ;-)
</span></p>
<h5>Pre-Xmas Opening</h5>
<p>-9th December - I was cutting it fine for the Xmas closedown of iTunesConnect when I submitted App Swipe but I needn’t have worried.</p>
<p>-13th December - I received my first ever “Your app requires additional review time” email. Gutted!
There was nothing I could do except be very polite and ask via the resolution center if there was anything I could do to help speed things up.</p>
<p>-21st December - Apple emailed me to discuss my app submission. My use of notification center to create ‘quick links’ was the main reason for my rejection (reference app review guidelines 2.4). I had also used an image that resembled the notification pull down screen as my app icon, which they also didn’t like.</p>
<p>iTunesConnect was still showing my app as in review so I rejected the binary, removed the ability to use notification center for shortcuts and changed the offending images.</p>
<h5>Pre-Xmas Shutdown Frenzy</h5>
<p>-21st December - I re-submitted close to midnight, requested an expedited review, emailed the nice chap who I had spoken to earlier in the day and crossed my fingers. My expedited review was declined which made sense as I didn’t have a major bug or anything that would cause a bad user experience (lesson learned for expedited requests).</p>
<p>-4th January - App Swipe stayed in review until I received a very nice ‘Your app App Swipe has been reviewed, but we are unable to post this version’ email.
I’m unable to access the resolution center as this is now resolved but I had a good few pages of back and forth with the very helpful review team. (no sarcasm intended!).</p>
<h5>It’s Groundhog day, again</h5>
<p>-11th January - rejected. <br/>
-17th January - rejected.</p>
<p>App Review Guidelines 10.4 was now my nemesis.</p>
<p><strong><em>‘Apps that create alternate desktop/home screen environments or simulate multi-app widget experiences will be rejected’.</em></strong></p>
<p>IMHO App Swipe was very similiar in functionality to other ‘launcher’ apps on the store. I now didn’t have a clue what I could do to the app to make it acceptable and pass review. <strong>So I appealed</strong>.
I don’t have the exact wording of the appeal as I didn’t save a copy, but I’m pretty sure I didn’t beg or grovel. However, I did base my case around the fact that any shortcut was placed explicitly on the screen by the user and not hard wired into the app (man, I wish I’d kept a copy).</p>
<h5>Good Feeling</h5>
<p>-20th January - My first bit of good news, a positive appeal outcome.<br/>
This kickstarted the ‘move to live’ process and App Swipe was available within 24 hours. <a href="https://twitter.com/AppSwipe/statuses/160153762537803776/" title="I'm live">App Swipe Twitter Status 20th Jan</a></p>
<h5>Updates</h5>
<p>-11th February - App Swipe 1.2 submitted for review. Includes a new look and notifications for task reminders.</p>
<p>-19th February App Swipe 1.2 was rejected. Knowing that just a slight variation in how I was handling notifications could be the reason I’m not yet on the store, I took another look at how App Swipe handled various scenarios in relation to the latest rejection reason</p>
<p><strong><em>It would be appropriate to remove any functionality that includes, or enables the user to create, shortcuts to the Notification Center. </em></strong></p>
<p>Initially I was baffled, then after further testing and re-reading of the rejection reason, Apples use of shortcuts in the plural jumped out at me. If a user had created multiple reminders and not fired them in notification center then they had effectively a number of application shortcuts ready to be used. So I changed the code to remove additional notifications when the app was launched directly or via a notification. Fingers crossed this will be acceptable.</p>
<p>I still think from a users point of view removing the extra notifications is wrong but Apple must see this differently, so if you agree that this should be the outcome from use of notification in this way, please dupe my enhancement request rdar://10609497)</p>
<p>I received a response that my rdar was a duplicate but as I don’t know the exact wording of the original below is the summary of my enhancement request posted on the 20th December 2011. The original id is rdar://10380471<br/>
<em>Notification Center functionality is not fully utilised at present.
Pull down gesture could be used to aid user shortcuts to other applications, (does anyone really double tap the home button to switch apps!?) to launch the in built Tweet Sheet for iOS5, to call a friend, open iMessage compose view etc.</em></p>
<h5>Final Update</h5>
<p>-18th March - v1.2 was recently approved for sale and is now available on the AppStore. On reflection I believe a number of factors played a part in the long review time. Notifications were only one factor. The timing of my submission co-incided with the new iPad release and I believe the App Store reviewers were likely working double time trying to get as many iPad retina apps ready for launch day.</p>
<p>I’m now a happy camper, and work on 1.3 continues, in fact its awaiting review as I type, this version enhances the UI and adds weekday scheduling.</p>
<p>1.4 is underway and for this version I’ll be refreshing the logo (and maybe a name change) amongst other thing.</p>
<p>Happy Swiping.
Nik</p>
</div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/blog/2011/09/24/twitter-timeline-re-usable-class/">Twitter Timeline Re-usable Class - iOS</a></h1>
<p class="meta">
<time datetime="2011-09-24T18:25:00+01:00" pubdate data-updated="true" >Sep 24<span>th</span>, 2011</time></p>
</header>
<div class="entry-content"><p>I’m developing a Twitter tool and needed to grab the latest tweets in the public timeline and chuck (technical term) in a tableview for testing.</p>
<p>I’d also appreciate any comments if anyone spots any bad coding habits or would like to improve it.</p>
<p>Copy the code into your project making sure the calling class registers for the <latestTweetDelegate> in its header file.</p>
<p>Then instantiate the class using your URL, I just use the standard Twitter Public Timeline Timeline API:</p>
<figure role=code><figcaption><span>somewhere in your class</span></figcaption>
<div class="highlight"><table cellpadding="0" cellspacing="0"><tr><td class="gutter"><pre class="line-numbers"><span class='line'>1</span>
<span class='line'>2</span>
<span class='line'>3</span>
<span class='line'>4</span>
</pre></td><td class='code' width='100%'><pre><code class=''><div class='line'>latestTweets *lt = [[latestTweets alloc] initWithTwitterURL:@"http://api.twitter.com/1/statuses/public_timeline.json?include_entities=true"];
</div><div class='line'>lt.delegate = self;
</div><div class='line'>
</div><div class='line'>[lt release];</div></code></pre></td></tr></table></div></figure>
<p> </div>
<footer>
<a rel="full-article" href="/blog/blog/2011/09/24/twitter-timeline-re-usable-class/">Read on →</a>
</footer>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/blog/2011/09/23/octopress-install-with-screencast/">Octopress Install With Screencast</a></h1>
<p class="meta">
<time datetime="2011-09-23T07:04:00+01:00" pubdate data-updated="true" >Sep 23<span>rd</span>, 2011</time></p>
</header>
<div class="entry-content"><p>I’ve recently updated my companies website and had added a blog section as an afterthought using Wordpress. Github is something I use
regularly to view open source projects but had never used as originally intended, (I just download the zip file), as I’d always viewed the
git process as having too steep a learning curve.
Since I found out about Octopress last week, this has replaced my mediocre blog with something very elegant and also put me on the way to
understanding and including git into my daily development workflow.</p>
<p>The process was relatively simple, but being new to Git and Ruby I had a few problems along the way. I hope this post helps you if you also
choose to host your octopress on github.</p>
<p>(Update - 23rd September 2011 - The Octopress team have made this even easier since I did my install last week.
There is a custom rake script (is that the correct terminology?) to do the tricky git stuff for a github install.)</p>
<h3>Steps</h3>
<p>-Things to do before installing Octopress: (from within Terminal)</p>
</div>
<footer>
<a rel="full-article" href="/blog/blog/2011/09/23/octopress-install-with-screencast/">Read on →</a>
</footer>
</article>
<nav role="pagination">
<div>
<a href="/blog/blog/archives">Blog Archives</a>
</div>
</nav>
<script type="text/javascript">
var disqus_shortname = 'burnsoft';
(function () {
var s = document.createElement('script'); s.async = true;
s.type = 'text/javascript';
s.src = 'http://' + disqus_shortname + '.disqus.com/count.js';
(document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);
}());
</script>
</div>
<aside role=sidebar>
<section>
<h1>Recent Posts</h1>
<ul id="recent_posts">
<li class="post">
<a href="/blog/blog/2012/02/17/url-today/">URL today, gone tomorrow - iOS Settings</a>
</li>
<li class="post">
<a href="/blog/blog/2011/12/20/iprefs-to-app-swipe-to-review-to-nowhere-dot-dot-dot/">iPrefs to App Swipe to Review to Nowhere….</a>
</li>
<li class="post">
<a href="/blog/blog/2011/09/24/twitter-timeline-re-usable-class/">Twitter Timeline Re-usable Class - iOS</a>
</li>
<li class="post">
<a href="/blog/blog/2011/09/23/octopress-install-with-screencast/">Octopress Install With Screencast</a>
</li>
</ul>
</section>
<section>
<h1>Latest Tweets</h1>
<ul id="tweets">
<li class="loading">Status updating…</li>
</ul>
<script type="text/javascript">
$.domReady(function(){
getTwitterFeed("nikburns", 4, false);
});
</script>
<script src="/blog/javascripts/twitter.js" type="text/javascript"> </script>
<a href="http://twitter.com/nikburns" class="twitter-follow-button" data-width="208px" data-show-count="true">Follow @nikburns</a>
</section>
</aside>
</div>
</div>
<footer><p>
Copyright © 2012 - Nik Burns -
<span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
</p>
</footer>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-581486-4']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
<script type="text/javascript">
(function() {
var script = document.createElement('script'); script.type = 'text/javascript'; script.async = true;
script.src = 'https://apis.google.com/js/plusone.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(script, s);
})();
</script>
<script type="text/javascript">
(function(){
var twitterWidgets = document.createElement('script');
twitterWidgets.type = 'text/javascript';
twitterWidgets.async = true;
twitterWidgets.src = 'http://platform.twitter.com/widgets.js';
document.getElementsByTagName('head')[0].appendChild(twitterWidgets);
})();
</script>
<div id="fb-like"></div>
<script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
</body>
</html>