0

Using toblerpwn answer i manage to publish a picture to the application album as i wanted to. But this works only when the application album has already been created (because i need to specify the album id).

In the other hand the requestForUploadPhoto convenience method creates the application album if it doesn't exists and publishes the picture.

So could someone help me figure out how to merge this two beheviours?

Community
  • 1
  • 1
Kalem
  • 1,132
  • 12
  • 33
  • 1
    Your question isn't very clear. What do you want to do ? Publish a photo to an existing album, or create a new album and publish ? Have you checked this blog post - https://developers.facebook.com/blog/post/498/ that describes the 2 scenarios ? – deesarus Nov 26 '12 at 22:25
  • Well what am trying to do is to publish on application album whether it exists or not. From the link you posted : _https://graph.facebook.com/USER_ID/photos - The photo will be published to an album created for your app. We automatically create an album for your app if it does not already exist. All photos uploaded this way will then be added to this same album._ Actually i think this is what i was looking for. I'll test it and let you know. Thanks! – Kalem Nov 26 '12 at 22:56

1 Answers1

1

Thanks to @deepak-lakshmanan i manage to solve my problem.

The idea is to publish to the application album using /USER_ID/photos insted of /ALBUM_ID/photos; this way the album is automatically created if it doesn't exist.

So the steps to follow are:

  • get the publish permission
  • then retrieve the user id using /me
  • finally publish the picture to the application album with /USER_ID/photos

Here is my code in case someone struggles with this, am using Facebook SDK 3.1 for iOS:

- (void)sendRequestFacebookPublishPermission {
    NSArray *permissions = [[NSArray alloc] initWithObjects:@"publish_stream", nil];
    if(!FBSession.activeSession.isOpen ) {
        [FBSession openActiveSessionWithPublishPermissions:permissions
                                           defaultAudience:FBSessionDefaultAudienceFriends
                                              allowLoginUI:YES
                                         completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
                                             [self requestFacebookPublishPermissionCompleted:session status:status error:error];
                                         }];
    } else if ([FBSession.activeSession.permissions indexOfObject:@"publish_actions"] == NSNotFound) {
        [FBSession.activeSession reauthorizeWithPublishPermissions:permissions
                                                   defaultAudience:FBSessionDefaultAudienceFriends
                                                 completionHandler:^(FBSession *session, NSError *error) {
                                                     [self requestFacebookPublishPermissionCompleted:session status:FBSessionStateOpen error:error];
                                                 }];
    } else {
        [self sendRequesFacebooktUserInfo];
    }
}

- (void)requestFacebookPublishPermissionCompleted:(FBSession *)session
                                            status:(FBSessionState)status
                                             error:(NSError *)error {
    if (error) {
        DLog(@"%@", error.localizedDescription);
    } else {
        [self sendRequesFacebooktUserInfo];
    }
}

-(void)sendRequesFacebooktUserInfo {
    FBRequestConnection *newConnection = [[FBRequestConnection alloc] init];

     // output the results of the request
    FBRequestHandler handler = ^(FBRequestConnection *connection, id result, NSError *error) {
        [self requestFacebookUserInfoCompleted:connection result:result error:error];
    };

    // create the request object, using the fbid as the graph path
    FBRequest *request = [[FBRequest alloc] initWithSession:FBSession.activeSession graphPath:@"me"];

    // add the request to the connection object
    [newConnection addRequest:request completionHandler:handler];

    // if there's an outstanding connection, just cancel
    [self.requestConnection cancel];

    // keep track of our connection, and start it
    self.requestConnection = newConnection;
    [newConnection start];
}

- (void)requestFacebookUserInfoCompleted:(FBRequestConnection *)connection
                                result:(id)result
                                 error:(NSError *)error {
    // not the completion we were looking for...
    if (self.requestConnection && connection != self.requestConnection) {
        return;
    }

    // clean this up, for posterity
    self.requestConnection = nil;

    if (error) {
        DLog(@"%@", error.localizedDescription);
    } else {
        FBGraphObject *dictionary = (FBGraphObject *)result;
        NSString* userId = (NSString *)[dictionary objectForKey:@"id"];
        [self sendRequestFacebookPublishOnAlbum:userId];
    }
}

- (void)sendRequestFacebookPublishOnAlbum:(NSString*)fbId {
    UIImage *imageToPost = /* get the image you need*/ ;

    /*
    //--- Facebook SDK convenience method : requestForUploadPhoto won't let me post image description ---//
    FBRequestConnection *newConnection = [FBRequestConnection startForUploadPhoto:screenshot completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
        [self requestPostCardOnFacebookCompleted:connection result:result error:error];
    }];

    // if there's an outstanding connection, just cancel
    [self.requestConnection cancel];

    // keep track of our connection, and start it
    self.requestConnection = newConnection;
    //-----------------------------------------------------------------------------------------------------//
     */


    //--- http://stackoverflow.com/questions/12486852/facebook-ios-sdk-cannot-specify-an-album-using-fbrequests-requestforuploadphot ---//
    NSString *messagePublie = laCarte.message;
    NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:
                                screenshot, @"picture",
                                messagePublie , @"name",
                                nil] ;

    FBRequestConnection *newConnection = [[FBRequestConnection alloc] init];

    FBRequestHandler handler = ^(FBRequestConnection *connection, id result, NSError *error) {
        [self requestFacebookPublishOnAlbumCompleted:connection result:result error:error];
    };

    NSString *graphPath = [NSString stringWithFormat:@"%@/photos",fbId];

    FBRequest *request = [[FBRequest alloc] initWithSession:FBSession.activeSession graphPath:graphPath parameters:parameters HTTPMethod:@"POST"];
    [newConnection addRequest:request completionHandler:handler];

    // if there's an outstanding connection, just cancel
    [self.requestConnection cancel];

    // keep track of our connection, and start it
    self.requestConnection = newConnection;
    [newConnection start];
}

- (void)requestFacebookPublishOnAlbumCompleted:(FBRequestConnection *)connection result:(id)result error:(NSError *)error {
    if (self.requestConnection && connection != self.requestConnection) {
        return;
    }

    // clean this up, for posterity
    self.requestConnection = nil;

    if (error) {
        DLog(@"%@", error.localizedDescription);
    } else {
        DLog(@"%@", "Done");
    }
}
Kalem
  • 1,132
  • 12
  • 33