Я создаю тестовое приложение с использованием MailCore2 и GTMAppAuth и столкнулся с этой ошибкой:
Не удалось установить стабильное соединение с сервером.
Я следил за различными сообщениями SO, такими как this , this и this , и поэтому я думаю, что мой код должен быть правильным.Моя реализация выглядит следующим образом:
//At AppDelegate
var currentAuthorizationFlow: OIDAuthorizationFlowSession?
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool
{
if currentAuthorizationFlow!.resumeAuthorizationFlow(with: url) {
self.currentAuthorizationFlow = nil
return true
}
return false
}
class ViewController: UIViewController {
let kIssuer = "https://accounts.google.com"
let kClientID = "\(MY_CLIENTID).apps.googleusercontent.com"
let kRedirectURI = "com.googleusercontent.apps\(MY_CLIENTID):/oauthredirect"
let kExampleAuthorizerKey = "googleOAuthCodingKey"
override func viewDidLoad() {
super.viewDidLoad()
authenticateGmail()
}
func authenticateGmail() {
let issuer = URL(string: kIssuer)!
let redirectURI = URL(string: kRedirectURI)!
let appDelegate = UIApplication.shared.delegate as! AppDelegate
OIDAuthorizationService.discoverConfiguration(forIssuer: issuer) { (configuration, error) in
//handleError
if let configuration = configuration {
let scopes = [OIDScopeOpenID, OIDScopeProfile, "https://mail.google.com/"]
let request = OIDAuthorizationRequest(configuration: configuration, clientId: self.kClientID, scopes: scopes, redirectURL: redirectURI, responseType: OIDResponseTypeCode, additionalParameters: nil)
appDelegate.currentAuthorizationFlow = OIDAuthState.authState(byPresenting: request, presenting: self, callback: { (authState, error) in
//handleError
if let authState = authState {
if let accessToken = authState.lastTokenResponse?.accessToken {
NSLog("Successfully authenticated: %@", accessToken)
self.fetchEmailsFromGmail(accessToken: accessToken)
}
}
})
}
}
}
func fetchEmailsFromGmail(accessToken: String) {
let session = MCOIMAPSession()
session.hostname = "imap.gmail.com"
session.port = 993
session.username = "XXX@\(COMPANY_DOMAIN)"
session.authType = .xoAuth2
session.connectionType = .TLS
session.oAuth2Token = accessToken
let fetchFolderOperation = session.fetchAllFoldersOperation()
fetchFolderOperation?.start({ (error, folders) in
//handleError
if let folders = folders, !folders.isEmpty {
print(folders)
}
})
}
Моя реализация позволяет мне успешно проходить аутентификацию, то есть печатается accessToken
.Но когда он пытается извлечь папки, он выдает:
Не удалось установить стабильное соединение с сервером.
Дело в том, что это можно решитьвыполнив оба следующих действия:
- , обеспечивающих менее безопасный доступ к приложению через страницу учетных записей Googles
- следуйте этому решению здесь
Однако, по моему мнению, эти методы не совсем безопасны.Я не припоминаю необходимости делать что-либо из этого, когда я подключаю свою электронную почту к другим почтовым клиентам, например, Outlook и т. Д., Поэтому я не рассматриваю вышеизложенное как реальное решение.
Может кто-нибудь посоветовать?Что-то не так с моим кодом, или мне действительно приходится прибегать к обоим шагам, описанным выше?