Почему не работает вход Apple с FirebaseUI?

Следуя руководству здесь, я пытаюсь добавить вход Apple в свое приложение для iOS. Я успешно реализовал вход в Google с помощью этого метода, но Apple, похоже, не работает. Я могу дойти до того, что он запрашивает мой пароль Apple, но затем он просто продолжает загружаться безрезультатно, и я получаю следующие ошибки:

2020-12-10 13:19:38.020129-0500 Pikit[5268:114225] Could not signal service com.apple.WebKit.WebContent: 113: Could not find specified service
2020-12-10 13:19:38.121991-0500 Pikit[5268:114225] Could not signal service com.apple.WebKit.Networking: 113: Could not find specified service

Чтобы было ясно, эти ошибки появляются после того, как я решил поделиться своей электронной почтой с приложением и до фактического ввода пароля. Если я ввожу неправильный пароль, он информирует меня, но если я ввожу правильный пароль, он не продолжается. Не зависает, просто дальше без объяснений не пойдет.

Вот код, который запускает процесс входа в систему:

@IBAction func loginPressed(_ sender: UIButton) {
        
        let authUI = FUIAuth.defaultAuthUI()
        guard authUI != nil else {
           return
        }
        authUI?.providers = [
            FUIEmailAuth(),
            FUIGoogleAuth(),
            FUIOAuth.appleAuthProvider()
        ]
        authUI?.delegate = self
        let authViewController = authUI!.authViewController()
        authViewController.modalPresentationStyle = .overCurrentContext
        self.present(authViewController, animated: true, completion: nil)
        
    }
    
//This function is not being triggered
    func authUI(_ authUI: FUIAuth, didSignInWith authDataResult: AuthDataResult?, error: Error?) {
        if let user = authDataResult?.user{
            print("Nice! You've signed in as \(user.uid)")
            performSegue(withIdentifier: K.welcomeSegue, sender: self)
        }
        print(error!)
    }

Я также удостоверился, что мой проект Firebase включил Apple, что вход через Apple входит в мои права и что я загрузил свой ключ аутентификации iOS. Я запускаю это на симуляторе, нужно ли запускать его с реального устройства?

Обновлять

Функция authUI вообще не работает, так как я пытался вставить оператор печати вне условного оператора и не получил результата. Почему бы это не запуститься?

Ошибка возникает после того, как я вызываю метод present().

Обновление 2

Полный вывод консоли:

