2

我正在尝试在 iOS - Swift 3 上实现 OAuth 流程,以查询 REST API ( Strava )。

我在处理身份验证流程的 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
}

我在 plist 中添加了我的 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 上引入了 SFAuthenticationSession,如此处所述。我还没有研究过,但我也需要在 11 之前的应用程序)。
  • 我的application(_:didFinishLaunchingWithOptions:)函数返回 true 并且我没有 按照函数文档application(_:willFinishLaunchingWithOptions:)的讨论部分中的描述实现。

有什么想法我可能会错过吗?

干杯

4

1 回答 1

4

所以它实际上是我没有注意到的混合的东西......

  1. 我在那里尝试使用的 URL 是错误的:它不应该是 http://,但是yourApp://因为您希望 yourApp 处理回调。在某个论坛上,我读到 Strava 只允许 http 重定向 uris,这让我尝试这样做,但这实际上是错误的,正如 文档所述:

使用授权代码将用户重定向到的 URL,必须是与应用程序关联的回调域或其子域,localhost并且127.0.0.1已列入白名单。

我们开始了下一件事,即:

  1. 您应该在 Strava 管理页面的 Settings/My Api Application 中检查您为应用程序命名的名称。在 yourApp 示例之后,它应该是这样的: Strava 我的 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>

SFSafariViewController它的作用就像魅力:它是 iOS 9 还是 11,或者你使用VS 离开应用程序等等,这实际上并不重要UIApplication.shared.openURL()……

祝你好运 ;)

于 2017-11-15T12:00:17.233 回答