Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
FirebaseAuthenticationをiOSに取り込んでみよう入門編
Search
Yuichi Nakayasu
April 16, 2019
Technology
960
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
FirebaseAuthenticationをiOSに取り込んでみよう入門編
2019/4/16 発表資料
https://classmethod.connpass.com/event/124390/
Yuichi Nakayasu
April 16, 2019
More Decks by Yuichi Nakayasu
See All by Yuichi Nakayasu
チームを作りながら サービスイン・プロダクトを開発した話
nkysyuichi
0
2.4k
Codable用のEncoder/Decoderを作ってみた
nkysyuichi
0
1.5k
Other Decks in Technology
See All in Technology
実体験から学ぶ分析エージェントの開発と運⽤
recruitengineers
PRO
8
2.4k
V8のArray.prototype.flatを最大約20倍速くするまでと、巨大OSSへの大規模コミットの道のり
riyaamemiya
0
290
パスキーの自動テストはどこまでいけるのか
teamlab
PRO
0
200
Browser Spec: Testing Hotwire with Ruby
takahashim
1
120
QA4AI 2026-Oct 生成AI時代の品質保証
tokuty
1
860
大型犬好きによるPugの紹介
yamanoku
1
160
AI駆動開発の時代になったのでトヨタ生産方式から見直す
terurou
7
6k
アウトプット初心者、半年間のふりかえり
4o1sobblue
0
430
AIにシークレットを見せない、WSL2で安全な開発環境
yazm
0
300
宣言型部分更新は何を解決しどこへ向かうのか
shuta13
1
450
脆弱性診断って、何をしているの? 〜弱点を見つけて、会社の改善につなげるまで〜
keeg
0
920
スプシの手作業からの解脱 ~更新はClaude Codeに、見せ方と使い方はGASアプリに任せる~
kentarofujii
0
150
Featured
See All Featured
Music & Morning Musume
bryan
48
7.4k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
820
Ruling the World: When Life Gets Gamed
codingconduct
0
400
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
270
Fireside Chat
paigeccino
43
4.1k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
330
Color Theory Basics | Prateek | Gurzu
gurzu
1
490
The agentic SEO stack - context over prompts
schlessera
0
970
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
2
330
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
330
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
58k
WCS-LA-2024
lcolladotor
0
890
Transcript
ΛJ04ʹऔΓࠐΜͰΈΑ͏
"#065.& த҆༎Ұ Ϋϥεϝιουגࣜձࣾ ϞόΠϧΞϓϦαʔϏε෦ J04ΞϓϦΤϯδχΞ ࠒ͔ΒΤϯδχΞ 7#1)1"4 ࠒ͔ΒJ04ΞϓϦ 0CKFDUJWF$
ͷ։ൃ Ϋϥεϝιουೖࣾ αοΧʔ؍ઓ Ψϯόେࡕ ݪόΠΫཱྀ ԭೄͬͨΑ
None
΄ͱΜͲͷΞϓϦͰɺϢʔβʔ*%Λࣝผ͢Δඞཁ͕͋Γ ·͢ɻΞϓϦͰϢʔβʔ*%Λࣝผ͢Δ͜ͱʹΑΓɺϢʔβʔ σʔλΛΫϥυʹ҆શʹอଘͨ͠ΓɺϢʔβʔͷͯ͢ ͷσόΠεͰɺΧελϚΠζ͞Εͨಉ͡ମݧΛఏڙͨ͠Γ Ͱ͖ΔΑ͏ʹͳΓ·͢ɻ ެࣜυΩϡϝϯτΑΓ
㾎ΞϓϦʹϢʔβͷҰҙੑΛ͍࣋ͨͤͨγʔϯଟ͍ 㾎ϩάΠϯػೳΛ࣮͢Δ͜ͱͰɺͦͷϢʔβʹಛԽͨ͠ ίϯςϯπΛఏڙ͍ͨ͠ 㾎͔͠͠ɺεΫϥονͰͦͷػೳΛ࡞Δͷ͕ߴ͍ 㾎'JSFCBTF"VUIFOUJDBUJPOΫϥυϕʔεͰ؆୯ʹͦ ͷػೳΛମݱ͢Δ͜ͱ͕Ͱ͖Δ 㾎ελʔτ෦ɺαʔόαΠυͷࣝ΄ͱΜͲෆཁ
४උ
'JSFCBTFϓϩδΣΫτͷ࡞
'JSFCBTFϓϩδΣΫτͷ࡞
'JSFCBTFϓϩδΣΫτͷ࡞ બ
'JSFCBTFϓϩδΣΫτͷ࡞ ໊લΛܾΊΔ ಉҙ
'JSFCBTF4%,ΛՃ
'JSFCBTF4%,ΛՃ
'JSFCBTF4%,ΛՃ J04ʹϥΠϒϥϦՃ J04ͷઃఆ
'JSFCBTF4%,ΛՃ
'JSFCBTF4%,ΛՃ όϯυϧ*% ઃఆ ΞϓϦ໊ ετΞ*%
'JSFCBTF4%,ΛՃ όϯυϧ*%
'JSFCBTF4%,ΛՃ %-͢Δ
'JSFCBTF4%,ΛՃ ϑΝΠϧΛ Ճ
'JSFCBTF4%,ΛՃ $PDPBQPET
'JSFCBTF4%,ΛՃ WJ1PEpMF QPE'JSFCBTF$PSF QPE'JSFCBTF"VUI QPEJOTUBMM
'JSFCBTF4%,ΛՃ
'JSFCBTF4%,ΛՃ import UIKit import Firebase @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate
{ var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { FirebaseApp.configure() return true } }
'JSFCBTF4%,ΛՃ import UIKit import Firebase @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate
{ var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { FirebaseApp.configure() return true } }
'JSFCBTF4%,ΛՃ
'JSFCBTF4%,ΛՃ 0,
"VUIFOUJDBUJPOͷઃఆ
"VUIFOUJDBUJPOͷઃఆ
"VUIFOUJDBUJPOͷઃఆ ϩάΠϯઃఆ
"VUIFOUJDBUJPOͷઃఆ
"VUIFOUJDBUJPOͷઃఆ ϝʔϧೝূ
"VUIFOUJDBUJPOͷઃఆ
"VUIFOUJDBUJPOͷઃఆ ༗ޮʹ͢Δ
४උྃ
αΠϯΞοϓػೳΛ࣮ ৽نϢʔβొ
αΠϯΞοϓ ϑϩʔΠϝʔδ
αΠϯΞοϓ import UIKit class SignUpViewController: UIViewController { @IBOutlet private weak
var nameTextField: UITextField! @IBOutlet private weak var emailTextField: UITextField! @IBOutlet private weak var passwordTextField: UITextField! @IBAction private func didTapSignUpButton() { // ͋ͱͰ࣮ } } ϏϡʔίϯτϩʔϥΛ࡞Δ
αΠϯΞοϓ ετʔϦʔϘʔυΛ ࡞Δ
αΠϯΞοϓ private func errorMessage(of error: Error) -> String { var
message = "Τϥʔ͕ൃੜ͠·ͨ͠" guard let errcd = AuthErrorCode(rawValue: (error as NSError).code) else { return message } switch errcd { case .networkError: message = "ωοτϫʔΫʹଓͰ͖·ͤΜ" case .userNotFound: message = "Ϣʔβ͕ݟ͔ͭΓ·ͤΜ" case .invalidEmail: message = "ෆਖ਼ͳϝʔϧΞυϨεͰ͢" case .emailAlreadyInUse: message = "͜ͷϝʔϧΞυϨεطʹΘΕ͍ͯ·͢" case .wrongPassword: message = "ೖྗͨ͠ೝূใͰαΠϯΠϯͰ͖·ͤΜ" case .userDisabled: message = "͜ͷΞΧϯτແޮͰ͢" case .weakPassword: message = “ύεϫʔυ͕੬ऑ͗͢·͢" default: break } return message } ΤϥʔॲཧΛઌʹ࡞͓͖ͬͯ·͢
αΠϯΞοϓ private func errorMessage(of error: Error) -> String { var
message = "Τϥʔ͕ൃੜ͠·ͨ͠" guard let errcd = AuthErrorCode(rawValue: (error as NSError).code) else { return message } switch errcd { case .networkError: message = "ωοτϫʔΫʹଓͰ͖·ͤΜ" case .userNotFound: message = "Ϣʔβ͕ݟ͔ͭΓ·ͤΜ" case .invalidEmail: message = "ෆਖ਼ͳϝʔϧΞυϨεͰ͢" case .emailAlreadyInUse: message = "͜ͷϝʔϧΞυϨεطʹΘΕ͍ͯ·͢" case .wrongPassword: message = "ೖྗͨ͠ೝূใͰαΠϯΠϯͰ͖·ͤΜ" case .userDisabled: message = "͜ͷΞΧϯτແޮͰ͢" case .weakPassword: message = “ύεϫʔυ͕੬ऑ͗͢·͢" default: break } return message } ΤϥʔॲཧΛઌʹ࡞͓͖ͬͯ·͢
αΠϯΞοϓ ΤϥʔॲཧΛઌʹ࡞͓͖ͬͯ·͢ private func showErrorIfNeeded(_ errorOrNil: Error?) { // Τϥʔ͕ͳ͚ΕԿ͠·ͤΜ
guard let error = errorOrNil else { return } let message = errorMessage(of: error) // ΤϥʔϝοηʔδΛऔಘ let alert = UIAlertController( title: nil, message: message, preferredStyle: .alert ) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) present(alert, animated: true, completion: nil) }
αΠϯΞοϓ 㾎ೖྗ͞Εͨ༰ΛόϦσʔτ͢Δ 㾎'JSFCBTFʹαΠϯΞοϓΛϦΫΤετ͢Δ 㾎αΠϯΞοϓͨ͠ΞΧϯτͷϢʔβ໊Λߋ৽͢Δ 㾎7FSJGZϝʔϧΛૹ৴͢Δ ॲཧͷྲྀΕ ׂѪ
αΠϯΞοϓ private func signUp(email: String, password: String, name: String) {
// FirebaseʹαΠϯΞοϓΛϦΫΤετ͢Δ } private func updateDisplayName(_ name: String, of user: User) { // αΠϯΞοϓͨ͠ΞΧϯτͷϢʔβ໊Λߋ৽͢Δ } private func sendEmailVerification(to user: User) { // VerifyϝʔϧΛૹ৴͢Δ } private func showSignUpCompletion() { // ྃͨ͜͠ͱΛදࣔ͢Δ } ॲཧͷྲྀΕ
αΠϯΞοϓ @IBAction private func didTapSignUpButton() { let email = emailTextField.text
?? "" let password = passwordTextField.text ?? "" let name = nameTextField.text ?? "" signUp(email: email, password: password, name: name) } αΠϯΞοϓϘλϯԡԼ࣌
αΠϯΞοϓ private func signUp(email: String, password: String, name: String) {
Auth.auth().createUser(withEmail: email, password: password) { [weak self] result, error in guard let self = self else { return } if let user = result?.user { self.updateDisplayName(name, of: user) } self.showErrorIfNeeded(error) } } 'JSFCBTFʹαΠϯΞοϓΛϦΫΤετ
αΠϯΞοϓ private func signUp(email: String, password: String, name: String) {
Auth.auth().createUser(withEmail: email, password: password) { [weak self] result, error in guard let self = self else { return } if let user = result?.user { self.updateDisplayName(name, of: user) } self.showErrorIfNeeded(error) } } 'JSFCBTFʹαΠϯΞοϓΛϦΫΤετ "VUIΦϒδΣΫτͷDSFBUF6TFS ͰϢʔβ࡞
αΠϯΞοϓ private func signUp(email: String, password: String, name: String) {
Auth.auth().createUser(withEmail: email, password: password) { [weak self] result, error in guard let self = self else { return } if let user = result?.user { self.updateDisplayName(name, of: user) } self.showErrorIfNeeded(error) } } 'JSFCBTFʹαΠϯΞοϓΛϦΫΤετ Ϣʔβ͕ਖ਼ৗʹऔಘͰ͖ͨΒ࣍
αΠϯΞοϓ private func updateDisplayName(_ name: String, of user: User) {
let request = user.createProfileChangeRequest() request.displayName = name request.commitChanges { [weak self] error in guard let self = self else { return } if error != nil { self.sendEmailVerification(to: user) } self.showErrorIfNeeded(error) } } αΠϯΞοϓͨ͠ΞΧϯτͷϢʔβ໊Λߋ৽
αΠϯΞοϓ private func updateDisplayName(_ name: String, of user: User) {
let request = user.createProfileChangeRequest() request.displayName = name request.commitChanges { [weak self] error in guard let self = self else { return } if error != nil { self.sendEmailVerification(to: user) } self.showErrorIfNeeded(error) } } αΠϯΞοϓͨ͠ΞΧϯτͷϢʔβ໊Λߋ৽ ϓϩϑΟʔϧมߋ༻ͷϦΫΤετΦϒδΣΫτΛ࡞Δ
αΠϯΞοϓ private func updateDisplayName(_ name: String, of user: User) {
let request = user.createProfileChangeRequest() request.displayName = name request.commitChanges { [weak self] error in guard let self = self else { return } if error != nil { self.sendEmailVerification(to: user) } self.showErrorIfNeeded(error) } } αΠϯΞοϓͨ͠ΞΧϯτͷϢʔβ໊Λߋ৽ มߋ͢Δ໊લΛೖ
αΠϯΞοϓ private func updateDisplayName(_ name: String, of user: User) {
let request = user.createProfileChangeRequest() request.displayName = name request.commitChanges { [weak self] error in guard let self = self else { return } if error != nil { self.sendEmailVerification(to: user) } self.showErrorIfNeeded(error) } } αΠϯΞοϓͨ͠ΞΧϯτͷϢʔβ໊Λߋ৽ DPNNJU$IBOHFT ͰมߋΛϦΫΤετ
αΠϯΞοϓ private func updateDisplayName(_ name: String, of user: User) {
let request = user.createProfileChangeRequest() request.displayName = name request.commitChanges { [weak self] error in guard let self = self else { return } if error != nil { self.sendEmailVerification(to: user) } self.showErrorIfNeeded(error) } } αΠϯΞοϓͨ͠ΞΧϯτͷϢʔβ໊Λߋ৽ Τϥʔ͕ͳ͚Ε࣍
αΠϯΞοϓ private func sendEmailVerification(to user: User) { user.sendEmailVerification { [weak
self] error in guard let self = self else { return } if error != nil { self.showSignUpCompletion() } self.showErrorIfNeeded(error) } } 7FSJGZϝʔϧΛૹ৴͢Δ
αΠϯΞοϓ private func sendEmailVerification(to user: User) { user.sendEmailVerification { [weak
self] error in guard let self = self else { return } if error != nil { self.showSignUpCompletion() } self.showErrorIfNeeded(error) } } 7FSJGZϝʔϧΛૹ৴͢Δ ϢʔβΦϒδΣΫτͷTFOE&NBJM7FSJpDBUJPO Ͱϝʔϧૹ৴
αΠϯΞοϓ private func sendEmailVerification(to user: User) { user.sendEmailVerification { [weak
self] error in guard let self = self else { return } if error != nil { self.showSignUpCompletion() } self.showErrorIfNeeded(error) } } 7FSJGZϝʔϧΛૹ৴͢Δ Τϥʔ͕ͳ͚ΕऴΘΓ
αΠϯΞοϓ 7FSJGZϝʔϧΛૹ৴͢Δ จ໘ͳͲ 'JSFCBTFίϯιʔϧͰ ΧελϚΠζͰ͖·͢
αΠϯΞοϓ let verified = Auth.auth().currentUser?.isEmailVerified ?? false 7FSJGZϝʔϧΛૹ৴͢Δ 7FSJGZ͞Ε͔ͨͲ͏͔ɺJT&NBJM7FSJpFEͰऔಘͰ͖Δ
αΠϯΠϯػೳΛ࣮
αΠϯΠϯ ϑϩʔΠϝʔδ
αΠϯΠϯ αΠϯΠϯ import UIKit class SignInViewController: UIViewController { @IBOutlet private
weak var emailTextField: UITextField! @IBOutlet private weak var passwordTextField: UITextField! @IBAction private func didTapSignInButton() { // ͋ͱͰ࣮ } } ϏϡʔίϯτϩʔϥΛ࡞Δ
αΠϯΠϯ ॲཧͷྲྀΕ 㾎ೖྗ͞Εͨ༰ΛόϦσʔτ͢Δ 㾎'JSFCBTFʹαΠϯΠϯΛϦΫΤετ͢Δ ׂѪ
αΠϯΠϯ @IBAction private func didTapSignInButton() { let email = emailTextField.text
?? "" let password = passwordTextField.text ?? "" signIn(email: email, password: password) } αΠϯΠϯϘλϯԡԼ࣌
αΠϯΠϯ private func signIn(email: String, password: String) { Auth.auth().signIn(withEmail: email,
password: password) { [weak self] result, error in guard let self = self else { return } if let user = result?.user { self.showSignInCompletion() } self.showErrorIfNeeded(error) } } 'JSFCBTFʹαΠϯΠϯΛϦΫΤετ
αΠϯΠϯ private func signIn(email: String, password: String) { Auth.auth().signIn(withEmail: email,
password: password) { [weak self] result, error in guard let self = self else { return } if let user = result?.user { self.showSignInCompletion() } self.showErrorIfNeeded(error) } } 'JSFCBTFʹαΠϯΠϯΛϦΫΤετ "VUIΦϒδΣΫτͷTJHO*O ͰαΠϯΠϯ
αΠϯΠϯ private func signIn(email: String, password: String) { Auth.auth().signIn(withEmail: email,
password: password) { [weak self] result, error in guard let self = self else { return } if let user = result?.user { self.showSignInCompletion() } self.showErrorIfNeeded(error) } } 'JSFCBTFʹαΠϯΠϯΛϦΫΤετ Ϣʔβ͕ਖ਼ৗʹऔಘͰ͖ͨΒྃ
ͦͷଞͷػೳΛ࣮
ͦͷଞͷػೳ private func passwordReset() { let email = emailTextField.text ??
"" Auth.auth().sendPasswordReset(withEmail: email) { [weak self] error in guard let self = self else { return } if error != nil { self.showPasswordResetCompletion() } self.showErrorIfNeeded(error) } } ύεϫʔυϦηοτ
ͦͷଞͷػೳ private func passwordReset() { let email = emailTextField.text ??
"" Auth.auth().sendPasswordReset(withEmail: email) { [weak self] error in guard let self = self else { return } if error != nil { self.showPasswordResetCompletion() } self.showErrorIfNeeded(error) } } ύεϫʔυϦηοτ "VUI ΦϒδΣΫτͷTFOE1BTTXPSE3FTFU Ͱϝʔϧૹ৴
ͦͷଞͷػೳ private func passwordReset() { let email = emailTextField.text ??
"" Auth.auth().sendPasswordReset(withEmail: email) { [weak self] error in guard let self = self else { return } if error != nil { self.showPasswordResetCompletion() } self.showErrorIfNeeded(error) } } ύεϫʔυϦηοτ Τϥʔ͕ͳ͚Εྃ
ͦͷଞͷػೳ ͦͷଞͷػೳ private func signOut() { do { try Auth.auth().signOut()
} catch let error { showErrorIfNeeded(error) } } αΠϯΞτ
ͦͷଞͷػೳ private func signOut() { do { try Auth.auth().signOut() }
catch let error { showErrorIfNeeded(error) } } αΠϯΞτ ίʔϧόοΫͷΫϩʔδϟͳ͍ͷͰɺEPUSZDBUDIͰΤϥʔॲཧ
ͦͷଞͷػೳ private func withdraw() { Auth.auth().currentUser?.delete() { [weak self] error
in guard let self = self else { return } if error != nil { self.showWithdrawalCompletion() } self.showErrorIfNeeded(error) } } ୀձ
ͦͷଞͷػೳ private func withdraw() { Auth.auth().currentUser?.delete() { [weak self] error
in guard let self = self else { return } if error != nil { self.showWithdrawalCompletion() } self.showErrorIfNeeded(error) } } ୀձ αΠϯΠϯதͷϢʔβͷEFMFUF ͰআΛϦΫΤετ
ͦͷଞͷػೳ private func withdraw() { Auth.auth().currentUser?.delete() { [weak self] error
in guard let self = self else { return } if error != nil { self.showWithdrawalCompletion() } self.showErrorIfNeeded(error) } } ୀձ Τϥʔ͕ͳ͚Εআྃ
·ͱΊ
㾎4%,ͷΈࠐΈͱ؆୯ͳιʔείʔυͰϩάΠϯػೳ͕ ؆୯ʹ࣮Ͱ͖Δ 㾎ϝʔϧૹ৴ʹ͍ͭͯϝιουΛݺͿ͚ͩ 㾎֤ϓϩόΠμͱΈ߹ΘͤΔ͜ͱͰߋʹϦονͳೝূػ ೳ࣮ݱՄೳ 㾎ಗ໊ϢʔβΛ࡞Δ͜ͱ 㾎'JSFTUPSF4UPSBHFͳͲʹΈ߹ΘͤΒΕΔ
ΛJ04ʹऔΓࠐΜͰΈΑ͏ ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