2020-12-11 13:53:55.697034-0500 Pikit[4563:85919] Task <9849E252-C9AF-4F35-88A7-1946BD0B4270>.<2> finished with error [-1003] Error Domain=NSURLErrorDomain Code=-1003 "A server with the specified hostname could not be found." UserInfo = {_kCFStreamErrorCodeKey=8, NSUnderlyingError=0x6000006edec0 {Error Domain=kCFErrorDomainCFNetwork Code=-1003 "(null)" UserInfo = {_kCFStreamErrorCodeKey=8, _kCFStreamErrorDomainKey=12}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <9849E252-C9AF-4F35-88A7-1946BD0B4270>.<2>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <9849E252-C9AF-4F35-88A7-1946BD0B4270>.<2>"
), NSLocalizedDescription=A server with the specified hostname could not be found., NSErrorFailingURLStringKey=https://firebasedynamiclinks-ipv6.googleapis.com/v1/installAttribution?key=AIzaSyDAKtfpyKw0QG5Db9jtdHYQfAOgI-FASWE, NSErrorFailingURLKey=https://firebasedynamiclinks-ipv6.googleapis.com/v1/installAttribution?key=AIzaSyDAKtfpyKw0QG5Db9jtdHYQfAOgI-FASWE, _kCFStreamErrorDomainKey=12}
2020-12-11 13:53:55.733365-0500 Pikit[4563:85634] [assertion] Error acquiring assertion: <Error Domain=RBSAssertionErrorDomain Code=3 "Target is not running or required target entitlement is missing" UserInfo = {RBSAssertionAttribute=<RBSDomainAttribute| domain:"com.apple.webkit" name:"Background" sourceEnvironment:"(null)">, NSLocalizedFailureReason=Target is not running or required target entitlement is missing}>
2020-12-11 13:53:55.733582-0500 Pikit[4563:85634] [ProcessSuspension] 0x1098fed80 - ProcessAssertion: Failed to acquire RBS Background assertion 'WebProcess Background Assertion' for process with PID 4565, error: Error Domain=RBSAssertionErrorDomain Code=3 "Target is not running or required target entitlement is missing" UserInfo = {RBSAssertionAttribute=<RBSDomainAttribute| domain:"com.apple.webkit" name:"Background" sourceEnvironment:"(null)">, NSLocalizedFailureReason=Target is not running or required target entitlement is missing}
2020-12-11 13:53:55.977723-0500 Pikit[4563:85800] 6.25.0 - [Firebase/Messaging][I-FCM012002] Error in application:didFailToRegisterForRemoteNotificationsWithError: remote notifications are not supported in the simulator
2020-12-11 13:53:56.045387-0500 Pikit[4563:85800] 6.25.0 - [Firebase/Analytics][I-ACS800023] No pending snapshot to activate. SDK name: app_measurement
2020-12-11 13:53:56.227368-0500 Pikit[4563:85800] 6.25.0 - [Firebase/Analytics][I-ACS800023] No pending snapshot to activate. SDK name: app_measurement
2020-12-11 13:53:56.282593-0500 Pikit[4563:85800] 6.25.0 - [Firebase/Analytics][I-ACS023012] Analytics collection enabled
2020-12-11 13:53:56.355765-0500 Pikit[4563:85824] 6.25.0 - [Firebase/Analytics][I-ACS023001] Deep Link does not contain valid required params. URL params: {
    dismiss = 1;
    "is_weak_match" = 1;
}
2020-12-11 13:54:25.474653-0500 Pikit[4563:85634] Could not signal service com.apple.WebKit.WebContent: 113: Could not find specified service
2020-12-11 13:54:25.749707-0500 Pikit[4563:85634] Could not signal service com.apple.WebKit.Networking: 113: Could not find specified service

Я пробовал несколько разных методов и много раз читал документацию, но до сих пор не вижу, что я делаю неправильно.

Обновление 3

Я пытался заменить каждый из сертификатов/ключей и восстановить новые безрезультатно.

Вот где меня остановили в потоке входа:

Обновление 4

Похоже, что указанная выше ошибка возникает не после входа в систему, но не связана с ней. При входе в систему я не получаю никаких ошибок. Я не понимаю, почему не срабатывает функция authUI().

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
1 350
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

вам нужно добавить права входа в Apple в свой идентификатор пакета приложений из учетной записи разработчика Apple, а из учетной записи разработчика Apple вам необходимо загрузить ключ и загрузить этот ключ в firebase, после чего ваш вход в Apple начнет работать, это очень часто очень легко создать ключ, найденный при первом поиске в Google.

и для меня это также работает на симуляторе, но для лучшего тестирования попробуйте на физическом устройстве

saqib kafeel 11.12.2020 19:45

Здравствуйте Сакиб и спасибо за ваш ответ. Я уже добавил права входа и загрузил ключ в свой проект firebase.

David 11.12.2020 19:46

Вы разрешили загрузку атрибутов из info.plist? <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>

saqib kafeel 11.12.2020 19:50

или, возможно, вам придется вызвать его в диспетчере DispatchQueue.main.async {}

saqib kafeel 11.12.2020 19:51

Я добавил это, и все еще есть тот же результат

David 11.12.2020 19:55

Чтобы было ясно, вы хотели запустить функцию present() в очереди отправки?

David 11.12.2020 20:52

используйте этот пример, я надеюсь, что он будет работать для вас

        let authUI = FUIAuth.defaultAuthUI()
        authUI?.shouldHideCancelButton = true
        authUI?.delegate = delegate
        authUI?.tosurl = Constants.Url.kFirebaseTermsOfService
        authUI?.privacyPolicyURL = Constants.Url.kFirebasePrivacyPolicy
        
        let emailAuth = FUIEmailAuth()
        let facebookAuth = FUIFacebookAuth(permissions: ["public_profile", "email"])
        let googleAuth = FUIGoogleAuth()
        
        var providers: [FUIAuthProvider] = [emailAuth, facebookAuth, googleAuth]
        if useAnonymous {
            let anonymousAuth = FUIAnonymousAuth()
            providers.append(anonymousAuth)
        }

        if #available(iOS 13.0, *) {
            let appleAuth = FUIOAuth.appleAuthProvider()
            providers.append(appleAuth)
        }

        authUI?.providers = providers
Ответ принят как подходящий

Я использовал Apple Signin в приложении, но это в Objective-c. Поток очень просто протестировать даже в Objective-C, если вы им не пользуетесь.

В представлении с логином я добавил это предложение для делегата.

@import Firebase;
@import GoogleSignIn;

@interface loginViewController () <GIDSignInDelegate, ASAuthorizationControllerDelegate>

Затем, после нажатия кнопки, я запускаю поток AppleSignIn ASAuthorizationControllerDelegate следующим образом:

