gpt4 book ai didi

ios - Facebook iOS SDK 3.5.1 : openActiveSessionWithReadPermissions - completion handler called twice

转载 作者:可可西里 更新时间:2023-11-01 03:06:25 26 4
gpt4 key购买 nike

我有一个分享链接的按钮。我基本上使用两个电话:openActiveSessionWithReadPermissionsrequestNewPublishPermissions

所以这是按钮操作:

- (IBAction) shareFacebookButtonAction:(id)sender
if (![[FBSession activeSession] isOpen])
{
NSArray *permissions = @[@"read_friendlists", @"email"];
[FBSession openActiveSessionWithReadPermissions:permissions
allowLoginUI:YES
completionHandler:^(FBSession *session,
FBSessionState state,
NSError *error)
{
if (FB_ISSESSIONOPENWITHSTATE([session state]))
{
[self _prepareShare];
}
else
{
// show alert view with error
}
}];
}
else
{
[self _prepareShare];
}
}

如果在 session 中没有找到权限,我会请求发布权限

-(void) _prepareShare;
{
if ([FBSession.activeSession.permissions
indexOfObject:@"publish_actions"] == NSNotFound)
{
[FBSession.activeSession
requestNewPublishPermissions:
[NSArray arrayWithObject:@"publish_actions"]
defaultAudience:FBSessionDefaultAudienceFriends
completionHandler:^(FBSession *session, NSError *error)
{
if (!error)
{
[self _share];
}
else
{
//error
}
}];
} else
{
[self _share];
}
}

_share 只是发布一些东西

-(void) _share;
{

NSMutableDictionary *params_dict = [NSMutableDictionary dictionary];
// setting some params

[FBRequestConnection startWithGraphPath:@"me/feed" parameters:params_dict HTTPMethod:@"POST" completionHandler:^(FBRequestConnection *connection, id result, NSError *error)
{
if (result)
{
// sharing succedeed, do something
}
else if (error)
{
//sharing failed, do something else
}
}];
}

我第一次尝试分享(已经在 iOS6 中登录 FB 并且应用已经授权)openActiveSessionWithReadPermissions 的完成处理程序被调用了两次:一次使用 FBSessionStateOpen,一次使用 FBSessionStateOpenTokenExtended(来自 openSessionForPublishPermissions 调用)。因此,_share 也被调用了两次,第一次是在 _prepareShareelse 部分(如果我已经有发布权限),第二次是openSessionForPublishPermissions 的完成处理程序中的时间。所以我在 Facebook 墙上发布了两个帖子,这是我第一次在应用程序中分享。我还有一份关于 FBSession 的崩溃报告:在之前的重新授权调用尚未完成时重新授权无效(我无法让它再次发生)。

处理这种情况的正确方法是什么?

最佳答案

Facebook SDK 似乎按照设计保留了对 block 处理程序的引用,即使在它们被调用之后也是如此。因此,在调用 openActiveSessionWithReadPermissions 时,可能会多次调用完成处理程序,以防 session 状态发生变化。参见 Facebooks comment on this issue here .

作为解决方法,您可能希望实现自己的机制以确保处理程序仅被触发一次:

__block FBSessionStateHandler runOnceHandler = ^(FBSession *session,
FBSessionState status,
NSError *error) { /* YOUR CODE HERE */ };

...

[FBSession openActiveSessionWithReadPermissions:YOUR_PERMISSIONS
allowLoginUI:YES
completionHandler:^(FBSession *session,
FBSessionState status,
NSError *error) {
if (runOnceHandler) {
runOnceHandler(session, status, error);
runOnceHandler = nil;
}

}
];

关于ios - Facebook iOS SDK 3.5.1 : openActiveSessionWithReadPermissions - completion handler called twice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16686910/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com