ホーム > iPhone
iPhoneのアーカイブ
Xcode 4.2で追加された機能 特にStoryBoard
StoryBoardはiOS5以上のiOS機器でしか動作しないようです。。。orz
なので、iOS5未満のiOS機器で動作させる必要がある場合には利用できません。
iOS5、iPhone 4Sが発表されて数週間が経過しました。
少しだけまとまった時間が確保できたのでiOS 5の新機能を調べたりXcode 4.2を弄っていると結構変わっていてびっくりしました。
その中でもXcode 4.2で追加されたStoryBoardがよさそうだったので説明してみようかと。
今まで、iOSのUI部分はIBで1画面づつ作って画面間の遷移はコードで書いて。。。
っとやっていましたが、このStoryBoardを使えば画面遷移の部分もIB側で設定することができるみたいです。
イメージとしては画面遷移図を書くような感じでIBで各画面を作って遷移方法を設定してっという流れです。
プロジェクトを新規で作った際に「Use StoryBoard」という設定が追加されています。
ちなみにプレフィックスを付けてくれる設定も追加されていました。AG~みたいにクラス名の前に好きなプレフィックスを追加してくれます。ただコレ、新規作成プロジェクトの際には最初にできるファイルにプレフィックスを付けてくれるんですけど、そのあとクラスを追加したときには自動的に付与されなかったんですね。。。あんまり意味ない気がする。
作成されたプロジェクトを見ると「MainStoryBoard.storyboard」というファイルがあります。
これを選択すると昔のIBと同じ様な画面が表示されます。
そしてここに右側ペインからViewControllerをドラッグして配置してみます。
矢印がついている方が最初に表示される画面になるのでそちら側にRound Rect Buttonを配置します。
配置したボタンからControlボタンを押しながらマウスでドラッグすると線が伸びるのでこれを先ほど配置したViewControllerに持って行って離します。
そうするとViewControllerを開く方法が「Push、Modal、Custom」と出てくるので今回はModalを選択してみます。
これだけでボタンを押したらモーダルビューが開くようになりました。(素晴らしい)※両画面とも白紙なのでこのままだとモーダルで開いている事がわかりにくいので自分で配置したViewController側にナビゲーションバーでも配置しておいてください。
ビルドして確認してみると正常に動作すると思います。
ここまでノーコーディングで出来るなんてXcodeも頑張ってるなっと。(←上から目線)
その他にもIBだけでテーブルビューの中身の作りこみが出来るようになったみたいです。
下図みたいな感じで。ただしここまでIB側で作り込むためにはUITableViewControllerじゃないとダメみたいです。(UIViewController+UITableViewじゃ表示されません。)
簡単な設定画面くらいならUI側をIBだけで作り込めるんじゃないかと。
IBを使うとUIの再利用性が悪かったりとiOS開発に慣れてくると色々と気になる所もありますが、GUIだけで色々できるのは初心者にも優しくて良いのではないかと。
あと、iOS5になってメモリ管理をコンパイラ?が良きに計らってくれて開発者が意識しなくてもよくなったみたいで、これも開発の敷居を下げたと思います。
その他にもiCloud、TwitterFreamworkとか色々と面白そうな機能が追加されたので色々と試してみようかと思います。
FingerPKというゲームをリリースしたり、Help meをアップデートしたり
初めてゲームアプリを作ってみました。
対戦型のサッカーPKゲームです。(コンピューター対戦とかは無い)
二ヶ月前くらい前に @LuckOfWise さんと東京に行ったときに思いついたアプリ。
本当はAndroidとiOSで対戦できるようにしたかったけど思ったより敷居が高かったので保留。
1台でも遊べるけど、2台のiOS機器があるとより楽しめます。
よろしければどうぞ。
Finger PK(無料)
そして、もう一本は初めて作ったiOSアプリ「Help me」をアップデートしました。
地味にダウンロードされ続けているこのアプリ。
デザインからソースまで1から作り直しました。昔のソースはね。。。ほら。w
機能も追加しましたよ。
- Facebookへ緊急事態を知らせるメッセージを投稿する機能
- iOS標準のメーラーでの送信機能
緊急メールをサーバー側で送っていたのですが(1タップで送信するため) 、送信元を偽装していたので届かない事も多かったみたいで。
タップ数は増えるけど標準メーラーで送信できるようにしました。
もう一つの機能は日本でもFacebookユーザーが増えてきたので、ウォールに投稿すれば友人が助けてくれるんじゃないかと思って。
詳しくは下記からどうぞ。
iOS 標準アプリの時計の様に指定時間・曜日にメッセージを通知する方法
iOS標準の時計アプリでは時間と曜日を指定して、その時間にアラームを通知する方法があります。
今回は同じような方法でメッセージを通知する方法がないかなぁ〜と思って調べました。(仕事で使う予定があるから)
やりたいことはこんな感じ
- アプリでメッセージを通知したい曜日と時間を設定
- アプリを終了(バックグラウンドでもOK)
- 指定した曜日と時間になったらメッセージを通知
- 「OK」ボタンを押下するとアプリが起動
で調べたけど、メッセージを通知するのはUIRemoteNotification、UILocalNotificationというのを使うらしい。
UIRemoteNotificationはサーバーを立ててそこからメッセージを一括送信する場合などに使うみたい。
UILocalNotificationは指定時間にメッセージを表示する方法で端末内で完結できる。
ということで、今回はUILocalNotificationを使う。
で今回最も悩んだのが、UILocalNotificationに指定曜日にメッセージを通知する方法。
repeatIntervalというプロパティがあるのですが、毎日とか毎時ならこれでOKなんだけど、指定曜日(毎週月・火・木)となると、できないみたい。(多分)
で色々と調べた結果、簡単に設定できるプロパティはないのではないかと。。。
Notification系のものは内部にカレンダー形式でローカル通知の予定を登録しているようなので、ぐるぐる回しながら自分で曜日を判断して登録するという方法を取りました。困ったときは回せば良い。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | [[UIApplication sharedApplication] cancelAllLocalNotifications]; NSInteger repeartCount = 7; for (NSInteger i = 0; i < repeartCount; i++) { date = [today dateByAddingTimeInterval:i * 24 * 60 * 60]; dateComponents = [calendar components:NSWeekdayCalendarUnit fromDate:date]; if ([selectedWeek containsObject:[NSNumber numberWithInteger:dateComponents.weekday - 1]]) { // Adding the local notification. dateString = [NSString stringWithFormat:@"%@ %@", [dateFormat stringFromDate:date], [timeFormat stringFromDate:notificationTime]]; if ([today compare:[format dateFromString:dateString]] == NSOrderedAscending) { notification.fireDate = [format dateFromString:dateString]; notification.timeZone = [NSTimeZone localTimeZone]; notification.alertBody = [NSString stringWithFormat:@"Notify:%@", dateString]; notification.soundName = UILocalNotificationDefaultSoundName; notification.alertAction = @"Open"; notification.repeatCalendar [[UIApplication sharedApplication] scheduleLocalNotification:notification]; } } |
1行目の「[[UIApplication sharedApplication] cancelAllLocalNotifications]」で現在登録されているメッセージ通知のカレンダーを全クリアします。これは後で何度もこの処理を実行するので重複してローカル通知が登録されないようにするためです。
3行目で繰り返しを行う日数を今日から含めて指定します。今回は今日から7日間に指定しました。最大で7日分のローカル通知の予定を登録します。UILocalNotificationは最大で60前後のカレンダーが登録できるみたいです。
5行目から指定回数分ループで回します。
6行目で日付を取得して、9行目でその日付の曜日を取得してその曜日が登録すべき曜日かを判断しています。selectedWeekには日曜日〜土曜日までを0〜6の数値で保持しているので、containsObjectで配列内の要素の存在確認を行っています。
登録すべき曜日であれば、11〜22行目の処理によってメッセージ通知の登録が行われていきます。
ちなみに15行目では登録する日付が過去日付ならば登録をスキップしています。今日が月曜日の12時でローカル通知を月曜日の6持で設定すると過去日付になるので1回目の通知が即座に表示されてしまうので。
でこの方法だと登録されているローカル通知を全部通知し終わってしまうと通知されなくなります。
そこで、UILocalNotificationのデリゲートを使って起動の度に上記の処理を実行します。
デリゲートはメッセージ通知のアクションボタンが押下されてアプリが起動される度に呼び出されるみたい。
1 2 3 4 5 6 7 8 9 10 11 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UILocalNotification *notification; notification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]; if (notification) { [LocalNotificationManager addLocalNotification]; } return YES; } |
でまずは、アプリが完全に終了(バックグラウンドで動作していない)している場合には、「application:didFinishLaunchingWithOptions:」から起動されます。
4〜8行目でこの起動がNotificationによるものなのか判断してもし、Notificationによるものだったら7行目でローカル通知の処理を実行しています。
1 2 3 4 5 | - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { [LocalNotificationManager addLocalNotification]; } |
でもう一個のデリゲートが「application:didReceiveLocalNotification:」でこちらはバックグラウンドでアプリが動作していた場合に呼ばれます。あとは先程と同様にローカル通知の処理を実行して完了です。
これでローカル通知が指定した曜日の時間に起動され、通知によってアプリが起動された場合には再度起動した日から7日間のスケジュールが再登録されるようになりました。
まあただこの方法だと、ローカル通知で呼び出しても起動されなかった場合には登録した通知を全て表示し終わった場合には通知されなくなりますね。
アプリ起動時に毎回ローカル通知の登録を行っても、やっぱり同じでアプリ起動もローカル通知による起動もまったく行われなかった場合にはいつか通知されなくなります。
永久的にローカル通知を表示することはできるのかな?(良い方法があればダレか教えて。)
ということで今回の確認に使ったサンプルをgithubに上げておきます。
もうちょっと使いやすい様にクラス化すればよかったんですけどね。。。それはオイオイということで。
ホーム > iPhone
- 検索
- フィード
- メタ情報










