gpt4 book ai didi

iphone - Facebook IOS SDK 试图制作单例类?

转载 作者:行者123 更新时间:2023-12-01 19:25:42 25 4
gpt4 key购买 nike

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

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

当我尝试发布消息时,我确实喜欢这样:

这是在我自己的 facebook 类(class)中

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)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { 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;
}

在您的情况下,您可能将 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];
}

关于iphone - Facebook IOS SDK 试图制作单例类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7886133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com