Как обрабатывать UIApplication handleOpenURL с несколькими URL-адресами

У меня есть приложение, которое будет использовать API Facebook и Instagram, оба из которых требуют, чтобы я использовал этот метод делегата:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {

    return [PFFacebookUtils handleOpenURL:url];

}

и это код, предоставленный instagram:

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {

    return [self.instagram handleOpenURL:url];

}

Как видите, это проблема, потому что я могу вернуть только один обработчик URL, но мне нужно решить, какой из них.

В моем делегате приложения я закомментировал опцию Instagram выше и оставил только Facebook. Как и ожидалось, Facebook будет работать нормально, но я получаю эту ошибку, когда нажимаю авторизоваться в Instagram:

Ошибка URL-адреса Instagram

Очевидно, что Facebook пытается обработать возвращаемый URL из Instagram, поэтому произойдет ошибка.

Можно ли проверить URL-адрес, чтобы узнать, содержит ли он идентификатор приложения для каждой службы, которую я пытаюсь использовать? Итак, если URL-адрес содержит идентификатор Instagram, верните обработчик instagram, если он содержит идентификатор Facebook, верните обработчик Facebook.

Любая помощь будет здорово, спасибо!


person Kyle Begeman    schedule 30.12.2013    source источник


Ответы (1)


В Facebook и Instagram вы настроили собственную схему URL-адресов для своих сервисов, поэтому мы будем использовать ее для фильтрации URL-адресов.

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {

    if ([[url scheme] isEqualToString:INSTAGRAM_SCHEME])
        return [self.instagram handleOpenURL:url];

    if ([[url scheme] isEqualToString:FACEBOOK_SCHEME])
        return [PFFacebookUtils handleOpenURL:url];

    return NO;

}

Где вы определяете свои переменные как

#define INSTAGRAM_SCHEME @"ig12345678910"
#define FACEBOOK_SCHEME  @"fb12345678910"

точно так же, как вы сделали в своем файле Info.plist

person coneybeare    schedule 30.12.2013
comment
Отлично, я должен был понять это, но вот что происходит, когда вы слишком долго смотрите на очевидное решение. Это работает отлично, спасибо! - person Kyle Begeman; 31.12.2013
comment
Большинство людей, вероятно, уже знают, но это должен быть INSTAGRAM_SCHEME @ig12345678910, на всякий случай, если кто-то прочитает ответ и запутается! - person Kyle Begeman; 31.12.2013
comment
Зачем сравнивать схемы? Просто сделайте: return [self.instagram handleOpenURL:url] || [PFFacebookUtils handleOpenURL:url];. Это предполагает, что оба вернут NO, если URL-адрес не подходит. - person rmaddy; 31.12.2013
comment
Вы не можете делать предположения, когда имеете дело с кодом, не имеющим открытого исходного кода. - person coneybeare; 31.12.2013
comment
@rmaddy, вы должны добавить свой комментарий в качестве ответа, спасибо, это сработало для меня. - person M.Alatrash; 19.10.2014