1

私はiPhoneゲームを開発していて、ユーザーにFacebookにスコアを投稿してもらいたいと思っていました。私はそれを実装することができましたが、フィードを投稿するたびに、Facebookアプリにログインしたことを通知するFacebookウィンドウがあり、ユーザーはフィードを投稿するnexウィンドウを表示するために[同意する]をタップする必要がありますプロファイルの壁。

Facebookのログインをスキップする必要がありますか?私はFacebookがメソッドを承認し、Facebookフィードメソッドに直接ジャンプすることを意味しますか?

これが私が持っているものですが、セッションは常に無効です!fbDidLoginが呼び出されることはなく、デバッグ時にこの種のエラーが発生します。

void SendDelegateMessage(NSInvocation*): delegate (webView:decidePolicyForNavigationAction:request:frame:decisionListener:) failed to return after waiting 10 seconds. main run loop mode: kCFRunLoopDefaultMode

また、ログアウトしてからフィードしようとすると、セッション用とフィード用の2回ログインする必要があります。

これはコードです:

#import "FacebookConnect.h"

static NSString* kAppId = @"414427041919461"; // Your Facebook app ID here

@implementation FacebookConnect

@synthesize facebook = _facebook;

#pragma mark -
#pragma mark Singleton Variables
static FacebookConnect *singletonDelegate = nil;

#pragma mark -
#pragma mark Singleton stuff
- (id)init {
    if (!kAppId) {
        NSLog(@"MISSING APP ID!!!");
        exit(1);
        return nil;
    }

    if ((self = [super init])) {

        _facebook = [[Facebook alloc] initWithAppId:kAppId andDelegate:self];
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        if ([defaults objectForKey:@"FBAccessTokenKey"] 
            && [defaults objectForKey:@"FBExpirationDateKey"]) {
            _facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
            _facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
        }

    }

    return self;
}

+(FacebookConnect *) sharedFacebook
{
    @synchronized([FacebookConnect class])
    {
        if(!singletonDelegate) [[self alloc] init];
        return singletonDelegate;
    }
    return nil;
}
+(id)alloc
{
    @synchronized ([FacebookConnect class])
    {
        NSAssert(singletonDelegate == nil, @"Attempted to allocate a second instance of the Game Manager singleton");
        singletonDelegate = [super alloc];
        return singletonDelegate;
    }
    return nil;
}

#pragma mark -
#pragma mark Singleton methods
-(void) logout
{
    [_facebook logout];
}
-(void) feedWithScore:(int) _s andLevel:(int) _l
{
    if (![_facebook isSessionValid]) {
        NSLog(@"Session invalid - Authorize");
        /*NSArray *permissions = [[NSArray alloc] initWithObjects:@"user_likes", @"read_stream",nil];
         [_facebook authorize:permissions];
         [permissions release];*/
        [_facebook authorize:nil];
    }

    [_facebook dialog:@"feed" andDelegate:self];

}

#pragma mark -
#pragma mark Facebook implementations
// Pre iOS 4.2 support
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return [_facebook handleOpenURL:url]; 
}

// For iOS 4.2+ support
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    return [_facebook handleOpenURL:url]; 
}
- (void)fbDidLogin {
    NSLog(@"Login OK");
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[_facebook accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[_facebook expirationDate] forKey:@"FBExpirationDateKey"];
    [defaults synchronize];

}
- (void) fbDidLogout {
    NSLog(@"Log out");
    // Remove saved authorization information if it exists
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if ([defaults objectForKey:@"FBAccessTokenKey"]) {
        [defaults removeObjectForKey:@"FBAccessTokenKey"];
        [defaults removeObjectForKey:@"FBExpirationDateKey"];
        [defaults synchronize];
    }
}

- (void)dialogDidComplete:(FBDialog *)dialog{ NSLog(@"Login OK"); }
- (void)dialogDidNotComplete:(FBDialog *)dialog{}
- (void)dialogCompleteWithUrl:(NSURL *)url{}
- (void)dialog:(FBDialog*)dialog didFailWithError:(NSError *)error{}
- (BOOL)dialog:(FBDialog*)dialog shouldOpenURLInExternalBrowser:(NSURL *)url{return NO;}

- (void)fbDidNotLogin:(BOOL)cancelled{}
- (void)fbDidExtendToken:(NSString*)accessToken
               expiresAt:(NSDate*)expiresAt{}
- (void)fbSessionInvalidated{}

#pragma mark -
#pragma mark Dealloc
-(void) dealloc{
    [super dealloc];
    [_facebook release];
}


@end
4

1 に答える 1

2

Facebookフィードに投稿するには、アクセストークンが必要です。したがって、そのトークンを取得することを承認する必要があります。アクセストークンの有効期限が切れているために、毎回承認ダイアログが表示される場合。古いSDKでoffline_accessをリクエストできます。新しいSDKでは、ユーザーがアプリを使用するたびにaccess_tokenを拡張するように求められます。ただし、意見として、Facebookフィードへのユーザー投稿を「作成」するべきではありません。それは彼らに尋ねるべきです。しかし、それは優れたユーザーエクスペリエンスに対する私の意見です。

アクセストークンを拡張する方法に関するドキュメントは次のとおりです。

http://developers.facebook.com/docs/mobile/ios/build/#extend_token

また、アプリが読み込まれるたびに確認する必要があります。

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

そして、それがすでに承認されているかどうかを確認します。

f (![facebook isSessionValid]) {
    [facebook authorize:nil];
}

こちらのドキュメントをご覧ください:https ://developers.facebook.com/docs/mobile/ios/build/#implementsso

于 2012-04-16T01:33:49.083 に答える