アプリ開発録

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

『Interval Reminder』開発録 #3(finish)

インターバルリマインダーが配信開始しました。

Interval Reminder

Interval Reminder

  • Takumi Yoneta
  • 教育
  • ¥120

続きを読む

『インターバルリマインダー』 開発録#2

進捗

文字列のパースを済ませた

ペンを持ってる
I have a pen.
おまえだれだ
Who are you?

のようにひとつのTextViewに対して、一行ずつ和文と英文を交互に書いていって、それを2つ1セットとして処理して通知登録をするという処理。

// テキストのパース処理
    func parseText() -> [(jp:String, en:String)] {
        let text = remindTextField.text
        
        // 一行ずつ処理して、配列にセットにして処理する
        var lineIndex = 1
        var arr:[(jp:String, en:String)] = []
        var tmp = (jp:"", en:"")
        text?.enumerateLines{ (line, stop) -> () in
            if (lineIndex%2 != 0) {
                // 奇数の時(和文列の時)
                tmp.jp = line
            } else {
                // 偶数の時(英文列の時)、タプルを配列に追加
                tmp.en = line
                arr.append(tmp)
            }
            lineIndex += 1
        }
        // 和文と英文をセットにした配列を返す
        print(arr)
        return arr
    }

通知の発行

trigger = UNTimeIntervalNotificationTrigger(timeInterval: timeinterval , repeats: true)

のようにリピート設定にした一定間隔での通知処理をしたのだが、通知を登録した時点で一発目が発火されてしまって意図した動作にならない。

60秒間隔通知の設定であれば、登録後の60秒後に1発目の発火が来てほしいのだが、登録した瞬間に通知が来てしまう。

調べても原因がわからず、同じような現象にハマっている人がいたがバグのような事を言われているが詳細不明。

stackoverflow.com

これは実機でならなかったらOKにするが、実機でも同様の現象が起きたら解決すべき課題となる。

挑戦しようとしたが諦めたこと

和文と英文を交互に同一のテキスト上に配置するという、ややプログラマ向けの仕様のため、TextViewの背景に、2行で英語と日本語のワンセットという意図が伝わる背景画像(スクロールしてもテキストと一緒にスクロールされる)を設置したかったのだが、情報不足のため今回は断念。

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

【最短・最速・最小限】Herokuで動かすSlack Botの作り方まとめ

初めてSlackで動くBotを作ったが、とりあえずそんなに凝ったものはいらなくて、以下の要件を満たしていればよかった。

  • 特定の言葉に反応
  • スケジュールで定期的に特定の言葉を投稿

たったこれだけのことだが、断片的な情報しかなく、まとまったページがなくて意外と苦労したので決定版として記録。

このページの対象

  • Heroku(Node.js)とBotkitとSlackを使用
  • HerokuもBotokitもよくわからない
  • BotkitをHerokuでCron実行する方法を知りたい
  • このページの対象
    • 前提
  • 参考にしたページ
  • BotkitとHubotの違い
  • SlackでBotを作成しAPIを取得する
  • Herokuにログインしアプリを作成する
    • HerokuはGithubを経由しなくても直接デプロイできる
  • サンプルをダウンロードする
  • Botを動かしたいチャンネルへ招待する
  • ローカルでテストする
  • Herokuへアップ
  • Heroku Schedulerアドオンを追加し、Botのサーバーを寝かせないようにする
    • スケジュールの登録
  • 補足:チャンネルIDを特定する
  • 追記:平成29年2月22日
続きを読む

iPhoneアプリ『妄想通知』開発録

開発したアプリ

t.co

処女作『妄想通知』アプリ開発の記録。

自分がそうだったように、これから初めてアプリ開発をする人の助けや参考になる記事になるように、自分が直面した課題やつまづいた所、解決策等について記します。

  • 開発したアプリ
  • 開発動機
  • 構想
  • わからなかったこと
  • 学習
  • 直面した課題
    • Swiftで困惑した記法 
    • ルーセルみたいなパーツの作り方
      • iOSアプリでカルーセルビューの作り方
      • カスタムビュー(xib)を作成しそれを本体ビューで使う
        • 参考
      • サブビューの初期化コード
  • Swiftの配列
  • データの保存(自作クラスのシリアライズ
    • 書き込み
    • 読み込み
    • クラス
    • 参考
  • 背景写真の登録
    • コード
  • 多言語対応
  • 通知の登録
    • AppDelegete.swift
    • ViewController.swift
    • 参考
      • iOS10
      • iOS9以前の通知
  • 以下随時更新
  • 今後試してみたいこと
続きを読む