[英]Infinite Session with facebook ios sdk FBLoginView
I am making my first attempts on FB integration with the iOS SDK. 我正在尝试FB与iOS SDK的集成。
I have succeeded in establishing a connection with my fb app over the FBLoginView
which works so far. 我已成功通过
FBLoginView
与我的fb应用程序建立连接,该应用程序到目前为止一直有效。
Here are my corresponding calls: 以下是我的相应电话:
-(void)loginViewShowingLoggedInUser:(FBLoginView *)loginView{
NSLog(@"logged in");
}
-(void)loginViewShowingLoggedOutUser:(FBLoginView *)loginView{
NSLog(@"logged out");
[FBSettings setLoggingBehavior:[NSSet setWithObjects:FBLoggingBehaviorFBRequests, nil]];
if (FBSession.activeSession.isOpen) {
[FBRequestConnection startForMeWithCompletionHandler:^(FBRequestConnection *connection,id<FBGraphUser> user,NSError *error) {
if (!error) {
NSString *fbID = user.id;
NSLog(@"UserID: %@",fbID);
NSLog(@"TESTING: %@",user.name);
}
}];
}
}
- (void)loginViewFetchedUserInfo:(FBLoginView *)loginView
user:(id<FBGraphUser>)user {
NSLog(@"Hello %@!", user.first_name);
}
- (void)loginView:(FBLoginView *)loginView handleError:(NSError *)error {
NSLog(@"FBLoginView encountered an error=%@", error);
}
i have 1 small and 1 big (topic) question. 我有1个小问题和1个大问题。
The small : The request gets fullfilled allright and i get a nice log of it: 小 :请求得到满足,我得到了一个很好的日志:
Response Body:
(
{
body = {
gender = male;
id = ###;
...
};
code = 200;
}
)
But somehow my 2 testlogs dont show, any ideas? 但不知怎的,我的2个测试日志没有显示,任何想法?
The big (topic): I establish that connection in a designated controller in my app. 大(主题):我在我的应用程序中的指定控制器中建立该连接。 my problem is that on every restart of the app the connection somehow is lost (session not active anymore).. Is there a way to establish an infinite connection using the
FBLoginView
? 我的问题是,每次重新启动应用程序时,连接都会丢失(会话不再活动)..有没有办法使用
FBLoginView
建立无限连接?
I have added the following calls & methods to my appdelegate: 我在appdelegate中添加了以下调用和方法:
//upon start:
if (![FBSession activeSession].isOpen) {
[self connectWithFacebook];
}
- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI
{
//..
return [FBSession openActiveSessionWithReadPermissions:permissions
allowLoginUI:allowLoginUI
completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
if (error) {
NSLog (@"Handle error %@", error.localizedDescription);
} else {
[FBSession setActiveSession:session];
[self checkSessionState:state];
}
}];
}
- (void) connectWithFacebook {
[self openSessionWithAllowLoginUI:YES];
}
- (void) checkSessionState:(FBSessionState)state {
switch (state) {
case FBSessionStateOpen:
break;
case FBSessionStateCreated:
break;
case FBSessionStateCreatedOpening:
break;
case FBSessionStateCreatedTokenLoaded:
break;
case FBSessionStateOpenTokenExtended:
// I think this is the state that is calling
break;
case FBSessionStateClosed:
break;
case FBSessionStateClosedLoginFailed:
break;
default:
break;
}
}
this allows relogin, but every time the app is opened the login screen shows again which is not very userfriendly. 这允许重新登录,但每次打开应用程序时,登录屏幕再次显示,这对用户不太友好。 Is there a solution to this, and if yes, what am i missing or in what direction could i proceed?
有没有解决方案,如果是的话,我缺少什么或我可以在什么方向进行?
This is my implementation, keeps the session open for 60 days (maximum allowed time by FB SDK 3.2.1) 这是我的实现,保持会话开放60天(FB SDK 3.2.1允许的最长时间)
- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI
{
NSArray *readPermissions = @[@"email",@"friends_birthday",@"friends_likes",@"friends_interests",@"user_birthday",@"user_interests",@"user_likes",@"user_location"];
return [FBSession openActiveSessionWithReadPermissions:readPermissions
allowLoginUI:allowLoginUI
completionHandler:^(FBSession *session,
FBSessionState state,
NSError *error) {
[self sessionStateChanged:session
state:state
error:error];
}];
}
- (void)sessionStateChanged:(FBSession *)session
state:(FBSessionState)state
error:(NSError *)error
{
switch (state) {
case FBSessionStateOpen: {
// We have a valid session
NSLog(@"User session found");
if (FBSession.activeSession.isOpen) {
[FBRequestConnection
startForMeWithCompletionHandler:^(FBRequestConnection *connection,
id<FBGraphUser> user,
NSError *error) {
if (!error) {
NSLog(@"accessToken: %@ userID: %@",[FBSession activeSession].accessTokenData.accessToken,user.id);
self.userID = user.id;
[[NSUserDefaults standardUserDefaults] setValue:user.first_name forKey:@"first_name"];
[[NSUserDefaults standardUserDefaults] setValue:user.last_name forKey:@"last_name"];
NSString *accessToken = [FBSession activeSession].accessTokenData.accessToken;
if (accessToken) {
[[NSNotificationCenter defaultCenter] postNotificationName:FacebookLoginInProgressNotification object:nil];
[self submitFacebookUserID:user.id andAccessToken:accessToken];
}
else {
NSLog(@"no access token for userID: %@",user.id);
[[NSNotificationCenter defaultCenter] postNotificationName:FacebookLoginFailureNotification object:nil];
}
}
else {
//handle error retrieving User ID
NSLog(@"error retrieving User ID [%@]",[error localizedDescription]);
[[NSNotificationCenter defaultCenter] postNotificationName:FacebookLoginFailureNotification object:nil];
}
}];
} else {
[FBSession setActiveSession:session];
}
// Pre-fetch and cache the friends for the friend picker as soon as possible to improve
// responsiveness when the user tags their friends.
FBCacheDescriptor *cacheDescriptor = [FBFriendPickerViewController cacheDescriptor];
[cacheDescriptor prefetchAndCacheForSession:session];
}
break;
case FBSessionStateClosed: {
[FBSession.activeSession closeAndClearTokenInformation];
}
break;
case FBSessionStateClosedLoginFailed: {
[FBSession.activeSession closeAndClearTokenInformation];
}
break;
default:
break;
}
[[NSNotificationCenter defaultCenter]
postNotificationName:FBSessionStateChangedNotification
object:session];
if (error) {
NSLog(@"Facebook Error %@", error);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.