gpt4 book ai didi

ios - 在 iOS 上使用 Facebook 图谱 API

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:23:57 33 4
gpt4 key购买 nike

这是我在 StackOverflow 上的第一篇文章,但我已经使用了很长时间...

我的问题基本上很简单,我想把一个UITextView(mShareText)的内容分享到用户的墙上,不提示任何Dialog。基本上,用户必须在 UITextView 上填写消息,然后单击“post”UIButton。是不是很简单?

我已经下载了 Facebook iOS SDK 并将其复制到我的项目中。我在 Controller 的头文件中包含了“FBConnect.h”和“Facebook.h”,并创建了一个 var:Facebook* facebook; , Controller 还实现了以下委托(delegate):FBSessionDelegate、FBRequestDelegate。

在我的 Controller 的实现文件中,当用户点击“发布”UIButton 时,我触发了一个 IBAction。

- (IBAction)onShareByFBPressed:(id)sender {
NSLog(@"onShareByFBPressed");

// Facebook settings
NSMutableDictionary* params = [[NSMutableDictionary alloc] initWithCapacity:3];

[params setObject:mShareText.text forKey:@"message"];
[params setObject:@"http://www.example.com" forKey:@"link"];
[params setObject:@"https://www.example.com/myImg.jpg" forKey:@"picture"];

[facebook requestWithGraphPath:@"me/feed"
andParams:params
andHttpMethod:@"POST"
andDelegate:self];
[params release];
}

我已经在我的 viewdidload 上实现了这个:

- (void)viewDidLoad
{
NSLog(@"viewDidLoad");
[super viewDidLoad];

(...)

// Test facebook
facebook = [[Facebook alloc] initWithAppId:@"XXXXXXXXXXX" andDelegate:self];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:@"FBAccessTokenKey"] && [defaults objectForKey:@"FBExpirationDateKey"]) {
facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
NSLog(@"AccessToken: %@ ExpirationDate: %@", facebook.accessToken, facebook.expirationDate);
}else{
NSLog(@"No AccessToken or ExpirationDate");
}
if (![facebook isSessionValid]) {
[facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil]];
}
}

由于代表的缘故,我必须实现不同的方法:

// Pre 4.2 support
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [facebook handleOpenURL:url];
}

// For 4.2+ support
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [facebook handleOpenURL:url];
}

- (void)fbDidLogin {
NSLog(@"fbDidLogin");
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
[defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
[defaults synchronize];
}

- (void)fbSessionInvalidated{
NSLog(@"fbSessionInvalidated");
}

- (void)fbDidLogout{
NSLog(@"fbDidLogout");
}

- (void)fbDidExtendToken:(NSString*)accessToken expiresAt:(NSDate*)expiresAt{
NSLog(@"fbDidExtendToken");
}

- (void)fbDidNotLogin:(BOOL)cancelled{
NSLog(@"fbDidNotLogin");
}

- (void)request:(FBRequest *)request didReceiveResponse:(NSURLResponse *)response{
NSLog(@"didReceiveResponse: %@", response);
}

- (void)request:(FBRequest *)request didFailWithError:(NSError *)error{
NSLog(@"didFailWithError: %@", [error description]);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Share on Facebook"
message:@"An error occured"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
[alert release];
}

不幸的是,每次我尝试触发我的“onShareByFBPressed”方法时,我都会在日志中收到以下错误:

2012-02-17 13:02:06.401 Mixtapes[935:707] didFailWithError: Error Domain=facebookErrDomain     Code=10000 "The operation couldn’t be completed. (facebookErrDomain error 10000.)"     UserInfo=0x1f6f60 {error=<CFBasicHash 0x1f6660 [0x3ec6d630]>{type = mutable dict, count = 3,
entries =>
2 : <CFString 0x1f64a0 [0x3ec6d630]>{contents = "type"} = <CFString 0x1f6b10 [0x3ec6d630]>{contents = "OAuthException"}
3 : <CFString 0x1f6ab0 [0x3ec6d630]>{contents = "message"} = <CFString 0x1f6a10 [0x3ec6d630]>{contents = "An active access token must be used to query information about the current user."}
6 : <CFString 0x1f6e60 [0x3ec6d630]>{contents = "code"} = 2500
}
}

谁能告诉我我的实现有什么问题??

非常感谢。

最好的问候。

编辑:@阿迪尔

感谢您的建议。它有时确实有效。

有时我会收到以下错误:

didFailWithError: Error Domain=facebookErrDomain Code=10000 "The operation couldn’t be     completed. (facebookErrDomain error 10000.)" UserInfo=0xa17e0d0 {error=<CFBasicHash 0xa171e10     [0x3ec6d630]>{type = mutable dict, count = 3,
entries =>
2 : <CFString 0xa179d10 [0x3ec6d630]>{contents = "type"} = <CFString 0xa17a280 [0x3ec6d630]>{contents = "OAuthException"}
3 : <CFString 0x6127710 [0x3ec6d630]>{contents = "message"} = <CFString 0xa178db0 [0x3ec6d630]>{contents = "Error validating access token: Session is invalid. This could be because the application was uninstalled after the session was created."}
6 : <CFString 0xa17e020 [0x3ec6d630]>{contents = "code"} = 190
}
}

谢谢你的帮助

最佳答案

这里的问题是:

授权的facebook是AppDelegate的facebook对象,不是你的ViewController的facebook。

解决方案:

而是为每个 ViewController 或您需要的地方分配新的 Facebook 对象。您应该为您的应用程序创建一个属性 delegate。像这样:

在appDelegate.h中

@property(nonatomic, retain) Facebook *facebook;

并在 appDelegate.m 中综合它,现在将 Facebook 的初始化放在

- (BOOL)application:(UIApplication *)ap didFinishLaunchingWithOptions:(NSDictionary *)op
{
// other code....

facebook = [[Facebook alloc] initWithAppId:@"XXXXXXXXXXX" andDelegate:self];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:@"FBAccessTokenKey"] && [defaults objectForKey:@"FBExpirationDateKey"]) {
facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
NSLog(@"AccessToken: %@ ExpirationDate: %@", facebook.accessToken, facebook.expirationDate);
}else{
NSLog(@"No AccessToken or ExpirationDate");
}
return true;
}

现在你想在哪里使用它,写这样的东西:

- (void)viewDidLoad
{
[super viewDidLoad];

//...
AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
facebook = app.facebook;
if (![facebook isSessionValid]) {
[facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil]];
}
}

关于ios - 在 iOS 上使用 Facebook 图谱 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9328001/

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