【问题标题】:Facebook IOS SDK trying to make singleton class?Facebook IOS SDK 试图制作单例类?
【发布时间】:2011-12-14 17:28:06
【问题描述】:

嘿,我正在尝试从 Facebook IOS SDK(2011 年 10 月)创建一个我自己的类,我可以在其中创建我需要的所有方法和函数,并将这个类导入我的任何应用程序视图控制器并调用它。 所以这样我就不需要对我使用 facebook 的控制器进行所有初始化和委托。 所以我想这样做,[myfacebookclass initwithappID:myappid] [myfacebookclass postmessage:@"some message"];

问题是当我在 facebook.m (原始类)中设置 authorizeWithFBAppAuth:YES safariAuth:YES 标志并且我做一个 postmessage 它在 Facebook 应用程序或 Safari 上重定向我并检查权限时,我点击确定然后重定向我在我的应用程序中并且不发布消息。

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

这是在我自己的 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)注解 { 返回 [facebook handleOpenURL:url]; }

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

【问题讨论】:

  • 这不是我的全部课程,只是一些方法,我在这里实现了link的所有步骤

标签: iphone ios xcode


【解决方案1】:

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

@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;    
}

在您的情况下,您可能有 Facebook 类型对象作为 ivar,以及一些包装 FB API 的方法,例如:

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

希望这个sn-ps对你有帮助。

要管理您的 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),我无法发布消息或其他任何内容。
  • @MykeAndreas 现在我明白了。我用 FBSessionDelegate 方法和 init 方法中的修改完成了上面的代码。希望现在它对你有用。
  • 是的,但是没有调用didlogin和didlogout,因为您不使用应用程序登录或注销,您只需检查您是否已登录,如果没有,您使用FBApplication登录或Safari,这是如果你从 facebook.m 设置 WithFBAppAuth:YES safariAuth:YES !
  • 但我不明白你为什么要手动拨打- (void)authorizeWithFBAppAuth:(BOOL)tryFBAppAuth safariAuth:(BOOL)trySafariAuth。这是来自 facebook.m 的私有方法。 - (void)authorize:(NSArray *)permissions 是公开的并自动做出选择。来自 FB 文档:* 如果设备支持多任务处理,我们使用快速应用切换来在 Facebook 应用中显示对话框,或者,如果未安装 Facebook 应用,在 Safari 中。 您是否在应用程序委托中覆盖 - (BOOL)application:handleOpenURL:
  • 问题是在我的应用程序中 isSessionValid 总是错误的,因为没有调用 didlogin。如果我将 falgs authorizeWithFBAppAuth 和 authorizeWithFBAppAuth 设置为 NO,我的应用程序就可以工作,但是如果我将它们设置为 YES,不会调用 didlogin。
猜你喜欢
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-18
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多