アプリ開発録

iPhoneアプリやその他開発で得られた知見をメモ

iPhoneアプリ:『インターバルリマインダー』開発録#1

概要

  • 英文と和訳を登録して定期的にランダムにリマインド通知してくれる
  • 英語学習のお供に
  • 通知では英文か和文かの片方だけを見せて、タップすると両方表示の画面へ飛ぶ

忘却曲線にもとづいて定期的に思い出す作業をサポートしてくれるアプリ。

導入ライブラリ検討

medium.com

  • Realm
  • DZNEmptyDataSet
  • Chameleon
  • Permission Scope
  • Hero
  • Onboard
  • RxSwift
  • Timepiece
  • CustomKeyboardTextField
  • fastlane

導入決定

  • Realm
  • Chameleon
  • Permission Scope
  • Onboard
  • fastlane

初日の成果

Realmを用いたデータ永続化に成功。

レコードを1件しか使用しないので、別にRealmを使う恩恵は薄いが、UserObjectsをそのまま使うのには面倒を感じていたし、次回以降のために後学として採用。

    let realm = try! Realm()
    var appdata: AppData = AppData()
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
          
        // データの読み込み(データはひとつしか持たないので常に.first)
        if realm.objects(AppData.self).first != nil {
            appdata = realm.objects(AppData.self).first!  // ---(1)
        } else {
            // データが存在しない場合、作成しadd
            print("データが存在しないので作ります")
            appdata.text = remindTextField.text
            appdata.remindInterval = 1
            appdata.remindType = RemindType.EnglishToJapanese.rawValue
            try! realm.write() {
                realm.add(appdata)
            }
        }

// 中略

    // キーボード終了メソッド
    func textViewShouldEndEditing(_ textView: UITextView) -> Bool {
        // ここに保存と通知登録の処理(Writeの中でデータを代入するだけでよい)
        try! realm.write() {  // ---(2)
            appdata.text = remindTextField.text
            appdata.remindInterval = 1
            appdata.remindType = RemindType.JapaneseToEnglish.rawValue
            print("書き込み処理完了")
        }

// 中略

class AppData: Object {
    dynamic var text = ""
    dynamic var remindType = RemindType.JapaneseToEnglish.rawValue
    dynamic var remindInterval = 1
}

enum RemindType: Int {
    case
    JapaneseToEnglish = 0,
    EnglishToJapanese = 1
}

(1)データの読み込み

レコードデータがないのに普通にappdata = realm.objects(AppData.self).first!で代入しようとするとエラーになった。

(2)データの更新

キーボードが終了した時にレコードを更新する処理。 writeメソッドのブロックの中でプロパティに代入するだけで書き込みが行われるらしい。簡単で便利。

展望

今回のアプリ提出にはfastlaneというものを使ってみようと思う。
CIツールを使うつもりはないけど、証明書関連で便利そうなので、その単体の機能だけでも使えるのか検証したい

labs.septeni.co.jp