发布到Facebook无法从代表工作

时间:2013-01-18 10:47:24

标签: iphone ios facebook facebook-graph-api social-networking

我在我的项目中添加了FBSdk以及SBJson类,我应该在第二个视图控制器中导入哪些文件来处理我的代码?

我想使用url下的描述在Fb上发布,所以我需要将此代码包含到我的第二个视图控制器中,但是我被困在我创建的部分中,应该在第二个视图控制器中添加以下代码但是“委托:自我”不起作用,因为我第一次这样做,所以任何人都可以指导我如何在我的第二个视图控制器中编码,同时考虑到应用代表的值(我应该如何从中获取值应用程序委托FB到第二个视图,以便我可以在第二个代码中添加此代码plz可以任何一个更正此代码)

facebook = [[Facebook alloc] initWithAppId:@"YOUR_APP_ID"]; 

//我该如何从应用代表处获取此ID?

 NSArray* permissions =  [NSArray arrayWithObjects:@"read_stream", 
 @"publish_stream", nil];
[facebook authorize:permissions delegate:self];

   NSMutableDictionary* params = [[NSMutableDictionary alloc] 
initWithCapacity:1]
 [params setObject:@"Testing" forKey:@"name"];
  [params setObject:@"IMAGE_URL" forKey:@"picture"];
   [params setObject:@"Description" forKey:@"description"];
  [facebook requestWithGraphPath:@"me/feed" 
    andParams:params 
  andHttpMethod:@"POST" 
   andDelegate:self];

以上代码是否正确? 我应该如何在我的第二个视图控制器中实现它 - (void)fb_share(method)。

我的应用程序代理文件是这样的:

#import "AppDelegate.h"
#import "ViewController.h"
#import "ServerRequests.h"
#import "DBManager.h"
#import "SBJson.h"


#include "FBSession.h"
#import "FBRequest.h"
#import "FBGraphUser.h"


NSString *const FBSessionStateChangedNotification = @"com.myapp:FBSessionStateChangedNotification";

@implementation AppDelegate

@synthesize userId;
@synthesize dbSnyced;
@synthesize fbId;
@synthesize loginView;

- (void)dealloc
{
    [_window release];
    [_viewController release];
    [super dealloc];
}




 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{   self.fbId = @"-1";
    self.dbSnyced = NO;
    self.loginView = nil;

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

    self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];
    self.navigationController = [[[UINavigationController alloc] initWithRootViewController:self.viewController] autorelease];
    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];    

    if (![self openSessionWithAllowLoginUI:NO]) {

        [self showLogin:NO];
    }

    return YES;
}



- (void)applicationDidBecomeActive:(UIApplication *)application
{

    [self checkAccountLogin];
}

- (void) applicationDidEnterBackground:(UIApplication *)application
{
    [self hideLogin:NO];
}

- (void)  applicationWillTerminate:(UIApplication *)application
{
    NSLog(@"applicationWillTerminate");
    [self hideLogin:NO];
    [FBSession.activeSession close];
}

- (void) checkAccountLogin
{
    self.dbSnyced = NO;
    if([ServerRequests serverIsReachableAlertIfNo:YES]) {

        DBManager *db = [[[DBManager alloc] initWithPath:DB_NAME] autorelease];
        NSDictionary *userDic = [[db smartQueryForArrayWithStatement:@"SELECT * FROM table WHERE id=1"] objectAtIndex:0];
        NSString *loginType = [userDic objectForKey:@"login_type"];
        if([loginType isEqualToString:@"none"]) {
            NSLog(@"no login type");
            [self showLogin:NO];
        }
        else {
            self.userId = [[userDic objectForKey:@"user_id"] intValue];
            if([loginType isEqualToString:@"Facebook"]) {
                NSLog(@"Facebook account");

                [FBSession.activeSession handleDidBecomeActive];
            }
            else if([loginType isEqualToString:@"MyApp"]) {
                NSLog(@"MyApp account");
            }
        }
    }
}


#pragma - Fb stuff

/*
 * Callback for session changes.
 */
- (void)sessionStateChanged:(FBSession *)session state:(FBSessionState) state error:(NSError *)error
{
    NSLog(@"sessionStateChanged");
    switch (state) {
        case FBSessionStateOpen:
            if (!error) {
                [self handleFbUserDetails];
            }
            break;
        case FBSessionStateClosed:
        case FBSessionStateClosedLoginFailed:
            [FBSession.activeSession closeAndClearTokenInformation];
            break;
        default:
            break;
    }

    [[NSNotificationCenter defaultCenter] postNotificationName:FBSessionStateChangedNotification object:session];

    if (error) {
        NSLog(@"error: %@", error.localizedDescription);
        if(self.loginView) {
            [self.loginView hideLoading];
        }


    }
}

/*
 * Opens a Facebook session and optionally shows the login UX.
 */
- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
    return [FBSession openActiveSessionWithReadPermissions:nil
                                              allowLoginUI:allowLoginUI
                                         completionHandler:^(FBSession *session,
                                                             FBSessionState state,
                                                             NSError *error) {
                                             [self sessionStateChanged:session
                                                                 state:state
                                                                 error:error];
                                         }];
}


