web-dev-qa-db-ja.com

openURLの処理:FacebookとGoogleで

私のアプリのユーザーは、FacebookまたはGoogleの2つのサービスを使用してログインできます

ただし、:ではすべてが正常に機能します。

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

facebookのコールバックまたはGoogleのコールバックを呼び出すことにする必要があります

ユーザーがアプリを持っている場合、それは私がsourceApplicationで決定するよりも簡単ですが、そうでない場合(ネイティブのFacebookアカウントがリンクされていない、FBアプリ、GooglePlusアプリがない)、ブラウザーにリンクします:(そしてそれがそうであるかどうかはわかりませんFacebookまたはGoogleから来る

何を呼び出すかを決める方法はありますか?like

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

    // how to decide?
    if (facebook) {

        return [FBSession.activeSession handleOpenURL:url];

    } else if (google) {

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

    }

}
26
Peter Lapisu

URLを明示的にチェックする必要はありません。以下のコードでチェックします:-

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

    if ([GPPURLHandler handleURL:url sourceApplication:sourceApplication annotation:annotation]) {
        return YES;
    }else if([FBAppCall handleOpenURL:url sourceApplication:sourceApplication]){
        return YES;
    }

    return NO;
}
35
user2144179

次のことを試すことができます:

if ([[url absoluteString] rangeOfString:@"<Your Google Bundle ID>"].location ==            NSNotFound)
{
    // Call FBAppCall's handleOpenURL:sourceApplication to handle Facebook app responses
    BOOL wasHandled = [FBAppCall handleOpenURL:url sourceApplication:sourceApplication];
    // You can add your app-specific url handling code here if needed
    return wasHandled;
}
else
{
    return [GPPURLHandler handleURL:url
                  sourceApplication:sourceApplication
                         annotation:annotation];
}
return YES;

上記のメソッドをで呼び出す

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

あなたのappDelegeate.m

基本的に、これはurlプレフィックスを調べて、urlプレフィックスがur google +バンドルIDの場合はgoogle +メソッドを呼び出し、そうでない場合はfbメソッドを呼び出します。お役に立てれば

5

メソッド「application:openURL:sourceApplication:annotation:」はiOS9から非推奨になりました。だから今あなたはのように使うことができます。

- (BOOL)application:(UIApplication *)app
        openURL:(NSURL *)url
        options:(NSDictionary *)options {
       // For Google sign in SDK
       if ([[GIDSignIn sharedInstance] handleURL:url
                               sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                                      annotation:options[UIApplicationOpenURLOptionsAnnotationKey]]) {
          return YES;
       // For Facebook SDK
       }else if ( [[FBSDKApplicationDelegate sharedInstance] application:app
                                                          openURL:url
                                                sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                                                       annotation:options[UIApplicationOpenURLOptionsAnnotationKey]]){
          return YES;
      //For Google plus SDK
      }else if ([GPPURLHandler handleURL:url
                       sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                              annotation:options[UIApplicationOpenURLOptionsAnnotationKey]]){
          return YES;
      }

     return NO;
}
4
vp2698

Swiftユーザーの場合、(user2144179からのアイデア)

以下のフレームワークをインポートします

import Firebase
import GoogleSignIn
import FacebookCore // (FBSDKCore's alternative for Swift)

デリゲートメソッドで

// when your target is under iOS 9.0
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    let isFBOpenUrl = SDKApplicationDelegate.shared.application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
    let isGoogleOpenUrl = GIDSignIn.sharedInstance().handle(url, sourceApplication: sourceApplication, annotation: annotation)
    if isFBOpenUrl { return true }
    if isGoogleOpenUrl { return true }
    return false
}

または、ターゲットが9.0以降の場合は、別の「openurl:」メソッドを使用できます。 SDKには、そのためのメソッドも含まれています。

Firebaseリファレンス: https://firebase.google.com/docs/auth/ios/google-signin

Facebookリファレンス: https://developers.facebook.com/docs/Swift/reference/classes/applicationdelegate.html

3
Mark

受け入れられた回答のSwift iOS9.0以降のバージョンは次のようになります。

import FacebookCore

[...]

    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        if (GIDSignIn.sharedInstance().handle(url)) {
            return true
        } else if (ApplicationDelegate.shared.application(app, open: url, options: options)) {
            return true
        }

        return false
    }

各SDKでURLを処理してみてください。最初に認識したものは、実行を終了してtrueを返します。 SDKがURLを処理できない場合は、falseを返します。

私はそれが誰かを助けることを願っています、

シャビ

1
XME

Swift 4.2バージョンでこれを試すことができます:

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool 
{
    if (url.scheme?.hasPrefix("fb"))! {
        return SDKApplicationDelegate.shared.application(app, open: url, options: options)
    } 
    else
    {
        return GIDSignIn.sharedInstance().handle(url as URL?, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,
                                                                 annotation: options[UIApplicationOpenURLOptionsKey.annotation])
    }           
}
0
Andrey AK

GoogleSDKまたはFacebookSDKのいずれかで処理を試行し、SDKが処理しない場合は、他のSDKで処理を試行することができます。

    @available(iOS 9.0, *)
private func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any])
    -> Bool {
        let handled: Bool = SDKApplicationDelegate.shared.application(application, open: url, options: options)

        if handled { return handled }

        return GIDSignIn.sharedInstance().handle(url,
                                                 sourceApplication:options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,
                                                 annotation: [:])
}

//deprecated method iOS 8 and older
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    let handled: Bool =  SDKApplicationDelegate.shared.application(application,
                                                                   open: url,
                                                                   sourceApplication: sourceApplication,
                                                                   annotation: annotation)

    if handled { return handled }

    return GIDSignIn.sharedInstance().handle(url,
                                             sourceApplication: sourceApplication,
                                             annotation: annotation)
}
0
Brian Ogden