Обрабатывать два приложения: openURL: sourceApplication: аннотация

У меня есть 2 SDK, которым необходимо использовать application:openURL:sourceApplication:annotation метод application:openURL:sourceApplication:annotation. Один из них - FacebookSDK а второй - GooglePlusSDK.

Это методы:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    return [FBAppCall handleOpenURL:url sourceApplication:sourceApplication];
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    return [GPPURLHandler handleURL:url sourceApplication:sourceApplication annotation:annotation];
}

Мой вопрос в том, как можно перенести их в один метод? Каков наилучший способ?

Заранее спасибо.

Ответ 1

Вероятно, вы можете сделать следующее:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    BOOL shouldOpen = [FBAppCall handleOpenURL:url sourceApplication:sourceApplication];
    shouldOpen = shouldOpen ? shouldOpen : [GPPURLHandler handleURL:url sourceApplication:sourceApplication annotation:annotation];

    return shouldOpen;
}

Ответ 2

Использовать логический оператор OR ||

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    return [FBAppCall handleOpenURL:url sourceApplication:sourceApplication] || [GPPURLHandler handleURL:url sourceApplication:sourceApplication annotation:annotation];
}

Быстрая версия

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String!, annotation: AnyObject) -> Bool {
    return FBAppCall.handleOpenURL(url, sourceApplication: sourceApplication) || GPPURLHandler.handleURL(url, sourceApplication: sourceApplication, annotation: annotation)
}

Ответ 3

Более чистый способ (здесь, в Swift):

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String!, annotation: AnyObject) -> Bool {
    var handled: Bool
    if let facebook = url.scheme?.hasPrefix("fb") {
        handled = FBAppCall.handleOpenURL(url, sourceApplication: sourceApplication)
    } else {
        handled = GPPURLHandler.handleURL(url, sourceApplication: sourceApplication, annotation: annotation)
    }
    // include any specific handling code as necessary
    return handled
}

Ответ 4

Вы также можете поместить чек на базовый префикс URL

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString  *)sourceApplication annotation:(id)annotation
{
if FB URL prefix
//Call FB method
else 
//Google plus method
}

Ответ 5

Я закончил:

- (BOOL)application:(UIApplication *)application //facebook & Google+
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    return( [[FBSDKApplicationDelegate sharedInstance] application:application
                                                          openURL:url
                                                sourceApplication:sourceApplication
                                                       annotation:annotation]
           ||

           [GPPURLHandler handleURL:url
                  sourceApplication:sourceApplication
                         annotation:annotation]
           );

    ;
}