现有的iOS OBJC项目中添加了OAuthSwift(2.2.0)。该项目是为iOS版本8及更早版本开发的。为了更新项目,我们不会将项目完全转换为swift。决定保留核心ObjC模块,并使用Swift为iOS 13.0开发所有新功能。更重要的是,该项目还使用了C++库和其他第三方库。
该项目有100+实现类,每个实现类都有100行代码。我从一些指南和文章中了解到,在OBJC > SWIFT转换中有很多问题。
现有的AppDelegate.m
与多个控制器具有互操作性,我们目前使用的是AppDelegate.m
和SceneDelgate.swift
之间的didFinishLaunchingWithOptions
。
实际的问题是:
我们试过了,
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
guard let url = URLContexts.first?.url else {
return
}
if url.host == "oauth-callback" {
OAuthSwift.handle(url: url)
}
}
但是,场景映射导致UIWindow nil出现问题,无法显示根视图控制器。
或者,我也尝试过,在AppDelegate.m
中使用openURL
,如下所示。
(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
if ([url.host isEqualToString:@"oauth-callback"]) {
[OAuthSwift handleWithUrl:url];
}
return YES;
}
上面的内容似乎正在访问OAuthToken。然而,OAuthToken在某处迷失了方向。它将指导你了解……
我们留住Objc的策略是否可行?我们如何用OAuth解决SceneDelegate.swift和AppDelegate.m的互操作性问题?有没有关于OBJC兼容OAuth2.0框架的参考?是否可以使用SFSafariController
,而不是调用OAuthSwift,访问令牌?
提前谢谢。
发布于 2021-10-20 18:13:26
在OBJC项目中,使用SWIFT和OBJC代码之间的互操作性功能,此url
if ([url.host isEqualToString:@"oauth-callback"]) {
[OAuthSwift handleWithUrl:url];
}
在标题中声明
@class OAuthSwift;
在Swift中声明@objc
@objc open class func handle(url: URL) {
let notification = Notification(name: OAuthSwift.didHandleCallbackURL, object: nil,
userInfo: [CallbackNotification.optionsURLKey: url])
notificationCenter.post(notification)
}
已使用SFSafariViewControllerDelegate。
这个实现,没有坚持使用'OAuthSwift','~> 2.2.0‘的SceneDelegate。互操作性工作得很好。
https://stackoverflow.com/questions/69557646
复制相似问题