ターミナルからリマインダを扱いたい
JXA ( JS for OSX app )でScriptingしてリマインダを扱うのもいい選択肢なんだけど、細い制御をしようと思うとやっぱりObjective-CやSwiftで記述したいなと思ってます。
remidner list
とかできたらいいよね
リマインダを扱うにはEventkit
リマインダを扱うにはEventKitを使う。EventKitでEKReminderがEKEventItemのサブセットとして作られている。リマインダ・リストは「カレンダ」と同等の扱いになっている。カレンダはEventStoreというデータベース(的なもの)に含まれている。
追加・一覧・削除・更新をやっていこうと思う。
CRUDを作る行為がプログラムの基本だし、データを扱うプログラムだと特に大事。ただ更新は(削除➝追加)で済ませることも多いからやらないかもしれない。
ターミナルからEventKitをObjective-C使う。
Objective-Cでやるのは情報リソースが多くて枯れてるから。
ターミナルからやるのはEventKitの処理に集中したいから。Cococaのウインドウと画面制御を作ってもAppleのReminder.appより良い物は出来ないし、ターミナルから使うことに意味があるとおもう
EventKitがいい理由。データの追加結果がすぐわかる。日付を取り扱える。
Xcodeでターミナルアプリの準備
リマインダのついか(とりあえず)
とりあえずリマインダに1件追加してみる。一番楽なので。
// // main.m // reminders // // Created by takuya on 20150619. // Copyright (c) 2015年 takuya. All rights reserved. // #import <Foundation/Foundation.h> #import <EventKit/EventKit.h> int main(int argc, const char * argv[]) { @autoreleasepool { EKEventStore *event_store = [[EKEventStore alloc]init]; EKCalendar *cal = [event_store defaultCalendarForNewReminders]; EKReminder *item = [EKReminder reminderWithEventStore:event_store]; item.title = @"Xcodeからはじめまして"; item.calendar = cal; NSError *error; if(![event_store saveReminder:item commit:YES error:&error]) NSLog(@"%@", error); } return 0; }
手順としては、
- EKEventStore でカレンダの保存先にアクセスする
- EKReminder をデフォルトリマインダで作る
- EKReminder にタイトルと保存先カレンダを指定
- EKReminder を 指定カレンダに保存
この4つ。
追加部分のコードについて
#import <EventKit/EventKit.h>
これは、EventKitを使うために書く import <> と import "" は C言語のiclude <> include ""と同じ。 参照ディレクトリ先から読む<>か、ファイルからの相対パスで読む” ” の違い。
@autoreleasepool {
まぁスレッドだね。
@"Xcodeからはじめ。。。"
NSString を定義するときは @"もじもじ". char *p でStrinng定義するときに "" を使うから区別。
NSStringのNSはNextStepの略、NextStepはOSXが昔そう呼ばれてた。NeXTがあったからこそOS"X" がある。
NSLog(@"%@", error);
NSLog は @"%@" でprintf 的な %d や %s が使える。これも%s が char *p と区別。
NSString は%@で表す。%sで表す訳にはいかないもんな。
次はリマインダの一覧を見る
リマインダの一覧と言っても
- 全リマインダの一覧
- リマインダリストの一覧
- リストに含まれるリマインダの一覧
ということになるし、リマインダのアイテム項目の中身を一覧する話も出てきてちょっと量が多くなるので別エントリに書きます。