嗨,我正在尝试从Facebook IOS SDK(2011年10月)中创建自己的类,在其中可以创建所需的所有方法和函数,并将其导入到我的任何应用程序视图控制器中并进行调用。
因此,通过这种方式,我不需要在使用Facebook的地方进行所有初始化和委派给控制器。
所以我想这样做[myfacebookclass initwithappID:myappid]
[myfacebookclass postmessage:@“一些消息”];

问题是当我在facebook.m(原始类)中设置authorizeWithFBAppAuth:YES safariAuth:YES标志并且我执行了后消息操作时,它在Facebook Application或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 IOS SDK中修改facebook.m或其他类。

    最佳答案

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

    @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 session ,您必须在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];
    }
    

    10-08 05:26