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

<channel>
	<title>iPhoneアプリ開発メモ</title>
	<atom:link href="http://www.omnibase.net/iphone_blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.omnibase.net/iphone_blog</link>
	<description>名古屋の暇なプログラマの逆引きリファレンス的な覚え書き。</description>
	<lastBuildDate>Sat, 25 Sep 2010 06:52:51 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>文字列の先頭、最後尾からの文字列の取り出し方</title>
		<link>http://www.omnibase.net/iphone_blog/?p=49</link>
		<comments>http://www.omnibase.net/iphone_blog/?p=49#comments</comments>
		<pubDate>Sat, 25 Sep 2010 06:52:51 +0000</pubDate>
		<dc:creator>まるやま</dc:creator>
				<category><![CDATA[文字列]]></category>
		<category><![CDATA[逆引きリファレンス]]></category>
		<category><![CDATA[NSString]]></category>

		<guid isPermaLink="false">http://www.omnibase.net/iphone_blog/?p=49</guid>
		<description><![CDATA[ある文字列の先頭から、指定分だけの文字列を取り出したり、指定した位置から文字列の最後までをとりだす方法です。
NSString *src = @&#8221;これは文字列です&#8221;;
// text には &#8 [...]]]></description>
			<content:encoded><![CDATA[<p>ある文字列の先頭から、指定分だけの文字列を取り出したり、指定した位置から文字列の最後までをとりだす方法です。</p>
<p>NSString *src = @&#8221;これは文字列です&#8221;;</p>
<p>// text には &#8220;これは&#8221;が入る<br />
text =  [src substringFromIndex:3];</p>
<p>// text には&#8221;列です&#8221;が入る<br />
text = [src  substringToIndex:3];</p>
]]></content:encoded>
			<wfw:commentRss>http://www.omnibase.net/iphone_blog/?feed=rss2&#038;p=49</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone SDK 4 を入れてみた &#8211; アプリ開発はどう変わるか（１）</title>
		<link>http://www.omnibase.net/iphone_blog/?p=27</link>
		<comments>http://www.omnibase.net/iphone_blog/?p=27#comments</comments>
		<pubDate>Fri, 25 Jun 2010 07:18:07 +0000</pubDate>
		<dc:creator>まるやま</dc:creator>
				<category><![CDATA[メモ]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPhone4]]></category>
		<category><![CDATA[SDK]]></category>
		<category><![CDATA[Xcode]]></category>
		<category><![CDATA[シミュレータ]]></category>

		<guid isPermaLink="false">http://www.omnibase.net/iphone_blog/?p=27</guid>
		<description><![CDATA[私は、手持ちの3GSをiOS4にしているのですが、iPhone SDK 4 をインストールして遊んでみました。
今の今いれてちょこっと遊んだだけなのですが、ちょっと雑感を書いてみる。
● iPhoneシミュレータに「iP [...]]]></description>
			<content:encoded><![CDATA[<p>私は、手持ちの3GSをiOS4にしているのですが、iPhone SDK 4 をインストールして遊んでみました。<br />
今の今いれてちょこっと遊んだだけなのですが、ちょっと雑感を書いてみる。</p>
<p><strong>● iPhoneシミュレータに「iPhone4」が追加されている</strong></p>
<p>まず、iPhoneシミュレータの「ハードウェア」-「デバイス」-「iPhone4」として、大きさを体験してみる。</p>
<p><a href="http://www.omnibase.net/iphone_blog/wp-content/uploads/2010/06/833f0bfb00a90fcdd7187704d2161539.png"><img class="alignnone size-medium wp-image-28" title="スクリーンショット（2010-06-25 15.13.14）" src="http://www.omnibase.net/iphone_blog/wp-content/uploads/2010/06/833f0bfb00a90fcdd7187704d2161539-300x187.png" alt="" width="300" height="187" /></a></p>
<p>結構な大きさ。これだけの大きさのものがあの小さなディスプレイで見えるのですから、どれだけiPhone4のディスプレイが綺麗かが分かりますね。</p>
<div style="height:30px">　</div>
<p><strong>● アプリケーションのマルチタスク化はどうすれば実現できるのか？</strong><br />
iOS4のマルチタスク化で、開発する側は何をすればいいのか。今までと開発手法は変わるんだろうか。</p>
<p>そこで、簡単なアプリケーションを作ってみました。画面をタップするとカウントアップするカウンターと、カウントダウンタイマーをつけて１秒に１デクリメントするようにする。こんな画面</p>
<p><a href="http://www.omnibase.net/iphone_blog/wp-content/uploads/2010/06/780c4ca5f391523d62d29a2511840a5e.png"><img class="alignnone size-medium wp-image-29" title="スクリーンショット（2010-06-25 15.39.48）" src="http://www.omnibase.net/iphone_blog/wp-content/uploads/2010/06/780c4ca5f391523d62d29a2511840a5e-161x300.png" alt="" width="161" height="300" /></a></p>
<p>startを押すと残り時間が１秒に１ずつ減り、タップすると、０のところが１，２，３，４と増えるってだけのアプリ。プログラムは特に今まで通りの組み方です。今までならホームボタンを押せば、終了して、もう一回起動すると最初からとなりますが、iPhone4ではどうなるか。</p>
<p>start押して、画面をタップする。カウンタがインクリメントされて、残り時間は減っています。<br />
<a href="http://www.omnibase.net/iphone_blog/wp-content/uploads/2010/06/2ad93708166a0c6077f7f6bce6a30b34.png"><img class="alignnone size-medium wp-image-30" title="スクリーンショット（2010-06-25 15.44.42）" src="http://www.omnibase.net/iphone_blog/wp-content/uploads/2010/06/2ad93708166a0c6077f7f6bce6a30b34-161x300.png" alt="" width="161" height="300" /></a></p>
<p>ここで、ホームボタンを押す。iPhone3GS以前では、これでアプリは終わりますが、iPhone4はバックグラウンドで停止したような状態になります。<br />
<a href="http://www.omnibase.net/iphone_blog/wp-content/uploads/2010/06/34789805887612155e574a0fa2034077.png"><img class="alignnone size-medium wp-image-31" title="スクリーンショット（2010-06-25 15.45.04）" src="http://www.omnibase.net/iphone_blog/wp-content/uploads/2010/06/34789805887612155e574a0fa2034077-161x300.png" alt="" width="161" height="300" /></a></p>
<p>ホームボタンをダブルクリックすると、バックグラウンドで動いているアプリの一覧が表示されますので、<br />
該当のアプリをタップして起動してみると・・・</p>
<p><a href="http://www.omnibase.net/iphone_blog/wp-content/uploads/2010/06/b560073b53c7ea7a6048fa6e9ac3344d.png"><img class="alignnone size-medium wp-image-32" title="スクリーンショット（2010-06-25 15.45.56）" src="http://www.omnibase.net/iphone_blog/wp-content/uploads/2010/06/b560073b53c7ea7a6048fa6e9ac3344d-161x300.png" alt="" width="161" height="300" /></a></p>
<p>おー、ちゃんと再開されている。残り時間は止めてあるあいだ減ってはいません。冷凍保存して、急速解凍して、心臓が再び動き出した感じです。<br />
もう一回ホームボタンを押す→ホームボタンをダブルクリック→該当のアプリを長押し→マイナス（ー）をタップして完全終了です。<br />
<a href="http://www.omnibase.net/iphone_blog/wp-content/uploads/2010/06/eb5a5ab87a9c2e8c5a71fb5d893ddb6c.png"><img class="alignnone size-medium wp-image-33" title="スクリーンショット（2010-06-25 15.46.18）" src="http://www.omnibase.net/iphone_blog/wp-content/uploads/2010/06/eb5a5ab87a9c2e8c5a71fb5d893ddb6c-161x300.png" alt="" width="161" height="300" /></a></p>
<p>というわけで、今まで通り作ってビルドすれば、マルチタスク対応になるっぽいです。</p>
<div style="height:30px">　</div>
<p><strong>● マルチタスキングに伴う、UIApplicationDelegateのメソッド追加</strong><br />
xcodeで最初に生成されるUIApplicationDelegateのコードもちょっと変わっている気がする。<br />
なんか見慣れないけど、それっぽいメソッドがある。</p>
<p>- (void)applicationWillResignActive:(UIApplication *)application<br />
- (void)applicationDidEnterBackground:(UIApplication *)application<br />
- (void)applicationWillEnterForeground:(UIApplication *)application<br />
- (void)applicationDidBecomeActive:(UIApplication *)application<br />
- (void)applicationWillTerminate:(UIApplication *)application</p>
<p>実際にどのタイミングで呼ばれるかを調べてみました。</p>
<p>【起動時】<br />
- (void)applicationDidBecomeActive:(UIApplication *)application</p>
<p>【ホームボタンを押して中断】<br />
- (void)applicationWillResignActive:(UIApplication *)application<br />
- (void)applicationDidEnterBackground:(UIApplication *)application<br />
の順番で呼ばれる</p>
<p>【復帰】<br />
- (void)applicationWillEnterForeground:(UIApplication *)application<br />
- (void)applicationDidBecomeActive:(UIApplication *)application<br />
の順番で呼ばれる</p>
<p>という感じです。</p>
<p>あれ、applicationWillTerminateは呼ばれないの？と思い公式ドキュメントを見てみると</p>
<blockquote><p>For applications that support background execution, this method is generally not called when the user quits the application because the application simply moves to the background in that case. However, this method may be called in situations where the application is running in the background (not suspended) and the system needs to terminate it for some reason.</p></blockquote>
<p>私のヘボ訳です。</p>
<blockquote><p>バックグラウンドでの実行をサポートしているアプリケーションにおいては、ユーザがアプリケーションを終了しても、このメソッドは一般的には呼ばれることはありません。なぜならば、単にバックグラウンド移っただけだからです。しかしながら、このメソッドはアプリケーションがバックグラウンドでサスペンドせずに動いているときに呼ばれることがあるかもしれません。</p></blockquote>
<p>ってことらしいので、普通のアプリでは呼ばれないらしい。iPhone4では「一部のアプリを覗いて」バックグラウンドではサスペンド状態、いわゆる凍結状態になっているので、呼ばれないよということです。バックグラウンドでも位置情報を取得するようなアプリケーションでは呼ばれることがあるのかもしれない。</p>
<div style="height:30px">　</div>
<p><strong>● マルチタスクをサポートしているかどうか調べる</strong><br />
ユーザの端末がマルチタスクをサポートしているかどうかは、以下のコードで調べられる（公式ドキュメントより引用）</p>
<p><code> UIDevice* device = [UIDevice currentDevice];<br />
BOOL backgroundSupported = NO;<br />
if ([device respondsToSelector:@selector(isMultitaskingSupported)])<br />
backgroundSupported = device.multitaskingSupported;</code></p>
<div style="height:30px">　</div>
<p><strong>● まとめ</strong><br />
まあ、そんなわけで、今まで通りプログラムを組んで、最新のSDKでビルドすれば、ホームボタンを押して中断した状態が維持され、再び起動したときに、中断した状態から再開するっていう結論でございます。中断再開時に必要に応じた処理をすることもできます。<br />
あと、上記テストプログラムにおいて、デバッグの時に、iPhoneシミュレータで完全にプロセスを切って再起動すると、真っ黒な画面しか出てこないんですが、実機に転送してやったら、ちゃんと動いて、大きな問題はありませんでした。</p>
<p>さっき１時間ほどさくっと触って書いてますので、間違ったことも書いてあるかもしれませんが、その時は優しくコメント欄でご指摘くださいまし。<br />
また、しばらくいじくって分かったことをメモしていきたいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.omnibase.net/iphone_blog/?feed=rss2&#038;p=27</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>シンプルなアラートを表示するには（メッセージとボタン１個）</title>
		<link>http://www.omnibase.net/iphone_blog/?p=23</link>
		<comments>http://www.omnibase.net/iphone_blog/?p=23#comments</comments>
		<pubDate>Tue, 15 Jun 2010 05:17:39 +0000</pubDate>
		<dc:creator>まるやま</dc:creator>
				<category><![CDATA[逆引きリファレンス]]></category>
		<category><![CDATA[通知]]></category>

		<guid isPermaLink="false">http://www.omnibase.net/iphone_blog/?p=23</guid>
		<description><![CDATA[シンプルなアラートを表示する方法。JavaScriptでいうalert()です。
- (IBAction) buttonClicked {
UIAlertView *alert = [[UIAlertView alloc [...]]]></description>
			<content:encoded><![CDATA[<p>シンプルなアラートを表示する方法。JavaScriptでいうalert()です。</p>
<p><code>- (IBAction) buttonClicked {<br />
UIAlertView *alert = [[UIAlertView alloc] init];<br />
alert.title = @"警告";<br />
alert.message = @"ボタンが押されました";<br />
[alert addButtonWithTitle:@"はい"];<br />
[alert show];<br />
[alert release];<br />
}</code></p>
<p>そうするとこうなります。<br />
<a href="http://www.omnibase.net/iphone_blog/wp-content/uploads/2010/06/Screenshot_1.png"><img src="http://www.omnibase.net/iphone_blog/wp-content/uploads/2010/06/Screenshot_1-156x300.png" alt="" title="UIAlertのサンプル" width="156" height="300" class="alignnone size-medium wp-image-24" /></a></p>
<p>上記では UIAlertViewをアロケートして、initした後にtitleとmessageプロパティを呼び出し、addButtonWithTitleメソッドでボタンのラベルを指定し、ボタンを追加しています。</p>
<p>以下のように書きなおすことができます。</p>
<p><code>	UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"警告"<br />
													 message:@"ボタンが押されました"<br />
													delegate:nil<br />
										   cancelButtonTitle:nil<br />
										   otherButtonTitles:@"はい", nil];<br />
	[alert show];<br />
[alert release];<br />
</code></p>
<p>アラート上のボタンが押されたのをトリガーになにか処理をさせたり、その他のボタンやキャンセルボタンをここにつけることもできますが、そのへんは後日別途書くことにしよう。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.omnibase.net/iphone_blog/?feed=rss2&#038;p=23</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>URLを指定して、そのページのHTMLを取得するには</title>
		<link>http://www.omnibase.net/iphone_blog/?p=12</link>
		<comments>http://www.omnibase.net/iphone_blog/?p=12#comments</comments>
		<pubDate>Sun, 13 Jun 2010 12:32:39 +0000</pubDate>
		<dc:creator>まるやま</dc:creator>
				<category><![CDATA[文字列]]></category>
		<category><![CDATA[逆引きリファレンス]]></category>
		<category><![CDATA[Foundation]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[iPhoneアプリ]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[URL]]></category>
		<category><![CDATA[取得]]></category>
		<category><![CDATA[指定]]></category>
		<category><![CDATA[開発]]></category>

		<guid isPermaLink="false">http://www.omnibase.net/iphone_blog/?p=12</guid>
		<description><![CDATA[特定のページのHTMLを取得するには、以下のようにしています。
   NSURL *url = [NSURL URLWithString:@"http://www.omnibase.net/"];
   NSString [...]]]></description>
			<content:encoded><![CDATA[<p>特定のページのHTMLを取得するには、以下のようにしています。</p>
<p><code>   NSURL *url = [NSURL URLWithString:@"http://www.omnibase.net/"];<br />
   NSString *html = [NSString stringWithContentsOfURL:url encoding:NSShiftJISStringEncoding error:nil];</code></p>
<p>NSURLのURLWithStringメソッドの引数に取得したいURLを指定します。そうするとNSURL型のオブジェクトが取得できるので、それをNSStringのstringWithContentsOfURL: encoding: error: に渡すと、NSStringでHTML文字列が帰ってきます。</p>
<p>encoding: のところには、取得先ページの文字コードを指定します。NSStringEncoding型の定数を指定します。</p>
<p>NSASCIIStringEncoding &#8230; ASCIIコード<br />
NSJapaneseEUCStringEncoding &#8230; EUC-JP<br />
NSUTF8StringEncoding &#8230; UTF8<br />
NSShiftJISStringEncoding &#8230; Shift-JIS<br />
NSISO2022JPStringEncoding &#8230; ISO-2022-JP(JIS)</p>
<p>error: は NSError型のオブジェクトへのポインタを渡すのですが、エラーに興味なければ nil を指定すればいいのです。そもそもエラーなら返り値がnilになりますので、私はnilをして、if(html == nil) みたいな感じで処理します。もしNSError型でエラーを捕捉する場合、</p>
<p><code>   NSError *error;<br />
   NSURL *url = [NSURL URLWithString:@"http://www.omnibase.net/"];<br />
   NSString *html = [NSString stringWithContentsOfURL:url encoding:NSShiftJISStringEncoding error:&#038;error];</code></p>
<p>とすればいいのです。</p>
<p>さて、encodeで取得先の文字コードを指定するの面倒なんで、自動取得できないかなーと思ってますが、私はうまい解決策を知りません。一応、NSStringにstringWithContentsOfURL: useEncoding: error:  というメソッドはあるにはあります。useEncodingにはNSStringEncoding型のポインタを渡すと、そこに読み込まれた文字列の文字コードを格納してくれるはずなんですが・・・実際にやってみるとうまくいかない。</p>
<p><code>NSStringEncoding enc;<br />
NSURL *url = [NSURL URLWithString:@"http://www.omnibase.net"];<br />
NSString *html = [NSString stringWithContentsOfURL:url usedEncoding:&#038;enc error:nil];<br />
</code></p>
<p>http://www.omnibase.net/ の文字列がUTF8以外の場合、encには0が、htmlはnilとなってうまく取得できない。UTF8にしたところうまく取得できました。</p>
<p>まとめ</p>
<blockquote><p>
+ (id)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc  error:(NSError **)error</p>
<p>urlで指定されたページの文字列を取得する。取得できない場合、指定された文字コードが異なる場合はnilが返るらしい。</p>
<p>url<br />
    取得先URL<br />
enc<br />
　文字コード<br />
error<br />
　エラーの詳細を知りたい場合はNSError型のオブジェクト 。不要の場合nil。
</p></blockquote>
<blockquote><p>
+ (id)stringWithContentsOfURL:(NSURL *)url usedEncoding:(NSStringEncoding  *)enc error:(NSError **)error</p>
<p>urlで指定されたページの文字列を取得する。取得した文字コードをencで指定されたアドレスに格納する。日本語ではUTF8以外は取得できないらしい。</p>
<p>url<br />
    取得先URL<br />
enc<br />
　文字コードを格納するポインタ。<br />
error<br />
　エラーの詳細を知りたい場合はNSError型のオブジェクト 。不要の場合nil。</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.omnibase.net/iphone_blog/?feed=rss2&#038;p=12</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

