[英]Using Facebook Graph API on iOS
這是我在StackOverflow上的第一篇文章,但我用了很長時間......
我的問題基本上很簡單,我想在用戶的牆上分享UITextView(mShareText)
的內容而不提示任何Dialog。 基本上,用戶必須在UITextView
上填寫其消息,然后單擊“ post ”UIButton。 簡單不是嗎?
我已下載Facebook iOS SDK並將其復制到我的項目中。 我在控制器的頭文件中包含了“ FBConnect.h
”和“ Facebook.h
”並創建了一個var: Facebook* facebook
;控制器還實現了以下代理:FBSessionDelegate,FBRequestDelegate。
在我的控制器的實現文件中,當用戶點擊“post”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
}
}
誰能告訴我我的實施有什么問題?
非常感謝。
最好的祝福。
編輯:@Adil
謝謝你的提議。 它實際上工作了一些時間。
有時我得到以下錯誤:
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]];
}
}
嘗試取消對您的應用程序的授權,然后再次授權
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.