Iphone Facebook IOS SDK试图创建singleton类?

Iphone Facebook IOS SDK试图创建singleton类?,iphone,ios,xcode,Iphone,Ios,Xcode,Hy,我正试图从Facebook IOS SDK(2011年8月)中创建一个我自己的类,在这里我可以创建我需要的所有方法和函数,只需将这个类导入我的任何应用程序视图控制器并调用它。 因此,这样我就不需要对使用facebook的控制器进行所有初始化和委派。 所以我想这样做,[myfacebookclass initwithappID:myappid] [myfacebookclass postmessage:@“一些消息”] 问题是,当我在facebook.m(原始类)中设置fBapAuth:YE

Hy,我正试图从Facebook IOS SDK(2011年8月)中创建一个我自己的类,在这里我可以创建我需要的所有方法和函数,只需将这个类导入我的任何应用程序视图控制器并调用它。 因此,这样我就不需要对使用facebook的控制器进行所有初始化和委派。 所以我想这样做,[myfacebookclass initwithappID:myappid] [myfacebookclass postmessage:@“一些消息”]

问题是,当我在facebook.m(原始类)中设置fBapAuth:YES safariAuth:YES标志时,我会在facebook应用程序或Safari上重定向我,并检查许可证,我点击ok,然后在我的应用程序中重定向我,并且不会发布消息

当我试图发布消息时,我会这样做:

这是在我自己的facebook课堂上

myfacebookclass *facebook2;
+(void)initWithAppID:(NSString*) facebookAppId {
    if (facebook2 == nil) {
        facebook2 = [myfacebookclass new];
        [facebook2 setWithAppId:facebookAppId];        
    }
}

- (void) postMessage1:(NSString *)messageToPost {  
    if ([self.facebook isSessionValid]) {        
        NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                       self.applicationID, @"api_key",
                                       messageToPost,  @"message",
                                       nil];
        [self.facebook requestWithGraphPath:@"me/feed" andParams:params andHttpMethod:@"POST" andDelegate:self];
    } else {
        NSArray * neededPermissions = [[[NSArray alloc] initWithObjects:@"user_about_me", @"publish_stream", nil] autorelease];
        [self.facebook authorize:neededPermissions];    
    }
}

+ (void)postMessage:(NSString*) message {
        [facebook2 postMessage1:message];
}
我还实施了:

  • (BOOL)应用程序:(UIApplication*)应用程序openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication注释:(id)注释 { return[facebook handleOpenURL:url]; }

我没有修改facebook.m或facebook IOS SDK中的其他类。

创建单例类时的一个好做法是使用共享实例。正确的单例还必须包括一些内存管理重写方法。在您的情况下,可以这样做:

@implementation FacebookManager

static FacebookManager *mySharedFacebookManager;

+ (FacebookManager*)sharedFacebookManager {
    @synchronized(self) {
        if(mySharedFacebookManager == nil) {
            mySharedFacebookManager = [[self alloc] init];
        }
    }
    return mySharedFacebookManager;
}


+ (id)allocWithZone:(NSZone *)zone {    
    @synchronized(self) {
        if(mySharedFacebookManager == nil) {
            mySharedFacebookManager = [super allocWithZone:zone];   
            return mySharedFacebookManager;
        }
    }
    return nil;
}


- (id)copyWithZone:(NSZone *)zone {
    return self;    
}


- (id)retain {  
    return self;    
}


- (unsigned)retainCount {
    return UINT_MAX;
}


- (oneway void)release {

}


- (id)autorelease {
    return self;    
}
- (id)init {
 self = [super init];
 if(self) {
    facebook = [[Facebook alloc] initWithAppId:FB_APP_ID andDelegate:self];
// restore previous session
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if ([defaults objectForKey:@"FBAccessTokenKey"] 
        && [defaults objectForKey:@"FBExpirationDateKey"]) {
        facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
        facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
    }

    ...
 }
 return self;
}

- (void)login {
    NSArray *permissions = [NSArray arrayWithObjects: @"user_about_me", @"publish_stream", nil];
    [facebook authorize:permissions];
}

