gpt4 book ai didi

xcode - macOS 应用程序的自定义重定向 URI 不起作用

转载 作者:行者123 更新时间:2023-12-03 17:37:41 28 4
gpt4 key购买 nike

重定向的目的

我正在开发一个与 Cisco 的 Webex Teams Api 集成的应用程序。不幸的是,对于 macOS,他们没有 SDK(他们只有一个用于 iOS 的 SDK),所以我尝试使用他们的 Api 进行“手动”身份验证。

因此,我使用一个自定义 URL,其中包含一个客户端 ID 来检索代码。调用此 URL 时,思科的常规登录程序启动,要求用户使用她/他的用户名和密码登录。成功登录后,思科的服务器会向您提供一个 URL,其中包含继续操作所需的代码。

到目前为止我得到了什么

自定义网址

我的原型(prototype)目前仅包含一个调用自定义 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.

因此,Cisco 端的身份验证过程成功,它为我的系统提供了 URL——我的计算机不知道如何处理该 URL...我什至可以在 URL 中看到检索访问权限所需的代码正在回来,我只是在我的应用程序中没有它们来继续......

我缺少什么?

很明显,我在这里遗漏了一些重要的东西——我只是不知道它是什么,并且在线研究对我没有帮助。我可以到处找到零碎的东西,但我仍然需要找到关于我的 macOS 应用程序的具体操作的简明说明。

环境

  • Xcode 10.1
  • swift 4.2
  • cocoa 应用
  • 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(以反射(reflect) 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")
}

}

最佳答案

在 Info.plist 中,在 CFBundleURLSchemes 键下的数组中指定 URL 方案,不带 :// 后缀 (ch.appfros.webexoauthwokflowprototype 而不是 ch.appfros.webexoauthwokflowprototype://)。

顺便说一句,Apple 建议对 CFBundleURLName 使用反向 DNS 样式标识符(名称,而不是方案本身)

我已经设置了一个最小的测试项目:Xcode 10.1,Cocoa 应用程序 Swift 模板。定义自定义方案的 Info.plist 部分是:

<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>no.half.bits</string>
<key>CFBundleURLSchemes</key>
<array>
<string>nohalfbits</string>
</array>
</dict>
</array>

应用程序委托(delegate)是:

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

@IBOutlet weak var window: NSWindow!

func application(_ application:NSApplication, open urls: [URL]) {
print("openURLs:", urls)
}
}

使用小型命令行工具进行测试时,这可以按预期工作:

#import <Cocoa/Cocoa.h>

int main(int argc, const char * argv[])
{
@autoreleasepool
{
NSURL* url = [NSURL URLWithString:@"nohalfbits://hello.world"];
// is there app that handles the scheme, and where is it
NSLog(@"appURL = %@", [NSWorkspace.sharedWorkspace URLForApplicationToOpenURL:url]);
// actually open the url; the app should log this
[NSWorkspace.sharedWorkspace openURL:url];
}
return 0;
}

我还在项目中添加了一个 WKWebView 并让它从服务器加载一个最小的网页,只包含一个带有自定义方案的链接 - 正如预期的那样,单击此链接会触发带有自定义方案的 openURL 方法(必须添加Info.plist 中必需的 NSAppTransportSecurity 字典,并在项目的沙箱设置中启用传出连接。

过去,我见过一些第三方浏览器因包含连字符和点的自定义方案而卡住。对于 WKWebView 和操作系统中的底层自定义 URL 方案处理来说,这似乎没有问题;使用 NSWorkspace 方法和 WKWebView 进行测试时,no.half-bits 而不是 nohalfbits 按预期工作。

关于xcode - macOS 应用程序的自定义重定向 URI 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53692030/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com