2012-04-16 23 views
1

私はiPhoneゲームを開発しています。ユーザーはFacebookのスコアを自分の投稿にしたいと思っていました。私はそれを実装することができたが、フィードを投稿するたびにFacebookのアプリにログインしていることを伝えるFacebookブックウィンドウが表示され、フィードを投稿するネックスウィンドウを表示するにはacceptをタップする必要があるプロフィールの壁。iPhone - Facebook Connect

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

ここに私が持っているものはありますが、セッションは常に無効です! fbDidLoginと呼ばれることは決してありませんし、デバッグにはMESにこの種のエラー与える:

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

をそして私はログアウトしてから餌しようとした場合、私は2回、セッション用と飼料のための1つをログインする必要があります。

これはコードです:

#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 

答えて

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"]; 

そして、それがすでに承認されますかどうかを確認:まあhttps://developers.facebook.com/docs/mobile/ios/build/#implementsso

+0

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

はこちらのドキュメントを参照してください。それは毎回facebookがpermisを必要とすることではないシオンそれは、ユーザーが私のFacebookのアプリと一緒にログインしたことを単に示すウィンドウがあるということです。 – marcg11

+0

あなたは何を意味するのか分かりません。必要なすべてのアクセス権を要求する場合は、一度許可する必要があります。アプリが読み込まれるたびに、そのキーを確認するだけです。私の編集を参照してください。 –