lau*_*cel 8 facebook objective-c ios facebook-ios-sdk
我有一个共享链接的按钮.我基本上使用两个电话:
openActiveSessionWithReadPermissions和requestNewPublishPermissions.
所以这是按钮动作:
- (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];
}
}
Run Code Online (Sandbox Code Playgroud)
如果没有在会话中找到任何权限,我要求获得发布许可
-(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];
}
}
Run Code Online (Sandbox Code Playgroud)
_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
}
}];
}
Run Code Online (Sandbox Code Playgroud)
我第一次尝试共享(已经登录过iOS6和已授权的应用程序)完成处理程序openActiveSessionWithReadPermissions被调用两次:一次使用FBSessionStateOpen,一次使用FBSessionStateOpenTokenExtended(来自openSessionForPublishPermissions调用).因此,_share也会调用两次,第一次在(如果我已经拥有发布权限)的else部分中_prepareShare,第二次在openSessionForPublishPermissions的完成处理程序中.所以我在Facebook墙上有一个双重帖子,这是我第一次分享应用程序.我也有一份崩溃报告FBSession: It is not valid to reauthorize while a previous reauthorize call has not yet completed(我无法再次发生).
处理这种情况的正确方法是什么?
小智 13
看起来,通过设计,Facebook SDK保留了对块处理程序的引用,即使在它们被调用之后也是如此.因此,在对openActiveSessionWithReadPermissions的调用中,如果会话状态发生更改,则可以多次调用完成处理程序.在这里查看Facebook对这个问题的评论.
作为一种解决方法,您可能希望实现自己的机制,以确保只处理一次处理程序:
__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;
}
}
];
Run Code Online (Sandbox Code Playgroud)
小智 2
你可以用这个
- (IBAction)facebookBasti:(id)sender {
if(FBSession.activeSession.isOpen){
[[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
if (!error) {
NSLog(@" Email = %@",[user objectForKey:@"email"]);
}
}];
NSLog(@"POST TO WALL -- %@",FBSession.activeSession.accessToken);
[self publishFacebook];
}
else {
// try to open session with existing valid token
NSArray *permissions = [[NSArray alloc] initWithObjects:
@"publish_actions",@"email",
nil];
FBSession *session = [[FBSession alloc] initWithPermissions:permissions];
[FBSession setActiveSession:session];
if([FBSession openActiveSessionWithAllowLoginUI:NO]) {
// post to wall
[[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
if (!error) {
NSLog(@" Email = %@",[user objectForKey:@"email"]);
}
}];
NSLog(@"POST TO WALL -- %@",FBSession.activeSession.accessToken);
[self publishFacebook];
} else {
// you need to log the user
NSLog(@"login");
[FBSession openActiveSessionWithPermissions:permissions
allowLoginUI:YES
completionHandler:^(FBSession *session,
FBSessionState state,
NSError *error) {
NSLog(@"POST TO WALL -- %@",FBSession.activeSession.accessToken);
[self publishFacebook];
}];
}
}
Run Code Online (Sandbox Code Playgroud)
}
和publishFacebook方法
-(void)publishFacebook
{
NSMutableDictionary *postParams2= [[NSMutableDictionary alloc] initWithObjectsAndKeys:
haberLink, @"link",
@"abc.com", @"name",
title, @"caption",
desc, @"description",
nil];
[FBRequestConnection
startWithGraphPath:@"me/feed"
parameters:postParams2
HTTPMethod:@"POST"
completionHandler:^(FBRequestConnection *connection,
id result,
NSError *error) {
NSString *alertText;
if (error) {
alertText = [NSString stringWithFormat:
@"error: domain = %@, code = %d",
error.domain, error.code];
} else {
alertText = [NSString stringWithFormat: @"Shared Facebook"];
[[[UIAlertView alloc] initWithTitle:@"Shared Facebook"
message:alertText
delegate:self
cancelButtonTitle:@"Ok"
otherButtonTitles:nil]
show];
}
}];
Run Code Online (Sandbox Code Playgroud)
}
| 归档时间: |
|
| 查看次数: |
10730 次 |
| 最近记录: |