gpt4 book ai didi

iphone - 使用 -openWithBehavior :completionHandler: 获取 iOS 版 Facebook 应用的发布权限

转载 作者:行者123 更新时间:2023-12-01 16:51:48 26 4
gpt4 key购买 nike

在我的应用程序中,我需要用户登录 Facebook,在我的表格 View 中获取 friend 列表并在提要上发布,但我不想将用户重定向到任何地方。所以我使用了 -openWithBehavior:completionHandler: ...这是我的代码。

-(IBAction)loginAction:(id)sender {
[self deleteCookies];
// get the app delegate so that we can access the session property
DLAppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];

// this button's job is to flip-flop the session from open to closed
if (appDelegate.session.isOpen) {
// if a user logs out explicitly, we delete any cached token information, and next
// time they run the applicaiton they will be presented with log in UX again; most
// users will simply close the app or switch away, without logging out; this will
// cause the implicit cached-token login to occur on next launch of the application
[appDelegate.session closeAndClearTokenInformation];

} else {
if (appDelegate.session.state != FBSessionStateCreated) {
// Create a new, logged out session.
appDelegate.session = [[FBSession alloc] init];
[self updateView];
}

// if the session isn't open, let's open it now and present the login UX to the user
[appDelegate.session openWithBehavior:FBSessionLoginBehaviorForcingWebView completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
switch (status) {
case FBSessionStateOpen:
// call the legacy session delegate
//Now the session is open do corresponding UI changes
{
FBCacheDescriptor *cacheDescriptor = [FBFriendPickerViewController cacheDescriptor];
[cacheDescriptor prefetchAndCacheForSession:session];
[FBSession openActiveSessionWithAllowLoginUI:NO];
[FBSession openActiveSessionWithPublishPermissions:[NSArray arrayWithObjects:@"publish_stream",@"publish_actions", nil] defaultAudience:FBSessionDefaultAudienceFriends allowLoginUI:NO completionHandler:nil];
}
break;
case FBSessionStateClosedLoginFailed:
{ // prefer to keep decls near to their use
// unpack the error code and reason in order to compute cancel bool
// call the legacy session delegate if needed
//[[delegate facebook] fbDialogNotLogin:userDidCancel];
}
break;
// presently extension, log-out and invalidation are being implemented in the Facebook class
default:
break; // so we do nothing in response to those state transitions
}
[self updateView];
}];
}
}

用户已成功登录,我可以使用 FQL 检索好友列表。问题是在发布到提要时。我知道我需要获得发布权限才能做到这一点。但是当我使用以下代码发布...
- (IBAction)postAction:(id)sender {
DLAppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
if (appDelegate.session.isOpen) {
[FBSession openActiveSessionWithAllowLoginUI:NO];
NSMutableDictionary *postParams = [[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];
if ([_postText.text length]>0) {
[postParams setObject:[_postText text] forKey:@"message"];
}
if (([FBSession.activeSession.permissions
indexOfObject:@"publish_actions"] == NSNotFound) ||
([FBSession.activeSession.permissions
indexOfObject:@"publish_stream"] == NSNotFound)) {

// No permissions found in session, ask for it
[FBSession.activeSession
reauthorizeWithPublishPermissions:
[NSArray arrayWithObjects:@"publish_stream",@"publish_actions",nil]
defaultAudience:FBSessionDefaultAudienceFriends
completionHandler:^(FBSession *session, NSError *error) {
if (!error) {
// If permissions granted, publish the story
[self publishStory:postParams];
}
}];
} else {
// If permissions present, publish the story
[self publishStory:postParams];
}
}
}

-(void)publishStory:(NSDictionary *)postParams {
[FBRequestConnection startWithGraphPath:
@"me/feed" parameters:postParams HTTPMethod:@"POST"
completionHandler:^(FBRequestConnection *connection, id result, NSError *error)
{
if (!error) {
//Tell the user that it worked.
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Shared:"
message:[NSString stringWithFormat:@"Sucessfully posted to your wall."]
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
alertView.tag = 101;
[alertView show];
}
else {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error:"
message:error.localizedDescription
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertView show];
NSLog(@"%@",error);
}
}
];
}

此代码将用户重定向到 Safari 或 Facebook 应用程序。这是我不想发生的。

当然我需要在登录时获得发布权限。问题是如何?

最佳答案

您必须设置 FBSessionLoginBehavior,要更改它,唯一的方法是使用:

[session openWithBehavior:FBSessionLoginBehaviorWithNoFallbackToWebView
completionHandler:^(FBSession *session,
FBSessionState status,
NSError *error) {
// Respond to session state changes,
// ex: updating the view
}];

我看到你用 FBSessionLoginBehaviorForcingWebView ,所以要得到你想要的,你必须从这个枚举中选择:
typedef enum {
/*! Attempt Facebook Login, ask user for credentials if necessary */
FBSessionLoginBehaviorWithFallbackToWebView = 0,
/*! Attempt Facebook Login, no direct request for credentials will be made */
FBSessionLoginBehaviorWithNoFallbackToWebView = 1,
/*! Only attempt WebView Login; ask user for credentials */
FBSessionLoginBehaviorForcingWebView = 2,
/*! Attempt Facebook Login, prefering system account and falling back to fast app switch if necessary */
FBSessionLoginBehaviorUseSystemAccountIfPresent = 3,
} FBSessionLoginBehavior;

现在要解决这个“我肯定需要在登录时获得发布权限。问题是如何?”你可以 - (id)initWithPermissions:(NSArray*)permissions;您的 Session :
NSArray *permissions = @[@"publish_stream", @"publish_actions"];
appDelegate.session = [[FBSession alloc] initWithPermissions:permissions];

关于iphone - 使用 -openWithBehavior :completionHandler: 获取 iOS 版 Facebook 应用的发布权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14998402/

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