4
1

はじめに

こんにちは!
普段、開発作業を行なっていると、様々な問題が発生しますよね。

進捗がやや遅れ気味とかいまいち理解が追いつかないとか、それならまだ安心。
モチベーションの低下など、メンタル面に影響すると、大変なことになります。

特にメンタル面は早期に解決した方がいいので、少しでも早くアラートを上げるべき。
しかし、どのタイミングでアラートを上げるべきか、そして何を伝えるべきか、分からなかったりします。

そこで、今回は、ボタンを押すだけでアラートをGoogleチャットに送信するシンプルなiOSアプリを作成します。

少しでも解決の一助となれば幸いです。

要件

  • 名前を設定できる
  • Webhook URLを設定できる
  • 名前とWebhook URLはローカルストレージに保存され、次回起動時に利用される

準備

プロジェクトの作成方法は、Swift & SwiftUIでタロットカードアプリを作る を参照してください。

User InterfaceはSwiftUIを選択しました。

今回のディレクトリ構成

ContentViewを修正し、UserDefaultsManagerを追加してます。

実装

  • UserDefaultsManager
    UserDefaultsを用いたデータ保存
UserDefaultsManager.swift
//
//  UserDefaultsManager.swift
//  BossDash
//

import SwiftUI

struct UserDefaultsKeys {
    static let nameKey = "userName"
    static let webhookURLKey = "webhookURL"
}

class UserDefaultsManager: ObservableObject {
    @Published var name: String = ""
    @Published var webhookURL: String = ""

    init() {
        loadUserData()
    }

    func loadUserData() {
        name = UserDefaults.standard.string(forKey: UserDefaultsKeys.nameKey) ?? ""
        webhookURL = UserDefaults.standard.string(forKey: UserDefaultsKeys.webhookURLKey) ?? ""
    }

    func saveUserData() {
        UserDefaults.standard.set(name, forKey: UserDefaultsKeys.nameKey)
        UserDefaults.standard.set(webhookURL, forKey: UserDefaultsKeys.webhookURLKey)
    }
}
  • ContentView
ContentView.swift
import SwiftUI

struct ContentView: View {
    @StateObject var userDefaultsManager = UserDefaultsManager()
    @State private var isAlertPresented = false

    var body: some View {
        ZStack {
            VStack(spacing: 30) {
                Text("BossDash💨")
                    .font(.largeTitle)
                    .fontWeight(.bold)
                    .padding()

                TextField("Enter your name", text: $userDefaultsManager.name)
                    .padding()
                    .background(Color(UIColor.systemGray6))
                    .cornerRadius(10)
                TextField("Enter Webhook URL", text: $userDefaultsManager.webhookURL)
                    .padding()
                    .background(Color(UIColor.systemGray6))
                    .cornerRadius(10)

                Button("Hey Boss, Got a sec?") {
                    sendAlert()
                    isAlertPresented = true
                    userDefaultsManager.saveUserData()
                }
                .padding()
                .frame(maxWidth: .infinity)
                .foregroundColor(.white)
                .background(Color.blue)
                .cornerRadius(10)
                .font(.headline)
                .alert("Alert Sent!", isPresented: $isAlertPresented) {
                    Button("OK", role: .cancel) { }
                } message: {
                    Text("Notification sent to your boss!")
                }

                Spacer()
            }
            .padding(.top, 100)
            .padding()
        }
        .edgesIgnoringSafeArea(.top)
    }

    func sendAlert() {
        guard let url = URL(string: userDefaultsManager.webhookURL) else {
            print("Invalid URL")
            return
        }

        let message = "Hey Boss, just a heads-up:\n\n" + userDefaultsManager.name + " has a quick message for you."

        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")

        let jsonData = try! JSONEncoder().encode(["text": message])

        URLSession.shared.uploadTask(with: request, from: jsonData) { _, response, error in
            if let error = error {
                print("Error sending alert: \(error)")
            } else if let response = response as? HTTPURLResponse,
                     response.statusCode == 200 {
                print("Alert successfully sent!")
            } else {
                print("Failed to send alert.")
            }
        }
        .resume()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

動作確認

それでは、使ってみましょう!

シミュレーターで起動直後の状態。
名前とWebhook URLの入力欄、送信ボタンがあります。

名前とWebhook URLを入力し、ボタンを押しました!

Googleチャットのスペースに通知が届いてました!
これで上長が 「なんかあった?」 と対応してくれますね😃

スクリーンショット 2024-06-15 15.37.15.png

なお、名前とWebhook URLは保存されるので、次回起動時には、ボタンをタップするだけで上長を気軽に召喚できます👍

まとめ

今回は、上長に「ちょっといい?」と気軽に声をかけられるアプリを作ってみました。

ボタン一つでメッセージが飛ぶのは便利ですね。

色々と応用できると思うので、みなさんも作ってみてください🙂

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1