尝试从oauth url中获取令牌时,在AppDelegate中未调用open url函数

时间:2017-11-06 16:08:16

标签: ios swift oauth-2.0 strava

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

我在处理auth流程的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>

但是,我无法调用AppDelegate中的application(_:open:options:)函数。

(浏览器弹出好吧,我可以登录Strava,我看到返回的有效URL包括“code = ...”中的访问令牌,我想提取,但是我不能继续这一部分。)

我试过了:

  • 使用内置的Safari浏览器(离开应用程序)
  • with SFSafariViewController
  • 在iOS 9上而不是11上(我知道11月苹果已经推出了 SFAuthenticationSession,as described here。我没有看 进入那个,但我也需要我在11之前的应用程序。)
  • 我的application(_:didFinishLaunchingWithOptions:)功能是 返回true,我没有实现 如function's docs
  • 的讨论部分所述application(_:willFinishLaunchingWithOptions:)

我可能遗失的任何想法?

干杯

1 个答案:

答案 0 :(得分:3)

所以它实际上是我没注意到的事物的混合......

  1. 我试图在那里使用的URL是错误的:它不应该 http://,但yourApp://,因为您希望您的App处理 打回来。在某些论坛上,我读到Strava只允许http重定向 uris,这让我尝试了这种方式,但实际上这是错误的 the documentation州:
  2.   

    用户将使用授权码重定向到的网址必须是与应用程序关联的回调域,或者其子域localhost127.0.0.1是白名单。

    我们接下来的事情,即:

    1. 您应该在设置/我的Api应用程序的Strava管理页面上查看您的应用程序名称。 在yourApp示例之后,它应该是这样的: Strava My Api Application setup
    2. (我的错误是,我没有提供有效/匹配的回调域名。)

      1. 最后,您的plist文件也应相应设置:
      2.         <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()等...

        祝你好运;)