Firebase Twitter oAuth回调不适用于Swift ios13

8tntrjer  于 2022-12-17  发布在  Swift
关注(0)|答案(3)|浏览(275)

我已经按照https://firebase.google.com/docs/auth/ios/twitter-login上的说明操作了Swift的T,我得到了一个Web弹出窗口,授权我在Twitter Dev上创建的应用程序,回调被调用,然后webview位于一个空页面about:blank上。除了点击Done按钮外,什么也做不了,然后导致错误域=FIRAuthErrorDomain代码=17058“用户取消了交互”。回调地址正确。我使用Twitter消费者API密钥作为进入Firebase控制台的密钥。
我错过了什么?

gjmwrych

gjmwrych1#

对于那些仍然在回调函数工作方面有问题的人,我已经设法修复了它。遗憾的是,您必须在库中编辑该方法(不是最好的方法,但仍然。错误已报告给firebase团队)。方法应如下所示(您可以在名为FIROAuthProvider.m的文件中找到它,第125行。我故意留下了注解行,所以你看到了那里的问题...希望它能帮助到别人:)

- (void)getCredentialWithUIDelegate:(nullable id<FIRAuthUIDelegate>)UIDelegate
                         completion:(nullable FIRAuthCredentialCallback)completion {
  if (![FIRAuthWebUtils isCallbackSchemeRegisteredForCustomURLScheme:self->_callbackScheme]) {
    [NSException raise:NSInternalInconsistencyException
                format:@"Please register custom URL scheme '%@' in the app's Info.plist file.",
                       self->_callbackScheme];
  }
//  __weak __typeof__(self) weakSelf = self;
//  __weak FIRAuth *weakAuth = _auth;
//  __weak NSString *weakProviderID = _providerID;
  dispatch_async(FIRAuthGlobalWorkQueue(), ^{
    FIRAuthCredentialCallback callbackOnMainThread =
        ^(FIRAuthCredential *_Nullable credential, NSError *_Nullable error) {
          if (completion) {
            dispatch_async(dispatch_get_main_queue(), ^{
              completion(credential, error);
            });
          }
        };
    NSString *eventID = [FIRAuthWebUtils randomStringWithLength:10];
    NSString *sessionID = [FIRAuthWebUtils randomStringWithLength:10];
//    __strong __typeof__(self) strongSelf = weakSelf;
    [self
        getHeadFulLiteURLWithEventID:eventID
                           sessionID:sessionID
                          completion:^(NSURL *_Nullable headfulLiteURL, NSError *_Nullable error) {
                            if (error) {
                              callbackOnMainThread(nil, error);
                              return;
                            }
                            FIRAuthURLCallbackMatcher callbackMatcher =
                                ^BOOL(NSURL *_Nullable callbackURL) {
                                  return [FIRAuthWebUtils
                                      isExpectedCallbackURL:callbackURL
                                                    eventID:eventID
                                                   authType:kAuthTypeSignInWithRedirect
                                             callbackScheme:self->_callbackScheme];
                                };
//                            __strong FIRAuth *strongAuth = weakAuth;
                            [_auth.authURLPresenter
                                     presentURL:headfulLiteURL
                                     UIDelegate:UIDelegate
                                callbackMatcher:callbackMatcher
                                     completion:^(NSURL *_Nullable callbackURL,
                                                  NSError *_Nullable error) {
                                       if (error) {
                                         callbackOnMainThread(nil, error);
                                         return;
                                       }
                                       NSString *OAuthResponseURLString =
                                           [self OAuthResponseForURL:callbackURL
                                                                     error:&error];
                                       if (error) {
                                         callbackOnMainThread(nil, error);
                                         return;
                                       }
                                       __strong NSString *strongProviderID = _providerID;
                                       FIROAuthCredential *credential = [[FIROAuthCredential alloc]
                                               initWithProviderID:strongProviderID
                                                        sessionID:sessionID
                                           OAuthResponseURLString:OAuthResponseURLString];
                                       callbackOnMainThread(credential, nil);
                                     }];
                          }];
  });
}
fbcarpbf

fbcarpbf2#

好吧,我解决了这个问题,但不完全确定现在是怎么解决的。我相信这是因为回调没有发出,因此没有被应用程序接收。回调不是由于身份验证发出的,我相信是因为我没有创建服务条款和隐私政策。所以请确保您在Twitter开发页面中完成了这些操作。
在twitter开发页面中,回调链接是:https://yourApp.firebaseapp.com/__/auth/handler当你启用twitter时,你会在你的firebase认证设置中找到这个。
确保您在info.plist LS应用查询方案中包含以下数组:推特
在您的swift文件中:

var provider = OAuthProvider(providerID: "twitter.com")

您的按钮操作:

@IBAction func onCustonTwitterButtonPressed(_ sender: Any) {
    MyAppsCoreServicesScripts.logoutSocial() // My logout routine.
    provider.getCredentialWith(nil) { credential, error in
    if let error = error {
        MyAppsCoreServicesScripts.showError(prefix: "Twitter Login",error: error, showMsg: true)
        } else if credential != nil {
            self.firebaseLogin(credential!)            
        }
    }
}

祝你好运!希望这对某人有帮助。

oyjwcjzk

oyjwcjzk3#

对我来说,没有必要修改框架。
如GitHub上的issue所述:提供程序属性应为
在类或全局级别声明
所以我把它的初始化从函数中移出来了。
之前:

class AuthViewController: UIViewController {
   private func signIn() {
      let provider = OAuthProvider(providerID: "twitter.com")
      provider.getCredentialWith(nil) { 
         ...
      }
   }
}

之后:

class AuthViewController: UIViewController {
   private let provider = OAuthProvider(providerID: "twitter.com")
   private func signIn() {
      provider.getCredentialWith(nil) { 
         ...
      }
   }
}

相关问题