NSDateから日付を取る時に失敗した
iOSアプリのアップデートを申請、リリースされたんだけど、今回修正したバグのお話だよ。
先週の月曜日に「赤ちゃんの成長グラフ(Lite)」アプリのアップデートの申請をしたんだけど、無事土曜、日曜にリリースされたんだ。
育児パパ! サイトのデータをiPhoneアプリへ送る方法
↑内容はこんな感じなんだけど、ここでは謙虚にバグ修正の話を書いておくよ。徳川家康も三方ヶ原で武田信玄の軍にボコボコにされて凹んでるところの自画像を描かせたって言うし、、、うん、ちょっと話が飛びすぎたね。
そもそも今回のバグはブラジルのママさんから問い合わせが来たので気が付いたんだ。メールのアカウントからブラジル、名前をGoogleの画像検索で問い合わせると女性らしいのでブラジルのママさんと推測してるだけでホントはどうかは不明だけどね。でもやっぱりブラジル人女性ってだけでムチムチでサンバ踊ってるイメージしちゃってなんだかバグ対策頑張っちゃったよ。実はだいぶ前から同じ内容のクレームが某国のレビュー欄に記載されていたんだけど、何かの勘違いじゃないの?とスルーしてたんだ。酷い開発者だね。
ムチムチママさんにサンバのリズムで苦情を言われたらやっぱり対策しないと日本男児の名が廃るってことで重い腰を上げたわけだけど、内容がNSDateあたりの問題なのでホントにそんなバグがあるのか?ここ日本の開発環境で再現するのか?って疑問に思いつつコードをチェックしていたんだけどさ、やっぱりよくわからないんだ。国内のユーザーから同様の苦情が来たことなんてないし。iPhoneの設定に起因するモノで俺の開発環境じゃ再現しないのかなあと思いかけたんだけど、設定アプリの時刻をブラジルに設定してみたら、簡単に再現したんだよ!何度やっても再現するんだ。
もっともバグも再現するのは対処しやすいよね。ありがたいことだよ。
車がおかしいからディーラーに持って行ったのにいざ見てもらう時にはおかしい挙動がないことってホント悔しいもんね。ちくしょう!
ともかく不具合の原因はこんな感じ。
やりたかったのはNSDateオブジェクトから年月日の各数値を取り出したかったんだ。シンプルにしたコードはこんなところ:
date:2012-05-31 00:44:09 +0000
2012 / 5 / 31
って感じで出力されるんだ。実際に実行したのは真夜中じゃなくて31日の朝9:44分頃だよ。
次にiPhone実機の設定アプリにある
一般>日付と時刻>自動設定
ってところ、デフォルトはオンで東京になっていたんだけど、これを”オフ”にして”時間帯”をブラジルのサンパウロにしてみる。そうそう、この設定はiPhoneシミュレータにはないみたいだから実機でテストしたよ。

↑設定したところだけど、朝にやったのにステータスバーに表示される時刻は昨日の晩になってるね。今頃サンパウロは夜なんだな。
この状態で先ほどのコードを実行すると、
date:2012-05-31 00:44:50 +0000
2012 / 5 / 30
って出るんだ。NSDateが持つ情報は同じだけど日付がずれてる。現地じゃどうなのってのをNSCalendarが対応してるんだな。
ホントはここでも5/31って出力して欲しかったわけで、こういうのをありがた迷惑、、、じゃなくて開発者の無知って言うんだね。
結局NSCalendarオブジェクトに対して
先週の月曜日に「赤ちゃんの成長グラフ(Lite)」アプリのアップデートの申請をしたんだけど、無事土曜、日曜にリリースされたんだ。
育児パパ! サイトのデータをiPhoneアプリへ送る方法
↑内容はこんな感じなんだけど、ここでは謙虚にバグ修正の話を書いておくよ。徳川家康も三方ヶ原で武田信玄の軍にボコボコにされて凹んでるところの自画像を描かせたって言うし、、、うん、ちょっと話が飛びすぎたね。
そもそも今回のバグはブラジルのママさんから問い合わせが来たので気が付いたんだ。メールのアカウントからブラジル、名前をGoogleの画像検索で問い合わせると女性らしいのでブラジルのママさんと推測してるだけでホントはどうかは不明だけどね。でもやっぱりブラジル人女性ってだけでムチムチでサンバ踊ってるイメージしちゃってなんだかバグ対策頑張っちゃったよ。実はだいぶ前から同じ内容のクレームが某国のレビュー欄に記載されていたんだけど、何かの勘違いじゃないの?とスルーしてたんだ。酷い開発者だね。
ムチムチママさんにサンバのリズムで苦情を言われたらやっぱり対策しないと日本男児の名が廃るってことで重い腰を上げたわけだけど、内容がNSDateあたりの問題なのでホントにそんなバグがあるのか?ここ日本の開発環境で再現するのか?って疑問に思いつつコードをチェックしていたんだけどさ、やっぱりよくわからないんだ。国内のユーザーから同様の苦情が来たことなんてないし。iPhoneの設定に起因するモノで俺の開発環境じゃ再現しないのかなあと思いかけたんだけど、設定アプリの時刻をブラジルに設定してみたら、簡単に再現したんだよ!何度やっても再現するんだ。
もっともバグも再現するのは対処しやすいよね。ありがたいことだよ。
車がおかしいからディーラーに持って行ったのにいざ見てもらう時にはおかしい挙動がないことってホント悔しいもんね。ちくしょう!
ともかく不具合の原因はこんな感じ。
やりたかったのはNSDateオブジェクトから年月日の各数値を取り出したかったんだ。シンプルにしたコードはこんなところ:
//NSDateオブジェクト作成 NSDate *date = [NSDate date]; NSLog(@"date:%@",date); //年月日を取得する NSCalendar *calendar = [NSCalendar currentCalendar]; NSUInteger flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; NSDateComponents *cmp = [calendar components:flags fromDate:date]; NSLog(@"%d / %d / %d",cmp.year,cmp.month,cmp.day);これを普通に動かすと
date:2012-05-31 00:44:09 +0000
2012 / 5 / 31
って感じで出力されるんだ。実際に実行したのは真夜中じゃなくて31日の朝9:44分頃だよ。
次にiPhone実機の設定アプリにある
一般>日付と時刻>自動設定
ってところ、デフォルトはオンで東京になっていたんだけど、これを”オフ”にして”時間帯”をブラジルのサンパウロにしてみる。そうそう、この設定はiPhoneシミュレータにはないみたいだから実機でテストしたよ。

↑設定したところだけど、朝にやったのにステータスバーに表示される時刻は昨日の晩になってるね。今頃サンパウロは夜なんだな。
この状態で先ほどのコードを実行すると、
date:2012-05-31 00:44:50 +0000
2012 / 5 / 30
って出るんだ。NSDateが持つ情報は同じだけど日付がずれてる。現地じゃどうなのってのをNSCalendarが対応してるんだな。
ホントはここでも5/31って出力して欲しかったわけで、こういうのをありがた迷惑、、、じゃなくて開発者の無知って言うんだね。
結局NSCalendarオブジェクトに対して
[calendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];としておいたら期待通りに動いてくれたよ。
スポンサーサイト