Iphone Facebook IOS SDK试图创建singleton类?
Hy,我正试图从Facebook IOS SDK(2011年8月)中创建一个我自己的类,在这里我可以创建我需要的所有方法和函数,只需将这个类导入我的任何应用程序视图控制器并调用它。 因此,这样我就不需要对使用facebook的控制器进行所有初始化和委派。 所以我想这样做,[myfacebookclass initwithappID:myappid] [myfacebookclass postmessage:@“一些消息”] 问题是,当我在facebook.m(原始类)中设置fBapAuth:YES safariAuth:YES标志时,我会在facebook应用程序或Safari上重定向我,并检查许可证,我点击ok,然后在我的应用程序中重定向我,并且不会发布消息 当我试图发布消息时,我会这样做: 这是在我自己的facebook课堂上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
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。