iOS: используя Facebook и Google, вход в Google Plus

Доброе утро,

Я пытаюсь реализовать вход в Facebook (который работает нормально), а также вход в Google Plus в том же представлении. Я следую руководствам с официального сайта (Google), но есть проблема между кнопкой Facebook и кнопкой Google Plus:

Facebook говорит мне ввести следующий код:

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

    return [FBAppCall handleOpenURL:url
                  sourceApplication:sourceApplication];
}

А также Google говорит мне поставить следующее:

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

И у меня не может быть одинаковых функций с одним и тем же именем, и я не могу интегрировать одну в другую. Вот почему мне нужна ваша помощь, потому что я не знаю, как решить эту проблему между этими рекомендациями.

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


person WirajPS    schedule 19.08.2014    source источник


Ответы (2)


Здесь вам нужно будет проверить [схему URL] перед возвращением. Пример кода ниже.

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
    NSLog("%@", [url scheme]); 

    if([[url scheme] isEqualToString:FACEBOOK_SCHEME]) 
    {  

        return [FBAppCall handleOpenURL:url sourceApplication:sourceApplication];

    }
    else if([[url scheme] isEqualToString:GOOGLE_PLUS_SCHEME]) 
    {  

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

    }
}

Надеюсь, это решит вашу проблему..

person Sreejith Bhatt    schedule 19.08.2014
comment
Спасибо за помощь, Шриджит. Можете ли вы немного объяснить свой код? Потому что это мое первое приложение, и я немного растерялся... Большое спасибо. - person WirajPS; 19.08.2014
comment
Привет @WirajPS Если вы просто используете схему URL-адресов NSLog или просто URL-адрес в -(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation после выполнения входа в Facebook или Google. вы сможете проверить схему URL-адресов после входа в Facebook и входа в Google, которые будут отличаться. надеюсь, вы поняли, что я имею в виду. Пожалуйста, ответьте, если у вас есть сомнения. - person Sreejith Bhatt; 19.08.2014
comment
Еще раз спасибо, Шриджит. Что я должен указать в «FACEBOOK_SCHEME»? - person WirajPS; 19.08.2014
comment
Здесь FACEBOOK_SCHEME и GOOGLE_PLUS_SCHEME являются константами. FACEBOOK_SCHEME будет похож на fb, к которому добавлен ваш ключ API facebook, а GOOGLE_PLUS_SCHEME будет идентификатором вашего пакета. Надеюсь, вы будете отображаться, когда вы NSLog [url scheme]. - person Sreejith Bhatt; 19.08.2014

Вот версия в Swift.

Во-первых, вы должны понять, как увидеть разницу между обратным URL Google и Facebook. Алгоритм обнаружения:

  1. Шаблон URL-адреса Facebook: fb1106884526040279://authorize/... с fb1106884526040279 – это идентификатор вашего приложения. Итак, вам просто нужно проверить, начинается ли этот URL с идентификатора вашего приложения, является ли хост равным authorize (строка после // и первой /)

  2. Шаблон URL-адреса Google: com.googleusercontent.apps.803921065829-m34o26vcj57oirk1oa8pqve5o22qdihn Поэтому вам просто нужно проверить, начинается ли этот URL-адрес с com.googleusercontent.apps.

Основываясь на приведенном выше объяснении, я обобщил классы GoogleAuth и FacebookAuth utils с некоторыми небольшими методами, такими как выход из системы, проверка входа ...

Вот Google Authentication Utils

import Google

class GoogleAuth {

    static func getInstance() -> GIDSignIn {
        return GIDSignIn.sharedInstance()
    }

    static func isLogin() -> Bool {
        return getInstance().hasAuthInKeychain()
    }

    static func signOut() {
        getInstance().signOut()
    }

    static func isValidatedWithUrl(url: NSURL) -> Bool {
        return url.scheme.hasPrefix(NSBundle.mainBundle().bundleIdentifier!) || url.scheme.hasPrefix("com.googleusercontent.apps.")
    }
}

Во-вторых, это Facebook Authentication Utils

import FBSDKLoginKit

class FacebookAuth {
    static func isLogin() -> Bool {
       return FBSDKAccessToken.currentAccessToken() != nil
    }

    static func signOut() {
       FBSDKLoginManager().logOut()
    }

    static func isValidatedWithUrl(url: NSURL) -> Bool {
        return url.scheme.hasPrefix("fb\(FBSDKSettings.appID())") && url.host == "authorize"
    }
}

Вот основная часть. В AppDelegate вы вызываете метод isValidateWithUrl для проверки того, является ли этот URL адресом Google или Facebook.

func application(application: UIApplication, openURL url: NSURL, options: [String: AnyObject]) -> Bool {
        print("step 2 of OAuth2. Url: \(url)")

        // url from google
        if GoogleAuth.isValidatedWithUrl(url) {
            return GIDSignIn.sharedInstance().handleURL(
                    url,
                    sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as? String,
                    annotation: options[UIApplicationOpenURLOptionsAnnotationKey])
        }
        // url from facebook
         else if FacebookAuth.isValidatedWithUrl(url) {
             return FBSDKApplicationDelegate.sharedInstance().application(application,
                    openURL: url,
                    sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String,
                    annotation: options [UIApplicationOpenURLOptionsAnnotationKey])
        }
        // application hasn't supported this url yet
        else {
              return false
        }
    }

Надеюсь, это поможет :)

person hqt    schedule 17.04.2016