Я должен вызывать эти две функции в зависимости от того, из какой социальной сети я пришел в делегате приложения

#ios #swift #facebook-graph-api #appdelegate #google-signin

#iOS #swift #facebook-graph-api #appdelegate #google-вход

Вопрос:

Я создаю приложение, которое использует социальные сети для входа в систему. Моя проблема в том, что Google звонит func application(application: UIApplication,
openURL url: NSURL, options: [String: AnyObject]) ->Bool
и Facebook звонит func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool .

Дело в том, что, имея эти две функции в AppDelegate, Facebook не возвращает меня в приложение, а Google возвращает. Я думаю, что между этими двумя функциями существует конфликт.

Я пытался установить флаг var, но я не могу установить оператор if / else вне какой-либо функции.

Что я могу сделать?

 func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {

        return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
}

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

        return GIDSignIn.sharedInstance().handleURL(url, sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as? String, annotation: options[UIApplicationOpenURLOptionsAnnotationKey])

}
  

Комментарии:

1. У вас не может быть двух копий одного и того же метода делегирования. Просто используйте одну.

Ответ №1:

Каждая из этих сторонних handleURL функций возвращает a Bool , чтобы сообщить вам, действительно ли эта конкретная библиотека обрабатывала соответствующий URL. Вы можете объединить проверки в один отдельный метод делегирования и вернуть true, если любой из них возвращает true. Я изменил ваш код, чтобы показать вам, как это может выглядеть. Обратите внимание, что я вызываю устаревшую функцию iOS 8 в более новой, потому что я предполагаю, что вы пытаетесь поддерживать и iOS 8. Если это не так, вы можете полностью избавиться от этой функции и переместить ее тело в функцию iOS 9.

 func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool 
{
        if FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
        {
            return true
        }
        else if GIDSignIn.sharedInstance().handleURL(url, sourceApplication: sourceApplication, annotation: annotation)
        {
            return true
        }
        else
        {
            // put more logic here as you need to but for now just return false if you didn't handle the URL
            return false
        }
}

func application(application: UIApplication, openURL url: NSURL, options: [String: AnyObject]) -> Bool 
{
        return self.application(application, openURL: url, sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as? String, annotation: options[UIApplicationOpenURLOptionsAnnotationKey]!)
}
  

редактировать: В качестве примечания, причина, по которой ваша функция Facebook не вызывалась, заключается в том, что в системе iOS 9 , если она обнаружит, что вы внедрили более новую функцию, она никогда не вызовет более старую. Если вы полностью удалите новую, вы заметите, что старая все равно будет вызываться (и ваша обработка Facebook будет работать).