Utiliser l'API Facebook Graph sur iOS

C'est mon premier post sur StackOverflow mais je l'utilise depuis longtime …

Mon problème est fondamentalement simple, je veux partager le contenu d'un UITextView(mShareText) sur le mur de l'user sans inviter aucune boîte de dialog. Fondamentalement, l'user doit remplir son message sur UITextView puis cliquer sur un UIButton " post ". Simple n'est-ce pas?

J'ai téléchargé le Facebook iOS SDK et l'ai copié dans mon projet. J'ai inclus " FBConnect.h " et " Facebook.h " sur le file d'en-tête de mon controller et créé un var: Facebook* facebook , le controller implémente également les delegates suivants: FBSessionDelegate, FBRequestDelegate.

Sur le file de mise en œuvre de mon controller, j'ai un IBAction déclenché lorsque l'user clique sur le "post" UIButton.

 - (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]; } 

J'ai implémenté ceci sur mon 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]]; } } 

Voici différentes methods que j'ai dû mettre en œuvre en raison des delegates:

 // 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:(NSSsortingng *)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:(NSSsortingng*)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]; } 

Malheureusement, chaque fois que j'essaie de triggersr ma méthode "onShareByFBPressed", j'ai l'erreur suivante dans le journal:

 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, ensortinges => 2 : <CFSsortingng 0x1f64a0 [0x3ec6d630]>{contents = "type"} = <CFSsortingng 0x1f6b10 [0x3ec6d630]>{contents = "OAuthException"} 3 : <CFSsortingng 0x1f6ab0 [0x3ec6d630]>{contents = "message"} = <CFSsortingng 0x1f6a10 [0x3ec6d630]>{contents = "An active access token must be used to query information about the current user."} 6 : <CFSsortingng 0x1f6e60 [0x3ec6d630]>{contents = "code"} = 2500 } } 

Quelqu'un peut-il me dire quel est le problème avec ma mise en œuvre?

Merci beaucoup.

Meilleures salutations.

EDIT: @Adil

Merci pour votre proposition. Cela fonctionne réellement quelque chose.

Parfois, j'ai l'erreur suivante:

 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, ensortinges => 2 : <CFSsortingng 0xa179d10 [0x3ec6d630]>{contents = "type"} = <CFSsortingng 0xa17a280 [0x3ec6d630]>{contents = "OAuthException"} 3 : <CFSsortingng 0x6127710 [0x3ec6d630]>{contents = "message"} = <CFSsortingng 0xa178db0 [0x3ec6d630]>{contents = "Error validating access token: Session is invalid. This could be because the application was uninstalled after the session was created."} 6 : <CFSsortingng 0xa17e020 [0x3ec6d630]>{contents = "code"} = 190 } } 

Merci de votre aide

Le problème ici est:

Le facebook qui est autorisé est l'object facebook de ViewController , pas le ViewController votre ViewController .

Solution:

Au lieu d'allouer un nouvel object Facebook pour chaque ViewController ou là où vous en avez besoin. vous devriez faire une propriété de votre delegate application. comme ça:

dans appDelegate.h

 @property(nonatomic, retain) Facebook *facebook; 

et synthétiser dans appDelegate.m et maintenant mettre l'initialisation de Facebook dans

 - (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; } 

maintenant où voulez-vous l'utiliser, écrivez quelque chose comme ceci:

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

Essayez d'annuler l'autorisation de votre application, puis autorisez-la à nouveau