Функция открытого URL-адреса не вызывается в AppDelegate при попытке получить токен из URL-адреса oauth

Я пытаюсь реализовать поток OAuth на iOS - Swift 3, чтобы запросить REST API ( Страва).

Я делаю это в моем VC, обрабатывающем поток аутентификации:

@IBAction func tappedStartAuth(_ sender: Any) {

    let authUrlStr = "http://www.strava.com/oauth/authorize?client_id=12345&response_type=code&redirect_uri=http://localhost/exchange_token&approval_prompt=force&scope=view_private,write"

    // but instead 12345 I have my real cientID of course

    UIApplication.shared.openURL(URL(string:authUrlStr)!)

    // Did not work with SFVC either:
    //safariViewController = SFSafariViewController(url: URL(string: authUrlStr)!)
    //safariViewController?.delegate = self
    //present(safariViewController!, animated: true, completion: nil)

}

В моем AppDelegate:

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

    print("opened url, [code] checking should follow, but this won't get called")

    // would do some stuff here...

    return true
}

И я добавил свою схему URL в список:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>org.my.bundle.id</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>localhost</string>
        </array>
    </dict>
</array>

Тем не менее, я не могу получить application(_:open:options:) функция в моем AppDelegate для вызова.

(Браузер все в порядке, я могу войти в Strava, и я вижу, что возвращен действительный URL, включая токен доступа в фрагменте "code =...", который я хотел бы извлечь, но я не могу перейти к этой части.)

Я пробовал:

  • с помощью встроенного браузера Safari (выход из приложения)
  • с SFSafariViewController
  • на iOS 9 вместо 11 (я знаю, что на 11 Apple ввела SFAuthenticationSession, как описано здесь. Я еще не рассматривал это, но мне нужно мое приложение до 11).
  • мой application(_:didFinishLaunchingWithOptions:) функция возвращает истину, и я не реализую application(_:willFinishLaunchingWithOptions:) как описано в разделе обсуждения документации по функции.

Есть идеи, чего мне не хватать?

ура

1 ответ

Решение

Так что на самом деле это была смесь вещей, которые я не заметил...

  1. URL, который я пытался использовать, был неправильным: он не должен бытьhttp:// но yourApp:// так как вы хотите, чтобы ваше приложение обрабатывало обратный вызов. На каком-то форуме я читал, что Strava разрешает только http перенаправление Uris, что заставило меня попробовать это, но на самом деле это неправильно, как говорится в документации:

URL-адрес, на который пользователь будет перенаправлен с кодом авторизации, должен указывать на домен обратного вызова, связанный с приложением, или его поддомен, localhost а также 127.0.0.1 занесены в белый список

И мы добрались до следующего, а именно:

  1. Вы должны проверить, как вы называете свое приложение на странице администрирования Strava в Настройках /My Api Application. Следуя примеру yourApp, он должен выглядеть примерно так: Настройка приложения Strava My Api

(Моя ошибка заключалась в том, что я не предоставил действительный / соответствующий домен обратного вызова.)

  1. Наконец, ваш plist-файл также должен быть настроен соответствующим образом:
        <key>CFBundleURLTypes</key>
        <array>
            <dict>
                <key>CFBundleURLName</key>
                <string>com.yourdomain.yourApp</string>
                <key>CFBundleURLSchemes</key>
                <array>
                    <string>yourApp</string>
                </array>
            </dict>
        </array>

И это работает как очарование: на самом деле не имеет значения, является ли это iOS 9 или 11, или вы используете SFSafariViewController VS вы покидаете приложение с UIApplication.shared.openURL() так далее...

Удачи;)

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