/*
 * If we have a valid session at the time of openURL call, we handle
 * Facebook transitions by passing the url argument to handleOpenURL
 */
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    // attempt to extract a token from the url
    return [FBSession.activeSession handleOpenURL:url];
}

- (BOOL) activeFBSession
{
    return FBSession.activeSession.isOpen;
}

- (void) closeFBSession
{
    NSLog(@"closeFBSession");
    [FBSession.activeSession closeAndClearTokenInformation];
}


- (void) showLogin:(BOOL)animated
{
    if(!self.loginView) {
        self.loginView = [[[LoginViewController alloc] init] autorelease];
        [[self.navigationController topViewController] presentViewController:self.loginView animated:animated completion:nil];
    }
}

- (void) hideLogin:(BOOL)animated
{
    if(self.loginView) {
        [self.viewController gotToTab:0];
        [self.loginView hideLoading];
        [[self.navigationController topViewController] dismissViewControllerAnimated:animated completion:^{
            self.loginView = nil;
            NSLog(@"self.loginView = nil");
        }];
    }
}


- (void) handleFbUserDetails
{
    [[FBRequest requestForMe] startWithCompletionHandler:
     ^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
         if (!error) {
             NSLog(@"fb connected");

             self.fbId = [user objectForKey:@"id"];
             self.userId = -1;             

             ASIFormDataRequest *request = [ServerRequests ASIFormDataRequestForSrcipt:@"facebookUser"];
             [request setPostValue:[user objectForKey:@"id"] forKey:@"fbId"];
             [request setPostValue:user.first_name forKey:@"first_name"];
             [request setPostValue:user.last_name forKey:@"last_name"];
            [request setPostValue:user.location.name forKey:@"location"];
             [request setCompletionBlock:^{
                 NSString *response = [request responseString];
                 NSLog(@"facebookUser response: %@", response);
                 if([response rangeOfString:@"ERROR"].location == NSNotFound) {
                     self.userId = [response intValue];

                     DBManager *db = [[DBManager alloc] initWithPath:DB_NAME];
                     NSString *q = [NSString stringWithFormat:@"UPDATE table SET login_type = 'Facebook', user_id = '%@' WHERE id = 1", response];
                     NSLog(@"%@", q);
                     [db executeStatement:q];
                     [db release];                     
                 }
                 else {                     

                 }
                 [self sessionBecameActive];
             }];
             [request startAsynchronous];
             [self hideLogin:YES];
         }
         else {
             NSLog(@"error: %@", error.localizedDescription);
             UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Facebook Request Error" message:@"Cannot connect to Facebook." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];

             alert.delegate = self;
             [alert show];
             [alert release];
             if(self.loginView) {
                 [self.loginView hideLoading];
             }
         }
         [ServerRequests SyncDataBase];
     }];
}

- (void) signOut
{
    [self closeFBSession];
    DBManager *db = [[DBManager alloc] initWithPath:DB_NAME];
    [db executeStatement:@"UPDATE table SET login_type = 'none' WHERE id = 1"];
    [db release];
    [self showLogin:YES];
}

- (void) sessionBecameActive
{
    [self.viewController sessionBecameActive];
}

@end

任何人都可以通过从委托中获取值来弄清楚我应该在第二个视图控制器中的 - (void)fb_share方法中编写哪些代码? 任何帮助!


我这样做了...并且收到错误:HTTP状态代码:400 ...但是用户名获取显示在警报

     [[FBRequest requestForMe] startWithCompletionHandler:
    ^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
        if (!error) {

       //     NSArray* permissions =  [NSArray arrayWithObjects:@"read_stream",
          //                           @"publish_stream", nil];
           // [facebook authorize:permissions delegate:self];


          self.params =  [[NSMutableDictionary alloc] initWithObjectsAndKeys:
             @"https://developers.facebook.com/ios", @"link",
             @"https://developers.facebook.com/attachment/iossdk_logo.png", @"picture",
            @"Facebook SDK for iOS", @"name",
            @"Build great social apps and get more installs.", @"caption",
            @"The Facebook SDK for iOS makes it easier and faster to develop Facebook integrated iOS apps.", @"description",
             nil];

            UIAlertView *tmp = [[UIAlertView alloc]
                                initWithTitle:@"Upload to FB?"
                                message:[NSString stringWithFormat:@"Upload to ""%@"" Account?", user.name]
                                delegate:self
                                cancelButtonTitle:nil
                                otherButtonTitles:@"No",@"Yes", nil];

            [FBRequestConnection startWithGraphPath:@"me/feed"
                                          parameters:self.params
                                          HTTPMethod:@"POST"
                                   completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
                                       if (!error) {
                                           UIAlertView *tmp = [[UIAlertView alloc]
                                                               initWithTitle:@"Success"
                                                               message:@"PostUploaded"
                                                               delegate:self
                                                               cancelButtonTitle:nil
                                                               otherButtonTitles:@"Ok", nil];

                                           [tmp show];
                                           [tmp release];
                                       }
                                   }];

            [tmp show];
            [tmp release];

                   }
    }];

..我现在该怎么办?

1 个答案:

答案 0 :(得分:1)

facebook声明为property in .h

appDelegate个文件

然后在second view controller导入AppDelegate

在你想要Facebook对象的.m文件中

得到它

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
Facebook *facebook = appDelegate.facebook;