4

我是 iOS 开发的新手。我遇到了一个问题,在我的应用程序中集成 facebook API 时没有调用 fbDidLogin。当我从主视图控制器(即应用程序委托调用的那个)调用 API 时,一切正常,但在我的情况下,它在设置视图控制器下。我从字面上将代码从主视图控制器(它工作的地方)复制到设置视图控制器,它在那里不起作用。

我确实将此方法添加到应用程序委托中,我理解这是大多数人的问题,但就我而言,我认为问题出在其他地方......任何帮助都会很棒。

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [[settingsvc facebook] handleOpenURL:url];

}

在应用程序委托标头中的位置:

@property (strong, nonatomic) Settings *settingsvc;
4

2 回答 2

6

几件事。

-您只需要在整个应用程序中的一个位置实现 fbDidLogin。您不会在每个使用 facebook 的视图控制器上实现它。

- 假设您遵循 Facebook 的 iOS 文档中的入门步骤,您的 Facebook 对象作为您的应用程序委托的属性存在。而且您的 fbDidLogin 方法在您的应用程序委托中。这也应该是您的代码中声明 Facebook 变量的唯一位置。这意味着每当您从代码中的其他任何地方访问 facebook 时,您都会执行以下操作:

ProjectNameAppDelegate *appDelegate = (ProjectNameAppDelegate *)[UIApplication sharedApplication].delegate;
[appDelegate.facebook someMethod];

- 您的应用程序委托中的 handleOpenURL 和 openURL 方法应该与 Facebook 的示例文档中的完全一样,而不是您发布的代码。

- 就我个人而言,我更喜欢将 Facebook 对象从应用程序委托中移出到单例助手类中,但如果您是初学者,那么这可能比您需要的更高级。

更新信息回答评论:

-someMethod 是您要调用的任何 Facebook 方法(在墙上发布、验证等)

- 您应该将所有 FBSessionDelegate 方法放在您的应用程序委托中

- 您需要在您发布到 Facebook 的视图控制器上实现 FBDialogDelegate

- 然后在您的视图控制器中,当您想发布到用户的墙上时,请执行以下操作:

- (void)postToWall {
    ProjectNameAppDelegate *appDelegate = (ProjectNameAppDelegate *)[UIApplication sharedApplication].delegate;
    if (appDelegate.facebook.isSessionValid) {
       //we're logged in so call the post dialog
       [self doPost:nil];
    } else {
        //we're not logged in so call the login and then do the post when it's done
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doPost:) name:@"FBLoginComplete" object:nil]; 
        NSArray *permissions = [[NSArray alloc] initWithObjects: 
                                 @"offline_access",
                                 @"publish_stream",
                                 nil];
        [appDelegate.facebook authorize:permissions];
        [permissions release];

    }
}

-(void)doPost:(NSNotification *) notification {
    ProjectNameAppDelegate *appDelegate = (ProjectNameAppDelegate *)[UIApplication sharedApplication].delegate;
    if (appDelegate.facebook.isSessionValid) {
        NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                       something, @"app_id",
                                       something, @"link",
                                       something, @"picture",
                                       something, @"name",
                                       something, @"caption",
                                       something, @"description",
                                       nil];
        [appDelegate.facebook dialog:@"feed" andParams:params andDelegate:self];
        [params release];
    } 
    [[NSNotificationCenter defaultCenter] removeObserver:self];       
}

- 要使上述工作正常进行,您需要在登录完成(成功或失败)时发布 NSNotificationCenter 消息“FBLoginComplete”。

-注意:我在没有编译或测试的情况下编写了上面的代码,因此它可能并不完美(但通常是:)

- 请注意:您不能在没有弹出对话框的情况下直接发布到用户的墙上。用户始终可以在帖子撞墙之前对其进行编辑。

于 2012-04-29T18:16:47.327 回答
1

您是否已经实现FBRequestDelegateyourViewController.h不是 MainViewController 的委托?

FBRequestDelegate包含许多有用的 facebook 请求处理程序,例如。

//Called just before the request is sent to the server.
- (void)requestLoading:(FBRequest *)request;

//Called when the server responds and begins to send back data
- (void)request:(FBRequest *)request didReceiveResponse:(NSURLResponse *)response;

//Called when an error prevents the request from completing successfully.
- (void)request:(FBRequest *)request didFailWithError:(NSError *)error;

/** 
  *Called when a request returns and its response has been parsed into
  *an object.
  *The resulting object may be a dictionary, an array, a string, or a number,
  *depending on thee format of the API response.
  */
- (void)request:(FBRequest *)request didLoad:(id)result;

/** 
  *Called when a request returns a response.
  *The result object is the raw response from the server of type NSData
  */
- (void)request:(FBRequest *)request didLoadRawResponse:(NSData *)data;

希望它可以帮助你!

于 2012-04-29T16:09:27.327 回答