2016-09-16 5 views
0

Я разрабатываю приложение iOS с интеграцией Slack с использованием Swift 3.0. Как пройти процесс регистрации: «? Открыть в приложении»Slack Login не работает. Swift 3.0

func loginToSlackWithSafariBrowser() { 
    let scope = "channels%3Awrite+users%3Aread" 
    let clientId = "...myClientId" 
    let redirect_uri = "myAppDeepLink://" 
    let authURL = NSURL(string: "https://slack.com/oauth/authorize?client_id=\(clientId)&scope=\(scope)&redirect_uri=\(redirect_uri)") 

    guard let url = authURL else { return } 
    UIApplication.shared.openURL(url as URL) 
} 

Затем открывает Safari приложение, я вхожу удостоверение, нажмите «Авторизовать» и бодрствуют, как я нажимаю да и перенаправлять мое приложение, где я отправить следующий запрос с получили от слабины коды:

 //AppDelegate.swift 
extension UIApplicationDelegate { 
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: AnyObject) -> Bool { 
    self.exchangeCodeInURL(codeURL: url as NSURL) 
    return true 
} 

func exchangeCodeInURL(codeURL : NSURL) { 
    let clientId = "...myClientId" 
    let clientSecret = "...myclientSecret" 
    if let code = codeURL.query { 
     let request = NSMutableURLRequest(url: NSURL(string: "https://slack.com/api/oauth.access?client_id=\(clientId)&client_secret=\(clientSecret)&code=\(code)") as! URL) 
     request.httpMethod = "GET" 
     request.setValue("application/json", forHTTPHeaderField: "Accept") 
     URLSession.shared.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in 
      print(response) 
      guard let unwrappedData = data else {return} 
      do { 
       if let rootObject = try JSONSerialization.jsonObject(with: unwrappedData, options: []) as? NSDictionary { 
        //Save and handle the token 
        print(rootObject) 
       } 
      } 
      catch { 
       print(error) 
      } 
     }).resume() 
    } 
} 

}

код работал в Xcode 8 беты, но когда я обновлен до Xcode 8 функций в расширении не вызывается после перенаправления с сайта Slack.

Что не так? Есть ли лучший способ пройти процесс регистрации Slack?

ответ

0

Хорошо, ошибка действительно глупо ... Вместо

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: AnyObject) -> Bool 

которая осуждается

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool 

должен быть реализован.

Так что это должно быть в вашем AppDelegate

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { //don't miss to implement this! 
    return true 
} 

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool{ 
    self.exchangeCodeInURL(codeURL: url) 
    return true 
} 

func exchangeCodeInURL(codeURL : URL) { 
    let clientId = "...myClientId" 
    let clientSecret = "...myclientSecret" 
    if let code = codeURL.query { 
     guard let url = URL(string: "https://slack.com/api/oauth.access?client_id=\(clientId)&client_secret=\(clientSecret)&\(code)") else {return} //as code = "code=Xxxx&state=" you don't have to extract code from string, this query works good 
     let request = NSMutableURLRequest(url: url) 
     request.setValue("application/json", forHTTPHeaderField: "Accept") 
     request.httpMethod = "GET" 
     URLSession.shared.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in 
      print(response) 
      guard let unwrappedData = data else {return} 
      do { 
       if let rootObject = try JSONSerialization.jsonObject(with: unwrappedData, options: []) as? NSDictionary { 
        //Save and handle the token 
        print(rootObject) 
       } 
      } 
      catch { 
       print(error) 
      } 
     }).resume() 
    } 
} 
1

Возможно, вам придется разобрать код перед отправкой его на oauth.access GET. Когда я запускаю это на XCode 8 и Swift 2.3, мой код содержит «code = Xxxx & state =».

Я работаю над той же проблемой и оценил ваш вопрос, так как это помогло мне начать процесс аутентификации.

+0

Как ваше предложение хороший улов и помог решить эту проблему, вы ответить upvoted –