Firebase Authentication の iOS 導入手順【⑨ユーザープロフィール更新編】【SwiftUI】

今回は、ログインユーザーのユーザー名とプロフィール画像の変更を行う方法を解説します。

Firebase Authentication の iOS 導入手順【⑨ユーザープロフィール更新編】【SwiftUI】

ユーザーのプロフィールを変更するには、Auth.auth().currentUser からログインユーザーを取得し、そのユーザーから createProfileChangeRequest でリクエストオブジェクトを生成し、commitChanges をコールすることで行えます。

if let user = Auth.auth().currentUser {
    let req = user.createProfileChangeRequest()
    req.displayName = "新しい名前"
    req.photoURL = URL(string: "https://...")
    req.commitChanges(completion: { error in
        if error == nil {
            print("プロフィール変更完了!")
        } else {
            print(error?.localizedDescription ?? "")
        }
    })
}

SwiftUI でのサンプルプログラムを作成しましたのでご参考ください。

引用元:ふっかちゃん公式ページ
import SwiftUI
import FirebaseAuth

struct AuthTestUpdateUserProfile: View {
    
    @State private var userName = ""
    @State private var photoURL: URL?
    @State private var profileImageUrl = ""
    @State private var newUserName = ""
    
    var body: some View {
        VStack {
            Spacer()
            VStack {
                getPhotoURL()
                Spacer().frame(height: 30)
                Text(userName).font(.headline)
                Spacer().frame(height: 50)
                HStack {
                    Spacer(minLength: 50)
                    TextField("ユーザー名", text: $newUserName).textFieldStyle(RoundedBorderTextFieldStyle())
                    Spacer(minLength: 50)
                }
            }
            Spacer().frame(height: 30)
            VStack {
                HStack {
                    Spacer(minLength: 50)
                    TextField("プロフィール画像URL", text: $profileImageUrl).textFieldStyle(RoundedBorderTextFieldStyle())
                    Spacer(minLength: 50)
                }
            }
            Spacer().frame(height: 50)
            VStack {
                Button(action: {
                    if let user = Auth.auth().currentUser {
                        let req = user.createProfileChangeRequest()
                        req.displayName = self.newUserName
                        req.photoURL = URL(string: self.profileImageUrl)
                        req.commitChanges(completion: { error in
                            if error == nil {
                                self.userName = user.displayName ?? ""
                                self.photoURL = user.photoURL
                                print("プロフィール変更完了!")
                            } else {
                                print(error?.localizedDescription ?? "")
                            }
                        })
                    }
                }) {
                    Text("プロフィール変更")
                }
            }
            Spacer()
        }
        .onAppear() {
            if let user = Auth.auth().currentUser {
                self.userName = user.displayName ?? "匿名希望さん"
                self.photoURL = user.photoURL
            }
        }
    }
    
    private func getPhotoURL() -> AnyView {
        if photoURL != nil {
            return AnyView(URLImageView(viewModel: .init(url: photoURL?.absoluteString ?? "")))
        } else {
            return AnyView(Image("default_image"))
        }
    }
}

このサンプルはユーザーがログイン済みであることが前提となっています。ユーザーのログイン方法については下記の記事をご覧ください。

また、サンプル中に出てくる URLImageView はカスタムView で下記の記事で紹介していますのでこちらも合わせてご覧ください。

以上