Goalist Developers Blog

食欲の秋をしのぐためのアプリを作ってみた

Trick or Treat!渡部です。

f:id:watabe1028:20171031123524p:plain

最近食欲がやばいです。
栗、芋、南瓜の魅力に勝てません。
かといって運動もしたくありません。
 
このままでは太ってしまいます。
DevからDebuになったらおしまいです。

 
せめて夕飯だけでも抑えねば!と思い
何か役立つアプリを作ってみようと考えました。

毎日食べたものを記録するアプリは作るのも
使うのも面倒です。

 
何もしなくても戒めてくれるアプリ・・・

 
そうや!飯時に通知がくるアプリ作ったろ!
ってことで夕飯時に戒めの言葉を送ってくるアプリを作ろうと思います。
割と忙しいし面倒なので最低限の簡単な構成で作ろう!

 
手順
・適当に画面を作る
・ローカル通知を実装
・実行

サクッといきます!

 

適当に画面を作る

今回は画面は必要ないので弊社サービスを牛耳るふろぐん(4回目)の
ハロウィンバージョンを表示させます。
特に意味はありません。

f:id:watabe1028:20171031120621p:plain

 
 

ローカル通知を実装

次に通知の実装です。
前回にリモート通知の実装をしたので詳しくはそちらを参照ください。
まずは3秒後に通知がくるように実装します。
以下のコードを丸々コピペすればおけ!です。
AppDelegate.swiftに書きます。

import UIKit
import UserNotifications    // 追加
import NotificationCenter   // 追加

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        
        // 全ての通知を一括で削除
        UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
        
        // 通知許可ダイアログ
        UNUserNotificationCenter.current().requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in if granted {print("通知許可")}
        }
        
        // 通知の設定
        let notificationContent = UNMutableNotificationContent()
        notificationContent.title = "よう、デブ!"
        notificationContent.body = "飯食ってる場合じゃねーぞ!"
        notificationContent.sound = UNNotificationSound.default()
        
        // 3秒後に通知
        let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 3, repeats: false)
        let request = UNNotificationRequest.init(identifier: "YoDebuNotification", content: notificationContent, trigger: trigger)
        
        let notificationCenter = UNUserNotificationCenter.current()
        notificationCenter.add(request)
        notificationCenter.delegate = self
        
        return true
    }
    
    // 通知の受信
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler([.alert,.sound])
    }
    
    // 通知に対する操作
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {
        
        // alertで表示
        let contentBody = response.notification.request.content.body
        let alert:UIAlertController = UIAlertController(title: "何も食べません!", message: contentBody, preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: {
            (action:UIAlertAction!) -> Void in
            print("食べないことを誓いました。")
        }))
        self.window?.rootViewController?.present(alert, animated: true, completion: nil)
        
        completionHandler()
    }
}

 
 

実行

これを実行するとこんな感じで表示されます。

f:id:watabe1028:20171031122628p:plain

アプリを閉じていても
f:id:watabe1028:20171031122735p:plain

 
ふろぐんがにくたらしいですね!

 
 

次に時間を指定します。
だいたい21時ごろが夕飯の時間帯なので
21時に通知がくるように設定します。

    // 21時に設定
    let notificationContent = UNMutableNotificationContent()
    notificationContent.title = "よう、デブ!"
    notificationContent.body = "飯食ってる場合じゃねーぞ!"
    notificationContent.sound = UNNotificationSound.default()
        
    let date = DateComponents(hour:21)
    let trigger = UNCalendarNotificationTrigger.init(dateMatching: date, repeats: true)
    let request = UNNotificationRequest.init(identifier: "YoDebuNotification", content: notificationContent, trigger: trigger)
        
    let notificationCenter = UNUserNotificationCenter.current()
    notificationCenter.add(request)
    notificationCenter.delegate = self

以上で完了です。
UNCalendarNotificationTrigger.init(dateMatching: date, repeats: true)
のrepeatsをtrueにしとけば毎日繰り返し通知がくるようになります。

 
 

おわり

モンブラン、かぼちゃの煮物、焼き芋に秋刀魚。。。
なかなか食欲を抑えるのは厳しいですが
こういったアプリで自分を律することにします!
できれば・・・ですが・・・

今日はハロウィンのせいか
お菓子が賑わっています。
早速律することをやめます。

f:id:watabe1028:20171031162810j:plain