0

Facebook SDK を使用して、アプリから FB にログインしようとしています。私はこのチュートリアルhttps://developers.facebook.com/docs/mobile/ios/build/#implementssoに忠実に従いました!

私の問題 これは私がやったことです (iPhone に Facebook アプリがインストールされていません) 1. 「iPhone」のアプリから Facebook に初めてログインしたとき、Safari が開きました。ログインしてアプリに許可を与えました。2. iPhone からアプリを削除し、iPhone を再起動しました。3. アプリから FB に再度ログインしようとすると、isSessionValid 呼び出しで「いいえ」が返され、アクセス トークンを出力しようとすると null が返されます。これで問題ありません。しかし、アプリは、isSessionValid を実行すると、(チュートリアルのように) [thisAppDelegate.facebook authorize:nil] を呼び出します。これにより、iPhone で Safari が開き、ログインしているという Facebook ページが表示されます (isSessionValid が null を返すと、どうしてですか? ログインしていたにもかかわらず、FB とのセッションが終了したこと、およびこのアプリが既に承認されていることを確認します。下の画面で [OK] をクリックすると、アプリがクラッシュします。

ここに画像の説明を入力

fbLogin 呼び出しが完了すると、EXC_BAD_ACCESS (コード 1) が返されます。そして、これは 2 行目のこのメソッドの FBURLConnection.m で発生しているようです (「for」ループ):

- (BOOL)isCDNURL:(NSURL *)url
{
    NSString* urlHost = url.host;
    for (NSString* host in _cdnHosts) {
        if ([urlHost hasSuffix:host]) {
            return YES;
        }
    }

    return NO;
}

「urlHost」の値を出力すると、「graph.facebook.com」という値が得られます。

誰か助けてくれませんか?

コードスニペット

AppDelegate.h

#import <UIKit/UIKit.h>
#import "FBConnect.h"

@interface com_AppDelegate : UIResponder <UIApplicationDelegate, FBSessionDelegate> {

    Facebook *facebook;
}

@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, retain) Facebook *facebook;

@end

私のAppDelegate.m

...
@synthesize facebook;


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    facebook = [[Facebook alloc] initWithAppId:kFBAppId andDelegate:self];


    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if ([defaults objectForKey:@"FBAccessTokenKey"] 
        && [defaults objectForKey:@"FBExpirationDateKey"]) {
        facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
        facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
    }

    return YES;
}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    NSLog(@"AppDelegate.handleOpenURL");
    return [facebook handleOpenURL:url]; 
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    NSLog(@"AppDelegate.openURL");
    return [facebook handleOpenURL:url]; 
}

- (void)fbDidLogin {

    NSLog(@"AppDelegate.fbDidLogin");
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
    [defaults synchronize];
    NSLog(@"Set the facebook accessToken to '%@' & expiry to '%@'", [facebook accessToken], [facebook expirationDate]);
}
...

FB 接続を開くクラス FBTalker があります。

FBTalker.hから

... @interface ViewController_FBTalker : UIViewController {id appDelegate; @property (非アトミック) com_AppDelegate *thisAppDelegate; ...

FBTalker.m

...
-(void) initializeView {

    appDelegate = [[UIApplication sharedApplication] delegate];
    thisAppDelegate = (com_AppDelegate *) appDelegate;

    /*
     Check for a valid session and if it is not valid call the authorize method which will both log the user in and prompt the user to authorize the app
     */
    NSLog(@"thisAppDelegate.facebook: access token - %@", [thisAppDelegate.facebook accessToken]);
    NSLog(@"thisAppDelegate.facebook: exp date - %@", [thisAppDelegate.facebook expirationDate]);

    if (![thisAppDelegate.facebook isSessionValid]) {
        [thisAppDelegate.facebook authorize:nil];
        NSLog(@"No valid FB Session yet");
        // Checks if the App has permission to publish to the user stream
        /* NSArray *permissions = [[NSArray alloc] initWithObjects:
                                @"publish_stream", 
                                nil];
        [thisAppDelegate.facebook authorize:permissions];
        */
    } else {
        NSLog(@"Valid FB Session exists");
    }

...

環境 XCode 4.3.3 Facebook iOS SDK (Github からの最新版) https://github.com/facebook/facebook-ios-sdk/ iOS 5 iPhone 4 (Facebook アプリがインストールされていない)

4

1 に答える 1

1

私もかつて同様の問題を抱えていました。これは、通常、ログイン時に、アクセス トークンがUIWebViewのキャッシュ ストレージに保存されるためです。何度もログインしたい場合は、webview からキャッシュを削除する必要があります。この方法を使用して、Facebook ドメインのキャッシュのみをクリアできます。

- (void) clearFBCache 
  {
   for(NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {

    if([[cookie domain] isEqualToString:@"facebook"]) {

        [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }
   }
  }

この方法は私にとってはうまくいきました。これがあなたにも役立つことを願っています。

于 2012-08-14T17:47:27.420 に答える