在应用程序代理中为Facebook和Twitter打开URL?

9

我正在使用Facebook SDK和Twitter SDK进行登录和注册。

但它们都没有从一个公共方法打开URL。我已经按照下面的代码为Facebook编写了代码:

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool
{
    if(url.scheme == "fb1651015905222312")
    {
        return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
    }
    return true
}

这个方法很好用,但是对于Twitter,我需要将上面的方法注释掉并改写成如下:

 func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
    if Twitter.sharedInstance().application(app, openURL:url, options: options) {
        return true
    }
    return true
}

这只适用于 Twitter。

问题是我需要编写一个通用方法在 appDelegate 中打开它们的 URL。那么我该怎么办呢?

注意:我们不能在 app delegate 中同时编写两种方法。


1
请查看此链接,可能会对您有所帮助 处理不同的URL方案 谢谢 - Chandan
是的,我看过 Stack Overflow 中提供的链接,但实际上对于 Twitter 并不起作用。谢谢 @ChandanPrajapati - Jigar Tarsariya
6个回答

27

最终我找到了这个问题的解决方案。

Swift 3

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {

    if Twitter.sharedInstance().application(app, open:url, options: options) {
        return true
    }


    let appId = SDKSettings.appId
    if url.scheme != nil && url.scheme!.hasPrefix("fb\(appId)") && url.host ==  "authorize" { // facebook
        return SDKApplicationDelegate.shared.application(app, open: url, options: options)
    }
    return false
}

适用于 Swift < 3

这是让我能够编写同时适用于 Facebook 和 Twitter 的 URL 的方法。

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {

    if Twitter.sharedInstance().application(app, openURL:url, options: options) {
        return true
    }

    let sourceApplication: String? = options[UIApplicationOpenURLOptionsSourceApplicationKey] as? String
    return FBSDKApplicationDelegate.sharedInstance().application(app, openURL: url, sourceApplication: sourceApplication, annotation: nil)
}

感谢所有尝试回答我的问题的人。

谢谢。


13

这适用于 Swift 3Swift 4。只需复制并粘贴:

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    if Twitter.sharedInstance().application(app, open: url, options: options) {
        return true
    }

    let sourceApplication: String? = options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String
    return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: sourceApplication, annotation: nil)
}

自TwitterKit 3.0起,“Twitter.sharedInstance()”中的“Twitter”类已更名为“TWTRTwitter”。 - WongWray
我遇到了这个问题 “Cannot invoke 'application' with an argument list of type '(UIApplication, open: URL, sourceApplication: String?, annotation: String)'",因为该方法已过时。链接 https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623073-application?language=objc 也许需要使用 return application(app, open: url, options: options)? - Yurii Petrov

2

更新至SWIFT 3

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    let sourceApplication: String? = options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String
    return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: sourceApplication, annotation: nil)
}

1
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options
{

  if ([Twitter.sharedInstance application:app openURL:url options:options])
{

return YES;

}

return [self application:app openURL:url sourceApplication:[options objectForKey:UIApplicationOpenURLOptionsSourceApplicationKey] annotation:[options objectForKey:UIApplicationOpenURLOptionsAnnotationKey]];

}

虽然这段代码可能回答了问题,但提供有关它如何以及/或为什么解决问题的附加上下文将改善答案的长期价值。请阅读此如何回答以提供高质量的答案。 - thewaywewere

0

快速 5

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool
{
    // Check for twitter 
    if TWTRTwitter.sharedInstance().application(app, open: url, options: options)
    {
        return true
    }
    
    // If twitter failed, check for facebook
    return ApplicationDelegate.shared.application(app, open: url, options: options)
}

0

这是我尝试使用Objective为Twitter和Facebook创建openURL的代码

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options {

if ([[url scheme] isEqualToString:FACEBOOK_SCHEME])
return [[FBSDKApplicationDelegate sharedInstance] application:application
                                                      openURL:url
                                            sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                                                   annotation:nil];
if ([[url scheme] isEqualToString:TWITTER_SCHEME])
return [[Twitter sharedInstance] application:application openURL:url options:options];

return NO;
}

当然还有这些:

#define TWITTER_SCHEME @"Twitter-key-from-plistfile"
#define FACEBOOK_SCHEME  @"fb-key-from-plistfile"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接