Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c iOS-Facebook Connect注销未删除登录详细信息?_Objective C_Ios_Facebook - Fatal编程技术网

Objective c iOS-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 Connect,问题相对较少,但在我当前的项目上,当我调用
[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"];