- (IBAction)startSignInWithAppleFlow:(id)sender
{
    if (@available(iOS 13.0, *)) {
        NSString *nonce = [self randomNonce:32];
        self.currentNonce = nonce;
        ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init];
        ASAuthorizationAppleIDRequest *request = [appleIDProvider createRequest];
        request.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail];
        request.nonce = [self stringBySha256HashingString:nonce];

        ASAuthorizationController *authorizationController = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]];
        authorizationController.delegate = self;
        authorizationController.presentationContextProvider = self;
        [authorizationController performRequests];
    }
}

- (NSString *)stringBySha256HashingString:(NSString *)input
{
    const char *string = [input UTF8String];
    unsigned char result[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(string, (CC_LONG)strlen(string), result);

    NSMutableString *hashed = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
    for (NSInteger i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
        [hashed appendFormat:@"%02x", result[i]];
    }
    return hashed;
}

- (NSString *)randomNonce:(NSInteger)length
{
    NSAssert(length > 0, @"Expected nonce to have positive length");
    NSString *characterSet = @"0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._";
    NSMutableString *result = [NSMutableString string];
    NSInteger remainingLength = length;

    while (remainingLength > 0) {
        NSMutableArray *randoms = [NSMutableArray arrayWithCapacity:16];
        for (NSInteger i = 0; i < 16; i++) {
            uint8_t random = 0;
            int errorCode = SecRandomCopyBytes(kSecRandomDefault, 1, &random);
            NSAssert(errorCode == errSecSuccess, @"Unable to generate nonce: OSStatus %i", errorCode);

            [randoms addObject:@(random)];
        }

        for (NSNumber *random in randoms) {
            if (remainingLength == 0) {
                break;
            }

            if (random.unsignedIntValue < characterSet.length) {
                unichar character = [characterSet characterAtIndex:random.unsignedIntValue];
                [result appendFormat:@"%C", character];
                remainingLength--;
            }
        }
    }
    
    return result;
}

- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0))
{
    if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {
        ASAuthorizationAppleIDCredential *appleIDCredential = authorization.credential;
        NSString *rawNonce = self.currentNonce;
        NSAssert(rawNonce != nil, @"Invalid state: A login callback was received, but no login request was sent.");

        if (appleIDCredential.identityToken == nil) {
            NSLog(@"Unable to fetch identity token.");
            return;
        }

        NSString *idToken = [[NSString alloc] initWithData:appleIDCredential.identityToken encoding:NSUTF8StringEncoding];
        if (idToken == nil) {
            NSLog(@"Unable to serialize id token from data: %@", appleIDCredential.identityToken);
        }

        // Initialize a Firebase credential.
        FIROAuthCredential *credential = [FIROAuthProvider credentialWithProviderID:@"apple.com"
                                                                            IDToken:idToken
                                                                           rawNonce:rawNonce];

        // Sign in with Firebase.
        [[FIRAuth auth] signInWithCredential:credential completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
            if (error != nil) {
                // Error. If error.code == FIRAuthErrorCodeMissingOrInvalidNonce,
                // make sure you're sending the SHA256-hashed nonce as a hex string
                // with your request to Apple.
                
                NSLog(@"%ld - %@ - %@", error.code, error.description, error.localizedDescription);
                
                return;
            }
            // Sign-in succeeded!
            // User successfully signed in. Get user data from the FIRUser object
            if (authResult == nil) { return; }
            FIRUser *user = authResult.user;
            // ...
            NSLog(@"%@", user);
            
            // ...
            [[NSNotificationCenter defaultCenter] postNotificationName:@"LOGIN_SUCCESSFUL" object:nil];
            [self dismissViewControllerAnimated:YES completion:nil];
        }];
    }
}

- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error API_AVAILABLE(ios(13.0))
{
    NSLog(@"Sign in with Apple errored: %@", error);
}

Я не знаю, следовали ли вы примечаниям по этой ссылке: Apple Sign In with FireBase Но если вы будете следовать им, это должно работать на физическом устройстве, в симуляторе это не тривиально.

Спасибо, я решил свою проблему, но по какой-то причине они удалили мой ответ, так что вот.

David 19.12.2020 20:28

Несчастный. Я действительно мог бы использовать ответ на этот вопрос. Конечно, я мог бы использовать приведенный выше ответ и настроить вход в Apple самостоятельно, но весь смысл FirebaseUI в том, чтобы иметь чистую библиотеку, которая позаботится об этом за нас. ты случайно не помнишь, что ты сделал, чтобы исправить это?

James Joshua Street 07.01.2021 10:18

Другие вопросы по теме