Objective c iOS-Facebook Connect注销未删除登录详细信息?
我在另一个项目上使用了Facebook Connect,问题相对较少,但在我当前的项目上,当我调用Objective c iOS-Facebook Connect注销未删除登录详细信息?,objective-c,ios,facebook,Objective C,Ios,Facebook,我在另一个项目上使用了Facebook Connect,问题相对较少,但在我当前的项目上,当我调用[Facebook注销]时,似乎出现了问题它不会删除用户详细信息。如果随后重新启动应用程序,则didFinishLaunchingWithOptions功能中有以下内容: facebook = [[Facebook alloc] initWithAppId:@"XXXXXXXXXXXXX" andDelegate:self]; NSUserDefaults *defaults = [NSUserDe
[Facebook注销]时,似乎出现了问题代码>它不会删除用户详细信息。如果随后重新启动应用程序,则didFinishLaunchingWithOptions功能中有以下内容:
facebook = [[Facebook alloc] initWithAppId:@"XXXXXXXXXXXXX" andDelegate:self];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if([defaults objectForKey:@"FBAccessTokenKey"]
&& [defaults objectForKey:@"FBExpirationDateKey"]){
facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
}
NSLog(@"startup login");
[self loginToFacebook];//attempt to login automatically on startup
我的登录Facebook功能如下:
- (void)loginToFacebook
{
NSLog(@"Logging into facebook");
//set up facebook and login in automatically if possible
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if([defaults objectForKey:@"FBAccessTokenKey"]
&& [defaults objectForKey:@"FBExpirationDateKey"]){
facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
}
if (![facebook isSessionValid]){
//get permissions that user will need to agree to us using
NSArray *permissions = [[NSArray alloc] initWithObjects:
@"user_likes",@"read_friendlists",@"offline_access", @"publish_stream",
nil];
//authorise our login
[facebook authorize:permissions];
[permissions release];
}
else
{
[facebook authorize:nil];
}
}
就我而言,这次应该提示我用我的电子邮件和密码登录。
我主要是使用模拟器,所以Facebook应用程序本身不是原因,在Facebook.h类中,我已经改变了
[self authorizeWithFBAppAuth:NO safariAuth:YES];
到
然而,当我已经登录时,facebook窗口会短暂地闪烁并消失,正如我所期望的那样。然后从我以前的登录详细信息中加载我的id、姓名、好友列表等。我再也不可能改变用户了!我应该补充一点,我有以下代码,在“注销”时相应打印:
- (void)fbDidLogout{
NSLog(@"Logged out of facebook");
}
…在调用[facebook注销]时打印到控制台。我也有正确的url方案,所以没有问题
正如我所说,我已经在另一个应用程序上运行了这个程序,但我看不出这次我可能忽略了什么。
我欢迎任何建议,因为我怀疑这是一件非常简单的事情
编辑:我刚刚在一台设备上进行了测试,尝试登录Facebook导致应用程序崩溃。我怀疑这是因为它试图使用“存储的”信息登录,而该信息不存在,因为我还没有登录到该设备。我仍在调查,但如果有人能发现明显的缺陷,我将非常感激
Edit2:我试着用safecase的例子删除cookies。我还在a)didFinishLaunchingWithOptions和b)fbDidLogout期间打印所有cookie,我得到以下信息:
(a)
`2012-05-18 10:40:40.665 MyApp[15545:17003](
“
“”,
"",
"",
"",
"",
"",
"",
""
)`
(b)
2012-05-18 10:41:16.530 MyApp[15545:17003](
)
由于它变为空,我假设它们已被删除。但当重新打开应用程序时,它们又都出现了
Edit3:我发现的唯一解决方法是在应用程序打开后立即删除所有cookie,但这意味着用户每次都必须登录,即使他们上次打开应用程序时自己没有登录。目前这只是一个临时修复,我仍然不确定它为什么不能正常工作。当用户单击注销并删除所有存储在userdefault for facebook中的密钥时,您提供了此方法
- (void)fbDidLogout
{
NSLog(@"Logged out of facebook");
NSHTTPCookie *cookie;
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (cookie in [storage cookies])
{
NSString* domainName = [cookie domain];
NSRange domainRange = [domainName rangeOfString:@"facebook"];
if(domainRange.length > 0)
{
[storage deleteCookie:cookie];
}
}
}
注意:除了FB应用程序将登录信息存储在NSUserDefaults
中外,它还使用名称m_user
将登录信息存储在NSHTTPCookieStorage
中。您可以删除此记录,以便FB再次询问您的登录信息
希望这些信息能对您有所帮助。[appDelegate.session closeAndClearTokenInformation]
就这一行代码,帮我清理了我的代币。恐怕没有任何区别。facebook类已经在其invalidateSession函数中包含了cookie删除,该函数在[facebook注销]中调用。我仍然尝试将您的代码显式添加到我的fbDidLogout函数中,但问题仍然存在。将此添加到我的代码开头,因此每次启动时都会清除登录详细信息。不太理想,但它现在可以工作了。好的,所以我尝试了使用NSLog(@“%@,[[nshttpcookeStorage sharedhttpcookeStorage]cookies])
检查存在哪些cookie,并且足够多的m_用户显示为其中一个cookie。我不明白的是facebook类应该删除这些,根据safecase的建议,我尝试在注销时手动将它们全部删除。出于某种原因,它只工作了一次,但每隔一次我注销并重新启动它时,它就会保留cookies。我记得我在这个API中修复了一些源代码。请检查注销方法是否确实向服务器发送注销消息。是否需要?它这样做的事实是:self.accessToken=nil;self.expirationDate=nil;NSHTTPookieStorage*cookies=[NSHTTPookieStorage SharedHTTPookieStorage];NSArray*facebookCookies=[cookies cookies ForURL:[NSURL URLWithString:@]http://login.facebook.com"]]; 对于(面BookCookies中的NSHTTPCookie*cookie){[cookies deleteCookie:cookie];}
不足以防止此问题。
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"FBAccessTokenKey"];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"FBExpirationDateKey"];
- (void)fbDidLogout
{
NSLog(@"Logged out of facebook");
NSHTTPCookie *cookie;
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (cookie in [storage cookies])
{
NSString* domainName = [cookie domain];
NSRange domainRange = [domainName rangeOfString:@"facebook"];
if(domainRange.length > 0)
{
[storage deleteCookie:cookie];
}
}
}
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"FBAccessTokenKey"];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"FBExpirationDateKey"];