[英]Firebase Twitter oAuth callback not working for Swift ios13
我已按照https://firebase.google.com/docs/auth/ios/twitter-login上的说明将 T 换成 Swift,我得到 web 弹出窗口授权我在 Twitter Dev 上创建的应用程序,回调被调用然后 webview 位于 about:blank 的空白页面上。 除了单击“完成”按钮外,什么也做不了,这会导致出现错误域=FIRAuthErrorDomain 代码=17058“交互已被用户取消。” 回调地址正确。 我使用 Twitter Consumer API Keys 作为进入 Firebase 控制台的密钥。
我错过了什么?
对于仍然有回调工作问题的每个人,我设法解决了它。 遗憾的是,您必须编辑库中的方法(不是最好的方法,但仍然。错误已报告给 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);
}];
}];
});
}
对我来说,不需要修改框架。
如 GitHub 上的一个问题所述:provider property should be
在 class 或全局级别声明
所以我只是把它的初始化移出了 function。
前:
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) {
...
}
}
}
好的,所以我解决了这个问题,但现在不完全确定如何。 我相信这是因为没有发出回调,因此没有被应用程序接收。 由于身份验证,回调不是问题,我相信是因为我没有创建服务条款和隐私政策。 因此,请确保您已在 Twitter 开发页面中完成此操作。
在 twitter 开发页面中,回调链接是: https://yourApp.firebaseapp.com/__/auth/handler当您启用 twitter 时,您将在 firebase 身份验证设置中找到它。
确保您在 info.plist LSApplicationQueriesSchemes 中有一个数组:twitter twitterauth
在您的 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!)
}
}
}
祝你好运! 希望这可以帮助某人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.