重定向的目的
我正在开发一个与 Cisco 的 Webex Teams Api 集成的应用程序。不幸的是,对于 macOS,他们没有 SDK(他们只有一个用于 iOS),所以我试图用他们的 Api 类型的“手动”进行身份验证。
因此,我使用了一个自定义 URL,该 URL 具有支持的客户端 ID 来检索代码。调用此 URL 时,思科的常规登录程序开始,要求用户使用她/他的用户名和密码登录。成功登录后,Cisco 的服务器会为您提供一个 URL,其中包含一个代码,然后需要该代码才能继续。
到目前为止我得到了什么
自定义网址
我的原型目前只包含一个调用自定义 URL 进行身份验证的按钮。要获取此 URL,我需要在此处注册与 Cisco 的集成:https ://developer.webex.com/my-apps
到目前为止,当我单击我的按钮时,一个 WKWebView 实例将接管我的自定义 URL:
https://api.ciscospark.com/v1/authorize?client_id=<**personalClientId**>&response_type=code&redirect_uri=<**BundleIdentifier**>3A%2F%2Fredirect&scope=spark%3Aall%20spark%3Akms&state=set_state_here
重定向 URI
所以,我的重定向 uri 目前是ch.appfros.webexoauthwokflowprototype://redirect;此重定向 uri 已在我的集成注册表中向 Cisco 注册。
我知道我必须将此重定向 uri 放入我的应用程序中,所以我这样做导致相应的info.plist
部分如下所示:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>response</string>
<key>CFBundleURLSchemes</key>
<array>
<string>ch.appfros.webexoauthwokflowprototype://</string>
</array>
</dict>
</array>
准备AppDelegate
据我目前所发现的,似乎我还需要在我的 中添加一个附加函数AppDelegate
来处理回调。对于cocoa
,这似乎是func application(_ application: NSApplication, open urls: [URL])
方法。
据我了解,我必须在那里处理所有重定向。我AppDelegate
目前看起来像这样:
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Insert code here to initialize your application)
}
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}
func application(_ application: NSApplication, open urls: [URL]) {
print("got answer")
}
}
我遇到的问题
我的问题是,完成登录程序会导致消息There is no application set to open the URL ch.appfros.webexoauthwokflowprototype://redirect?code=
&state=loggedIn.
因此,思科端的身份验证过程是成功的,它为我的系统提供了 URL——我的计算机不知道如何处理......我什至可以看到我需要在即将到来的 URL 中检索访问权限的代码回来,我只是在我的应用程序中没有它们可以继续......
我错过了什么?
很明显,我在这里遗漏了一些重要的东西——我只是不知道它是什么,在线研究对我没有帮助。我可以在这里和那里找到零碎的东西,但我仍然要找到一个简明的说明,说明在我的情况下为我的 macOS 应用程序做什么。
环境
- Xcode 10.1
- 斯威夫特 4.2
- 可可应用
- Cisco Webex Teams 与身份验证 URL 的集成
编辑:对 AppDelegate 的更改
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Insert code here to initialize your application)
NSAppleEventManager.shared().setEventHandler(self, andSelector: #selector(self.handleAppleEvent(event:replyEvent:)), forEventClass: AEEventClass(kInternetEventClass), andEventID: AEEventID(kAEGetURL))
}
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}
func application(_ application: NSApplication, open urls: [URL]) {
print("got answer")
}
@objc
func handleAppleEvent(event: NSAppleEventDescriptor, replyEvent: NSAppleEventDescriptor) {
print("got answer in event handler")
}
}
编辑 2:更新到 AppDelegate(以反映 NoHalfBits 的提示和提示)
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Insert code here to initialize your application)
}
func applicationWillFinishLaunching(_ notification: Notification) {
NSAppleEventManager.shared().setEventHandler(self, andSelector: #selector(self.handleAppleEvent(event:replyEvent:)), forEventClass: AEEventClass(kInternetEventClass), andEventID: AEEventID(kAEGetURL))
}
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}
func application(_ application: NSApplication, open urls: [URL]) {
print("got answer")
}
@objc
func handleAppleEvent(event: NSAppleEventDescriptor, replyEvent: NSAppleEventDescriptor) {
print("got answer in event handler")
}
}