2016-09-29 9 views
0

Я создаю приложение, которое использует социальные сети для входа. Моя проблема заключается в том, что 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.Мне нужно вызвать эти две функции в зависимости от того, из какой социальной сети я пришел из App Delegate

Дело в том, что, имея две функции в 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]) 

} 
+0

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

ответ

0

Каждый из этих третьей стороны handleURL функции возвращает 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 будет работать).