我正在尝试在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 = ...”中的访问令牌,我想提取,但是我不能继续这一部分。)
我试过了:
application(_:didFinishLaunchingWithOptions:)
功能是
返回true,我没有实现
如function's docs。application(_:willFinishLaunchingWithOptions:)
我可能遗失的任何想法?
干杯
答案 0 :(得分:3)
所以它实际上是我没注意到的事物的混合......
http://
,但yourApp://
,因为您希望您的App处理
打回来。在某些论坛上,我读到Strava只允许http重定向
uris,这让我尝试了这种方式,但实际上这是错误的
the documentation州:用户将使用授权码重定向到的网址必须是与应用程序关联的回调域,或者其子域
localhost
和127.0.0.1
是白名单。
我们接下来的事情,即:
(我的错误是,我没有提供有效/匹配的回调域名。)
<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()
等...