カテゴリー: ツール制作

[Mac]StatusTimer / Mac用タイマーアプリ

StatusMenu_sc1
メニューバーの右側に常駐するアプリあるじゃないですか。

あれでタイマーが欲しいなと思っていた訳ですよ。それでしばらく情報を集めつつ、ちまちま作っていた訳ですが……出来ました!


  • Status Timer
    ステータスバーに常駐し、通知センターで教えてくれるタイマーアプリ。1分〜6時間まで対応。


    StatusMenu_set

    しかし、MacAppStoreで配布するにはアップル様にMacOSDeveloperとして登録して、今のiOSデベロッパーの年間1万円にさらに年間1万円を上納しないと出せない訳で……高いなー……また今度考えよう。

    そういう訳でこの辺に野良アプリとして置いときます。FREEです。

    ちなみにOSX10.9 Marvericksだと知らないアプリだから実行出来ませんとか言われると思いますが、MacAppStoreとMacDeveloperに登録していないとそう言われるようです。たぶん右クリックから実行するとかで実行出来たと思います。

    アプリは問題無いです。MacOSXのセキュリティ設定のせいです。アップルの囲い込みが激しいと思う今日この頃。

    以下興味のある人用、技術者向け読み物。

    メニューバーに常駐するアプリの作り方

    かいつまんで要点をまとめると次のような感じです。

    ・ドックに表示しないようにする
    ・起動時にウィンドウを表示しないようにする
    ・ステータスメニューアイテムを作って、クリックでメニューを表示するようにする

    ◯ ドックに表示しないように。
    TARGET>Info>Custom OSX Application Target PropatiesにApplication is Agentを追加。YES。

    ◯ ウィンドウを起動時に表示しないように。
    WindowのプロパティのVisible at launchをオフにする。

    StatusTimer_w_visible

    ◯ ステータスバー用のメニューをxibで作成。

    これを.mファイルにStatusMenuプロパティとして設定します。Ctrl+ドラッグですね。

    @interface stAppDelegate ()
      @property (weak) IBOutlet NSMenu *StatusMenu;
    @end
    

    ちなみにiOSだと@implementationにアウトレットが接続出来る訳ですが、Macだと出来ない模様。やると勝手に@prppertyが作成されてローカル変数の方はアンダーバー付きのものになります。

    個人的にこの方式は好きじゃないので、ローカル変数の方を削除。@propertyだけ残します。

    あと話が飛びますが、iOSで未だに@propertyを@synthesizeしてるのを良く見ます。@propertyは@synthesizeしなくともselfをつければアクセス出来ます。syhthesizeする方式は古いです。撲滅しましょう@synthesize。

    ◯ 本体(?)作成。ステータスバーに常駐するやつですね。ステータスアイテムと言うのが正式なのでしょうか?まあ仕組みが分かると本体では無いと言うことが分かりますがとりあえず。クリックした時にメニューが出るようにします。

    @implementation stAppDelegate{
        NSStatusItem *stItem;
    }
    
    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification{
    
      //ステータスバーのインスタンスを取得
      NSStatusBar *systemStatusBar = [NSStatusBar systemStatusBar];
    
      //ステータスアイテムを作成
      stItem = [systemStatusBar statusItemWithLength:NSVariableStatusItemLength];
      [stItem setHighlightMode:YES];//ハイライトする
    //  [stItem setTitle:@"StatTimer"]; //文字を設定する場合
      [stItem setImage:[NSImage imageNamed:@"Icon16.png"]];//画像アイコンを設定する場合
    
      //クリックした時にself.StatusMenuが表示されるようにする
      [stItem setMenu:self.StatusMenu];
    
    }
    

    ・あとはSettingとかQuitとかのメニュー項目をアクションやらOutletとして繋いだりして実装して行く訳です。この辺はiOSとほぼ同じです。

    参考リンク:
    http://cocoatutorial.grapewave.com/2010/01/creating-a-status-bar-application/

    http://genjiapp.com/blog/2013/01/04/how-to-develop-a-status-bar-app-for-os-x.html

    https://developer.apple.com/library/mac/documentation/cocoa/reference/applicationkit/classes/nsstatusitem_class/Reference/Reference.html

    Macで通知センターを使う方法

    NSUserNotificationCenterというものを使います。これが通知センターらしいです。これにNSUserNotificationオブジェクトを渡すと通知してくれる仕組みみたいです。

    まず起動時にヘッダーにNSUserNotificationCenterDelegate宣言して、applicationDidFinishLaunchingでデリゲート。

    [[NSUserNotificationCenter defaultUserNotificationCenter]setDelegate:self];
    

    次にローカル変数を宣言。なんでローカル変数にしてるかと言うと、キャンセルすることがあるからです。

    @implementation stAppDelegate{
        NSUserNotification *scheduleNotif;
    }
    

    以下のカスタムメソッドで実行します。

    //ノーティフィケーションをスケジュール
    -(void)setScheduleNotification:(int)min{
        
        scheduleNotif = [[NSUserNotification alloc]init];
        int scheduleTime = min * 60;
        scheduleNotif.deliveryDate = [NSDate dateWithTimeIntervalSinceNow:scheduleTime];
        scheduleNotif.title = [NSString stringWithFormat:NSLocalizedString(@"TimePassed", nil),min];
        scheduleNotif.informativeText = @"Status Timer";
        scheduleNotif.soundName = NSUserNotificationDefaultSoundName;
        
        [[NSUserNotificationCenter defaultUserNotificationCenter]scheduleNotification:scheduleNotif];
    
    }
    

    ちなみに、最後のscheduleNotification:をdeliverNotification:に変えるといくらdeliveryDateを設定しようともすぐさま実行されます(はまりどころ)。

    キャンセルする時はこう。アップル的にはリムーブらしいですね。

      [[NSUserNotificationCenter defaultUserNotificationCenter]removeScheduledNotification:scheduleNotif];
    

    おまけ

    なお、タイマーの分数を保存してる訳ですが、何でやってるのかと言うと、NSUserDefaultsです。そう、iOSにあるアレです。同じです。iOSで覚えたことは結構Macでも活かせます。ではまた。

