mirror of
https://github.com/firebase/firebase-ios-sdk
synced 2026-11-10 22:45:59 +05:45
211 lines
8.8 KiB
Objective-C
211 lines
8.8 KiB
Objective-C
/*
|
|||
|
|
* Copyright 2019 Google
|
||
|
|
*
|
||
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
|
* you may not use this file except in compliance with the License.
|
||
|
|
* You may obtain a copy of the License at
|
||
|
|
*
|
||
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
|
*
|
||
|
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
|
* See the License for the specific language governing permissions and
|
||
|
|
* limitations under the License.
|
||
|
|
*/
|
||
|
|
|
||
|
|
#import "MainViewController+Phone.h"
|
||
|
|
|
||
|
|
#import "AppManager.h"
|
||
|
|
|
||
|
|
NS_ASSUME_NONNULL_BEGIN
|
||
|
|
|
||
|
|
@implementation MainViewController (Phone)
|
||
|
|
|
||
|
|
- (StaticContentTableViewSection *)phoneAuthSection {
|
||
|
|
__weak typeof(self) weakSelf = self;
|
||
|
|
return [StaticContentTableViewSection sectionWithTitle:@"Phone Auth" cells:@[
|
||
|
|
[StaticContentTableViewCell cellWithTitle:@"Sign in With Phone Number"
|
||
|
|
action:^{ [weakSelf signInWithPhoneNumberWithPrompt]; }],
|
||
|
|
[StaticContentTableViewCell cellWithTitle:@"Link Phone Number"
|
||
|
|
action:^{ [weakSelf linkPhoneNumberWithPrompt]; }],
|
||
|
|
[StaticContentTableViewCell cellWithTitle:@"Unlink Phone Number"
|
||
|
|
action:^{ [weakSelf unlinkFromProvider:FIRPhoneAuthProviderID completion:nil]; }],
|
||
|
|
]];
|
||
|
|
}
|
||
|
|
|
||
|
|
- (void)signInWithPhoneNumber:(NSString *_Nullable)phoneNumber
|
||
|
|
completion:(nullable TestAutomationCallback)completion {
|
||
|
|
[self showSpinner:^{
|
||
|
|
[[AppManager phoneAuthProvider] verifyPhoneNumber:phoneNumber
|
||
|
|
UIDelegate:nil
|
||
|
|
completion:^(NSString *_Nullable verificationID,
|
||
|
|
NSError *_Nullable error) {
|
||
|
|
[self hideSpinner:^{
|
||
|
|
if (error) {
|
||
|
|
[self logFailure:@"failed to send verification code" error:error];
|
||
|
|
[self showMessagePrompt:error.localizedDescription];
|
||
|
|
if (completion) {
|
||
|
|
completion(error);
|
||
|
|
}
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
[self logSuccess:@"Code sent"];
|
||
|
|
[self commonPhoneNumberInputWithTitle:@"Code"
|
||
|
|
completion:^(NSString *_Nullable verificationCode) {
|
||
|
|
[self commontPhoneVerificationWithVerificationID:verificationID
|
||
|
|
verificationCode:verificationCode];
|
||
|
|
if (completion) {
|
||
|
|
completion(nil);
|
||
|
|
}
|
||
|
|
}];
|
||
|
|
}];
|
||
|
|
}];
|
||
|
|
}];
|
||
|
|
}
|
||
|
|
|
||
|
|
- (void)signInWithPhoneNumberWithPrompt {
|
||
|
|
[self commonPhoneNumberInputWithTitle:@"Phone #"
|
||
|
|
completion:^(NSString *_Nullable phone) {
|
||
|
|
[self signInWithPhoneNumber:phone completion:nil];
|
||
|
|
}];
|
||
|
|
}
|
||
|
|
|
||
|
|
- (void)commonPhoneNumberInputWithTitle:(NSString *)title
|
||
|
|
completion:(TextInputCompletionBlock)completion {
|
||
|
|
[self showTextInputPromptWithMessage:title
|
||
|
|
keyboardType:UIKeyboardTypePhonePad
|
||
|
|
completionBlock:^(BOOL userPressedOK, NSString *_Nullable phoneNumber) {
|
||
|
|
if (!userPressedOK) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
completion(phoneNumber);
|
||
|
|
}];
|
||
|
|
}
|
||
|
|
|
||
|
|
- (void)commontPhoneVerificationWithVerificationID:(NSString *)verificationID
|
||
|
|
verificationCode:(NSString *)verificationCode {
|
||
|
|
[self showSpinner:^{
|
||
|
|
FIRAuthCredential *credential =
|
||
|
|
[[AppManager phoneAuthProvider] credentialWithVerificationID:verificationID
|
||
|
|
verificationCode:verificationCode];
|
||
|
|
[[AppManager auth] signInWithCredential:credential
|
||
|
|
completion:^(FIRAuthDataResult *_Nullable result,
|
||
|
|
NSError *_Nullable error) {
|
||
|
|
[self hideSpinner:^{
|
||
|
|
if (error) {
|
||
|
|
[self logFailure:@"failed to verify phone number" error:error];
|
||
|
|
[self showMessagePrompt:error.localizedDescription];
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
if (self.isNewUserToggleOn) {
|
||
|
|
NSString *newUserString = result.additionalUserInfo.isNewUser ?
|
||
|
|
@"New user" : @"Existing user";
|
||
|
|
[self showMessagePromptWithTitle:@"New or Existing"
|
||
|
|
message:newUserString
|
||
|
|
showCancelButton:NO
|
||
|
|
completion:nil];
|
||
|
|
}
|
||
|
|
}];
|
||
|
|
}];
|
||
|
|
}];
|
||
|
|
}
|
||
|
|
|
||
|
|
- (void)linkPhoneNumber:(NSString *_Nullable)phoneNumber
|
||
|
|
completion:(nullable TestAutomationCallback)completion {
|
||
|
|
[self showSpinner:^{
|
||
|
|
[[AppManager phoneAuthProvider] verifyPhoneNumber:phoneNumber
|
||
|
|
UIDelegate:nil
|
||
|
|
completion:^(NSString *_Nullable verificationID,
|
||
|
|
NSError *_Nullable error) {
|
||
|
|
[self hideSpinner:^{
|
||
|
|
if (error) {
|
||
|
|
[self logFailure:@"failed to send verification code" error:error];
|
||
|
|
[self showMessagePrompt:error.localizedDescription];
|
||
|
|
if (completion) {
|
||
|
|
completion(error);
|
||
|
|
}
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
[self logSuccess:@"Code sent"];
|
||
|
|
|
||
|
|
[self showTextInputPromptWithMessage:@"Verification code:"
|
||
|
|
keyboardType:UIKeyboardTypeNumberPad
|
||
|
|
completionBlock:^(BOOL userPressedOK,
|
||
|
|
NSString *_Nullable verificationCode) {
|
||
|
|
if (!userPressedOK || !verificationCode.length) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
[self showSpinner:^{
|
||
|
|
FIRPhoneAuthCredential *credential =
|
||
|
|
[[AppManager phoneAuthProvider] credentialWithVerificationID:verificationID
|
||
|
|
verificationCode:verificationCode];
|
||
|
|
[[self user] linkWithCredential:credential
|
||
|
|
completion:^(FIRAuthDataResult *_Nullable result,
|
||
|
|
NSError *_Nullable error) {
|
||
|
|
[self hideSpinner:^{
|
||
|
|
if (error) {
|
||
|
|
if (error.code == FIRAuthErrorCodeCredentialAlreadyInUse) {
|
||
|
|
[self showMessagePromptWithTitle:@"Phone number is already linked to "
|
||
|
|
@"another user"
|
||
|
|
message:@"Tap Ok to sign in with that user now."
|
||
|
|
showCancelButton:YES
|
||
|
|
completion:^(BOOL userPressedOK,
|
||
|
|
NSString *_Nullable userInput) {
|
||
|
|
if (userPressedOK) {
|
||
|
|
// If FIRAuthErrorCodeCredentialAlreadyInUse error, sign in with the
|
||
|
|
// provided credential.
|
||
|
|
[self showSpinner:^{
|
||
|
|
FIRPhoneAuthCredential *credential =
|
||
|
|
error.userInfo[FIRAuthErrorUserInfoUpdatedCredentialKey];
|
||
|
|
[[AppManager auth] signInWithCredential:credential
|
||
|
|
completion:^(FIRAuthDataResult *_Nullable result,
|
||
|
|
NSError *_Nullable error) {
|
||
|
|
[self hideSpinner:^{
|
||
|
|
if (error) {
|
||
|
|
[self logFailure:@"failed to verify phone number" error:error];
|
||
|
|
[self showMessagePrompt:error.localizedDescription];
|
||
|
|
if (completion) {
|
||
|
|
completion(error);
|
||
|
|
}
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}];
|
||
|
|
}];
|
||
|
|
}];
|
||
|
|
}
|
||
|
|
}];
|
||
|
|
} else {
|
||
|
|
[self logFailure:@"link phone number failed" error:error];
|
||
|
|
[self showMessagePrompt:error.localizedDescription];
|
||
|
|
}
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
[self logSuccess:@"link phone number succeeded."];
|
||
|
|
if (completion) {
|
||
|
|
completion(nil);
|
||
|
|
}
|
||
|
|
}];
|
||
|
|
}];
|
||
|
|
}];
|
||
|
|
}];
|
||
|
|
}];
|
||
|
|
}];
|
||
|
|
}];
|
||
|
|
}
|
||
|
|
|
||
|
|
- (void)linkPhoneNumberWithPrompt {
|
||
|
|
[self showTextInputPromptWithMessage:@"Phone #:"
|
||
|
|
keyboardType:UIKeyboardTypePhonePad
|
||
|
|
completionBlock:^(BOOL userPressedOK, NSString *_Nullable phoneNumber) {
|
||
|
|
if (!userPressedOK || !phoneNumber.length) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
[self linkPhoneNumber:phoneNumber completion:nil];
|
||
|
|
}];
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
@end
|
||
|
|
|
||
|
|
NS_ASSUME_NONNULL_END
|