私のアプリのユーザーは、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];
}
}
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;
}
次のことを試すことができます:
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メソッドを呼び出します。お役に立てれば
メソッド「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;
}
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
受け入れられた回答の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を返します。
私はそれが誰かを助けることを願っています、
シャビ
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])
}
}
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)
}