Xcode5でサイズインスペクタが見えない

Delta?

Xcode5でiOS6とiOS7に対応するためにパーツにiOS6/7 Deltaと言う値を設定する必要があります。これを使えばあのアイヴデザインで生じたiOS6とiOS7とのにっくき差が吸収出来てしまうのです。手動ですが。んー、自動でやってくれって気もしないでも無いですが……。

で、これを実現するためにWebページの例を見ながらやってみました。AutoLayout外して…サイズインスペクタを……サイズインスペクタを……あれっ?……無いよ。

ググって辿り着いたのはやはりStackOverFlow。
http://stackoverflow.com/questions/19306762/inspector-size-on-xcode-5-is-showing-nothing

やー、毎回頼りになるねー。えーっと、クリックしろ?クリックと。ポチ。……ほう、畳まれてましたか……気付くの無理。

以上、何でデフォルトで畳まれているのかアップルに聞きたいでした〜。参考まで〜。

オマケ情報

実はこのデルタと言う値はナビゲーションバーの透明をオフにすることによって不要になります。ナビゲーションバーの分だから当然ちゃ当然なんですが。
Storyboardで設定出来ます。

[iPhone]ラーメン用。

ramen

iPhone用アプリ第2弾

MaMenu入れると3本目な気がしないでもないですが。

ラーメン用。ラーメン屋の券売機シミュレーター……風味のタイマー!こんな真夏に!……まあ、冬にでもなったら思い出してあげて下さい。

基本的にシミュレーターとして作ったので、拙者、素早く操作出来るUIとか捨て申した。捨て置いた。御免。一応そつなくタイマーとして機能しますけれども!

1〜7分まで測れます。

ラベルをカスタマイズ

ラベルがカスタマイズ出来ます。お好きなメニューに。有名店のあのメニューも再現可!……まあ、ラベルだけだけどね!

ノーティフケーション対応

ノーティフィケーション対応。いわゆる通知。アプリを終了しても本体にこの時間になったら教えてねって通知お願いしてあるので数分後にピロッとか通知が出ます。音も鳴ります。音の設定は本体の通知設定使ってるのでそっちで設定してね。
通知使ってるので設定したらゲームとかやっちゃってOK。シチュエーションとしては、お湯入れてタイマーかけて、なんかゲームとかTwitterとかやるって感じですね。

あ、おやすみモードとかいう罠があるので、夜中に使う場合は本体のそれをオフってやって下さい。じゃないと鳴りませぬ。

8カ国語対応とか

今回は比較的多言語にしやすい構造だったので8カ国語対応とかしてみました。主にインスタントラーメンの消費量が多い国とか。日本語、英語、簡体中国語、繁体中国語、ポルトガル語、スペイン語、フランス語、インドネシア語。

…まあ、多分怪しい言語になってるとは思いますけどね〜!


  • RamenIconラーメン用。 App
    カテゴリ: エンターティメント 価格: 無料 [詳細]
    ラーメン屋の券売機シミュレーター風味のタイマーアプリ。


[iPhone]kaimono 1.3で背景が設定出来るように

kaimono_1_3

背景画像を設定出来るように

ウチのスーパーウェポン(スーパーで使うウェポンの意)こと「kaimono」に背景画像を設定出来る機能をつけました。

開発環境だと簡単に画像をプロジェクトにドラッグドロップしてちょっと変更すれば設定出来るので、個人的にはけっこう前からやってたんですが、ついに誰でも。どなたでも。

画面遷移というもの

これをやるには設定画面を新設することが必須だった訳で。これがなかなか難しかった。今だとストーリーボードとやらを使えばチョチョイ(言い過ぎ)と出来るらしいのですが、このプロジェクト、まるで移行していないので、とりあえず勉強も兼ねて自力で画面遷移する方式をとってみました。やー、大変ダタヨ。

カメラまでつけた

やらなくても良かったんですが、iPhoneから画像を選択する方法を書いているWeb記事にはたいてい2番目に「カメラを起動」という項目がありまして。つけるしか!…(二日程格闘)…つきました!

いるかどうかは別として

個人的にうれしい機能なのですが、他の方はどうなのやら。まあ、設定画面自体は今後どうしてもいるものだし、スキルとしてiOSの画面遷移は必須なのでまあ良かったんですがはてさて。

ちなみに

PCまたはMacから画像を持ってくにはiTunesで写真を共有して、写真ライブラリから選択すれば出来ます。この辺分かりづらいんですよねー。

[iPhone]*おっと* マメニュが…

MaMenu0.6
MaMenu0.6

バカなっ!マメニュが0.6になったと言うのか!?

…という訳で、半年程放置してたマクドナルドメニューアプリ「MaMenu(β) 主にiPhone用」がver.0.6にアップデートしました。と言うか、ここ2日ぐらい作ってました!

特に書くことは無いんですが、

  • セーブが無い。閉じると消える。
  • カートから1個ずつ消せない。
  • 毎回地域設定する必要がある

とかとか、色々β版らしい不具合満載の最強の布陣でお送りしております。ウラーーッ!(おたけび)

お暇な方は触ってみて下さいませ。