先生.お辞儀を終える時間になりました!


機能概要表


先生たちはよくボランティアリストを学生たちに教えるのを忘れます.このような場合、担任と生徒、生徒部の先生の間で不要な誤解が生じる可能性があります.😅 それを防ぐため、コードン先生は授業が終わる5分前(4時35分)に目覚まし時計で担任にリストを確認します.

n/a.計画


理想的な計画🤩


最も理想的なのは、サーバがプッシュで送信されることです.これにより、学校のスケジュールに応じて異なる時間に通知を送信したり、学生部が必要に応じて通知を送信したりすることができます.しかし、プッシュ通知は実施しにくい.また、iOSのプッシュ通知は、アップルのサーバで送信する必要があります.

現実的な計画🤔


そのため、今回の発表は計画を簡素化する.先生はいつソフトウェアを開けても、私は当日の4時35分に目覚まし時計を登録します.例えば、先生が朝学生簿アプリを開くと、その日の午後に鳴る目覚まし時計を登録する方法です.

実施(アラーム機能フレームワークの実施)


アラームを具体的に作成する前に、まずアラーム機能のフレームワークのみを実現します.

Alarmserviceの作成


他のサービスのように、モノトーンの目覚まし時計サービスも実現しました.
  • の外部にアラートを登録するための関数です.UNUserNotificationCenterで通知権限を取得した後に通知を登録できます.
  • 通知センターに実際の通知を追加するための関数.まず、静的メッセージを追加しましたが、サーバと一緒にクラスの実際のデータを受信します.まず,テストのために3秒後に発行されるアラームを実施した.
  • struct AlarmService {
        //1️⃣
        static let shared = AlarmService()
        
        //2️⃣
        func registerAlarm() {
            let notiCenter = UNUserNotificationCenter.current()
            notiCenter.requestAuthorization(options: [.alert, .sound, .badge]) { didAllow, err in
                addAlarm()
            }
        }
        
    		
        private func addAlarm() {
            let notiCenter = UNUserNotificationCenter.current()
    	      
            let notiContents = UNMutableNotificationContent()
            notiContents.title = "종례 시간 알림"
            notiContents.sound = UNNotificationSound.default
            notiContents.subtitle = "오늘 생활지도 학생은 3명입니다."
    
            let notiTrigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false)
    
            let request = UNNotificationRequest(identifier: "teacherAlarm", content: notiContents, trigger: notiTrigger)
    
            notiCenter.add(request) { err in
                if let err = err {
                    print("DEBUG: Failed to addAlarm \(err)")
                }
            }
        }
    }

    AppDelegate通知


    AppDelegateのdidFinishLaunchingWithOptionsセクションにコードを追加し、アプリケーションの実行後すぐに通知を登録します.
    class AppDelegate: UIResponder, UIApplicationDelegate {
    
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
            
            AlarmService.shared.registerAlarm()
            
            return true
        }
    
    // 후략...
    
    }

    結果


    アプリケーションを開き、バックグラウンドに送信すると、3秒後にプロンプトが表示されます.

    インプリメンテーション(ダイナミックメッセージ)


    動的メッセージのGuidenceService APIの実装


    通常、学年とクラスをサーバに送信し、生活指導の学生数を受信するAPIを作成する必要があります.しかし、サーバの実装は簡単なので、クライアントから完全な生活指導リストを取得し、クラスに基づいてフィルタリングします.
    リストを読み込み、ガイドオブジェクトに置き換える配列は同じです.
    最後に,高次関数フィルタにより,1年生1組のみを選択し,countで数を数え,CompletionHandlerに入れて実行する.
    func fetchGuidanceNumOfHR(completionHandler: @escaping (Int) -> Void) {
        AF.request("\(SERVER_BASE_URL)/guidances").responseDecodable(of: Response<[GuidanceRawData]>.self) { data in
            guard let response = data.value else { return }
            guard response.isSuccess == true else { return }
            guard let rawdata = response.result else { return }
            let guidances = rawdata.map { rawData in
                return Guidance(rawData: rawData)
            }
            let guidanceCount = guidances.filter { guidance in
                guidance.student.grade == 1 && guidance.student.classNumber == 1
            }.count
            
            completionHandler(guidanceCount)
        }
    }

    動的メッセージAlarmserviceへの適用


    完了ハンドラにメッセージを登録するためのコードを挿入しました.メッセージには、APIを介して受信された学生の数が反映される.
    private func addAlarm() {
        GuidanceService.shared.fetchGuidanceNumOfHR { numOfGuidances in
            let notiCenter = UNUserNotificationCenter.current()
            
            let notiContents = UNMutableNotificationContent()
            notiContents.title = "종례 시간 알림"
            notiContents.sound = UNNotificationSound.default
            notiContents.subtitle = "오늘 생활지도 학생은 \(numOfGuidances)명입니다."
    
            let notiTrigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false)
    
            let request = UNNotificationRequest(identifier: "teacherAlarm", content: notiContents, trigger: notiTrigger)
    
            notiCenter.add(request) { err in
                if let err = err {
                    print("DEBUG: Failed to addAlarm \(err)")
                }
            }
        }
    }

    実装(所要時間)


    データ・コンポーネントの作成に使用するUtility関数の作成


    フレームワークを構築するときに使用するNotificationTreggerは、一定時間後に通知を発行できるトリガです.しかし、私たちが望んでいるのは、特定の時間に通知をトリガーすることです.このトリガを使用するには、DateComponentsオブジェクトをパラメータとして配置する必要があります.
    そこで、必要なデータコンポーネントを作成し、Utilitiesクラスに作成する関数を作成します.Date()を使用して今日の日付を取得し、DateComponentsオブジェクトに今日の日付と16:35の時刻を入力します.
    途中でguardゲートを通って週末に登録しないでください!(週末は仕事に関するお知らせが好きではありませんが、ほほほ)🤬 )
    class Utilities {
        // 오늘 알람이 울릴 dataComponents 만들기
        func getTodayAlarmDateComponents() -> DateComponents? {
            let date = Date()
            let calendar = Calendar.current
            
            // 주말이면 알림 등록 안함.
            guard calendar.isDateInWeekend(date) == false else { return nil }
            
            let year = calendar.component(.year, from: date)
            let month = calendar.component(.month, from: date)
            let day = calendar.component(.day, from: date)
            
            var dateComponents = DateComponents()
            dateComponents.timeZone = .current
            dateComponents.year = year
            dateComponents.month = month
            dateComponents.day = day
            dateComponents.hour = 16
            dateComponents.minute = 35
            
            return dateComponents
        }
    }

    UNCalendarNotificationTreggerの使用


    前述したように、UNCalendarNotificationTreggerは、特定の日付で通知をトリガすることを許可するトリガです.既存のトリガをUNCalendarNotificationTreggerに変換します.
    private func addAlarm() {
        GuidanceService.shared.fetchGuidanceNumOfHR { numOfGuidances in
            let notiCenter = UNUserNotificationCenter.current()
            
            let notiContents = UNMutableNotificationContent()
            notiContents.title = "종례 시간 알림"
            notiContents.sound = UNNotificationSound.default
            notiContents.subtitle = "오늘 생활지도 학생은 \(numOfGuidances)명입니다."
            
            let dateComponents = Utilities().getTodayAlarmDateComponents()
            
            let notiTrigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false)
    
            let request = UNNotificationRequest(identifier: "teacherAlarm", content: notiContents, trigger: notiTrigger)
    
            notiCenter.add(request) { err in
                if let err = err {
                    print("DEBUG: Failed to addAlarm \(err)")
                }
            }
        }
    }

    結果


    担任たちは今、毎日4時35分に自分のクラスで何人の学生が校門で指導を受けているかを知ることができます.

    終了時..。

  • アラーム機能は新しい課題です.しかし、公式ファイルとグーグルがあれば、私は怖くありません!
  • 英語トレーニングパートタイム(?)放送を終えて帰ってきた位置が不規則なので反省しますこれから頑張ります!
  • 以前に計画されていた機能が徐々に完了しています.嬉しいです^