嗨,我正在尝试从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];
}
我还实现了:
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];
}