0

Facebook経由でログインする機能を提供するiOSアプリを開発しています。このために、私は Facebook フレームワークを使用しています。私は developers.facebook.com を調べて、そこで説明されているようにログイン機能を実装しました。FBログインは正常に動作しています。FB ログイン機能は次のように機能します。

  1. FB フレームワークは FB アプリを見つけようとします。存在する場合は、FB アプリの資格情報を使用して認証します。

  2. FB アプリが存在しない場合は、iPhone デバイス設定の FB 資格情報を使用して認証を試みます。

  3. FB システム アカウントが存在しない場合は、認証のためにサファリが開きます。

3 番目のステップで、Safari の代わりに Facebook Web ビューがポップアップ表示されるようにしたいと考えています。以下は、私が使用している私のコードです。

    #import "AppDelegate.h"

    NSString *const FBSessionStateChangedNotification =
    @"com.sampleapp.facebook:FBSessionStateChangedNotification";
    @implementation AppDelegate
    @synthesize 

loggedInUserID = _loggedInUserID, loggedInSession = _loggedInSession;
static NSString* kAppId = **FBAPPID**;

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    self.loginViewControlObj = [[LoginViewController alloc] init];
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:self.loginViewControlObj];

    self.navigationController = nav;
    self.navigationController.navigationBarHidden = YES;
    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];

    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application
{

}

- (void)applicationDidEnterBackground:(UIApplication *)application
{

    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [FBAppCall handleDidBecomeActive];
}

- (void)applicationWillTerminate:(UIApplication *)application
{
     [FBSession.activeSession close];
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

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


#pragma mark - FB Methods

/*
 * Callback for session changes.
 */
- (void)sessionStateChanged:(FBSession *)session
                      state:(FBSessionState) state
                      error:(NSError *)error
{
    switch (state) {
        case FBSessionStateOpen:
            if (!error) {
                // We have a valid session
                //NSLog(@"User session found");
                [FBRequestConnection
                 startForMeWithCompletionHandler:^(FBRequestConnection *connection,
                                                   NSDictionary<FBGraphUser> *user,
                                                   NSError *error) {
                     if (!error) {
                         self.loggedInUserID = user.id;
                         self.loggedInSession = FBSession.activeSession;
                     }
                 }];
            }
            break;
        case FBSessionStateClosed:
        case FBSessionStateClosedLoginFailed:
            [FBSession.activeSession closeAndClearTokenInformation];
            break;
        default:
            break;
    }

    [[NSNotificationCenter defaultCenter]
     postNotificationName:FBSessionStateChangedNotification
     object:session];

    if (error) {
        UIAlertView *alertView = [[UIAlertView alloc]
                                  initWithTitle:@"Error"
                                  message:error.localizedDescription
                                  delegate:nil
                                  cancelButtonTitle:@"OK"
                                  otherButtonTitles:nil];
        [alertView show];
    }
}

/*
 * Opens a Facebook session and optionally shows the login UX.
 */
- (void)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
    // Initialize a session object
    FBSession *session = [[FBSession alloc] initWithPermissions:[NSArray arrayWithObjects:@"basic_info", @"email", @"publish_stream", @"publish_actions", @"read_friendlists", nil]];
    // Set the active session
    [FBSession setActiveSession:session];
    // Open the session
    [session openWithBehavior:FBSessionLoginBehaviorWithFallbackToWebView
            completionHandler:^(FBSession *session,
                                FBSessionState status,
                                NSError *error) {
                [self sessionStateChanged:session
                                    state:status
                                    error:error];
            }];

}


/*
 *
 */
- (void) closeSession {
    [FBSession.activeSession closeAndClearTokenInformation];
}


@end

別のコントローラーからログインを呼び出しています。デバイスに FB アプリとシステム アカウントがない場合、Web ビューではなくサファリが開きます。

可能であれば、これを解決するのを手伝ってください。

4

0 に答える 0