首页 文章

Facebook IOS SDK试图制作单例类吗?

提问于
浏览
1

Hy,我试图从Facebook IOS SDK(Octomber 2011)制作一个我自己的类,在那里我可以制作我需要的所有方法和功能,只需在我的任何应用程序视图控制器中导入这个类并调用它 . 所以这种方式我不需要对使用facebook的控制器进行所有初始化和委托 . 所以我想这样做,[myfacebookclass initwithappID:myappid] [myfacebookclass postmessage:@“some message”];

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

当我想发布消息时,我喜欢这样:

这是我自己的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 annotation:(id)annotation {return [facebook handleOpenURL:url]; }

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

1 回答

  • 3

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

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

    我希望这些片段会对你有所帮助 .

    要管理你的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];
    }
    

相关问题