Files
firebase-ios-sdk/Example/Auth/Sample/MainViewController+Phone.m
T
2019-04-23 12:08:39 -07:00

212 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