- (void)postToFeed:(NSString*)messageToPost {
    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                   messageToPost, @"message",
                                   nil];


    [facebook requestWithGraphPath:@"me/feed"
                         andParams:params
                     andHttpMethod:@"POST"
                       andDelegate:self];
}
在您的情况下,您可能有Facebook类型的对象作为ivar,以及一些包装FB API的方法,例如:

@implementation FacebookManager

static FacebookManager *mySharedFacebookManager;

+ (FacebookManager*)sharedFacebookManager {
    @synchronized(self) {
        if(mySharedFacebookManager == nil) {
            mySharedFacebookManager = [[self alloc] init];
        }
    }
    return mySharedFacebookManager;
}


+ (id)allocWithZone:(NSZone *)zone {    
    @synchronized(self) {
        if(mySharedFacebookManager == nil) {
            mySharedFacebookManager = [super allocWithZone:zone];   
            return mySharedFacebookManager;
        }
    }
    return nil;
}


- (id)copyWithZone:(NSZone *)zone {
    return self;    
}


- (id)retain {  
    return self;    
}


- (unsigned)retainCount {
    return UINT_MAX;
}


- (oneway void)release {

}


- (id)autorelease {
    return self;    
}
- (id)init {
 self = [super init];
 if(self) {
    facebook = [[Facebook alloc] initWithAppId:FB_APP_ID andDelegate:self];
// restore previous session
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if ([defaults objectForKey:@"FBAccessTokenKey"] 
        && [defaults objectForKey:@"FBExpirationDateKey"]) {
        facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
        facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
    }

    ...
 }
 return self;
}

- (void)login {
    NSArray *permissions = [NSArray arrayWithObjects: @"user_about_me", @"publish_stream", nil];
    [facebook authorize:permissions];
}

- (void)postToFeed:(NSString*)messageToPost {
    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                   messageToPost, @"message",
                                   nil];


    [facebook requestWithGraphPath:@"me/feed"
                         andParams:params
                     andHttpMethod:@"POST"
                       andDelegate:self];
}
从其他必须处理Facebook的类中,构造很简单:

[[FacebookManager sharedFacebookManager] login];

...

[[FacebookManager sharedFacebookManager] postToFeed:@"Hello World!"];
我希望这些片段能对你有所帮助

要管理facebook会话,您必须在FBSessionDelegate方法中手动记住accessToken,如下所示:

- (void)fbDidLogin {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
    [defaults synchronize];
}


- (void)fbDidLogout {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults removeObjectForKey:@"FBAccessTokenKey"];
    [defaults removeObjectForKey:@"FBExpirationDateKey"];
    [defaults synchronize];
}

这不是我所有的类,只是一些方法,我在这里实现了“是”的所有步骤是内存管理的一个好主意,我会这样做,但我的主要问题是,如果我使用检查用户是否已经登录,使用safari或Facebook应用程序,会话仍然无效(Facebook isSessionValid)“我不能发信息或其他任何东西。”我现在明白了。我用FBSessionDelegate方法完成了上面的代码,并在init方法中进行了修改。希望现在它能为您工作。是的,但是不会调用didlogin和didlogout,因为您不使用应用程序登录或注销,您只需检查您是否已登录,如果未登录,则使用FBApplication登录或Safari,这是如果您从facebook.m设置FBAppAuth:Yes safariAuth:Yes!但我不明白你为什么试图手动调用
-(void)authorizewithfbapauth:(BOOL)tryfbapauth safariAuth:(BOOL)trySafariAuth
。这是facebook.m的私有方法<代码>-(无效)授权:(NSArray*)权限为公共权限,并自动进行选择。。来自FB文档:*如果设备支持多任务处理,我们将使用快速应用程序切换在Facebook应用程序中显示对话框,如果未安装Facebook应用程序,则在Safari中显示对话框。您是否覆盖了应用程序委托中的
-(BOOL)应用程序:handleOpenURL:
?问题是,在我的应用程序中,isSessionValid始终为false,因为没有调用didlogin。如果我将falgs authorizeWithFBAppAuth和authorizeWithFBAppAuth设置为NO,则我的应用程序可以工作,但如果我将它们设置为YES,则不会调用didlogin。