2011-08-06 51 views
1

這是一個非常奇怪的錯誤。登錄時,facebook對象不在設備上的safari上存儲任何cookie,但它在模擬器上。我怎麼知道?Facebook iOS SDK不存儲訪問Cookie

NSHTTPCookie *cookie; 
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
for (cookie in [storage cookies]) 
{ 
    NSString* domainName = [cookie domain]; 
    NSLog(domainName); 
    NSRange domainRange = [domainName rangeOfString:@"facebook"]; 
    if(domainRange.length > 0) 
    { 
     [storage deleteCookie:cookie]; 
    } 
} 

在模擬器上運行時,我可以看到兩個cookie的名稱。我在設備上得到零。即使使用來自Facebook的DemoApp也會發生這種情況。 我不知道這是從哪裏來的,所以我真的不知道我可以提供哪些信息以使帖子更完整。請,請求我任何我現在失蹤的東西。代碼只是從DemoApp,我沒有改變/添加/刪除任何東西。

謝謝。

回答

12

可能是運行與iOS的庫一個奇怪的事情。

請記住,每一個iOS應用具有獨立的存儲空間 - 他們一直這樣,使其他應用程序不能碰不屬於它的東西。這種沙盒可以防止惡意或嚴重的應用程序損害除自己以外的任何內容。

這是Safari瀏覽器在iPhone上如此 - 在Safari瀏覽器會話設置cookie不提供給您的應用程序。在您的應用中設置在UIWebView中的Cookie不適用於Safari。由於在桌面OSX系統上有一些混淆,你可以共享cookie。儘管使用了類方法的誘惑名稱SharedHTTPCookieStorage,但您無法在iOS上這樣做。

Facebook的SDK驗證碼最多可以嘗試三種方式在設備上驗證...它可以調用Facebook的應用程序,並要求通過它來進行身份驗證,允許該應用程序的用戶只需要登錄一次。如果未安裝FB應用程序,它將在移動Safari瀏覽器中打開一個窗口並嘗試登錄,並在瀏覽器的沙箱中設置cookie(如果可以)。如果它既不能打開,也會在應用程序空間中打開一個UIWebView,並將其Cookie存儲在您的應用程序本地。

我猜想,驗證是發生在你的模擬器上你的iPhone不同的地方,所以餅乾住到別處去。

什麼是很無奈的是,如果你使用基於特徵的漂亮的單點登錄,你不能再開UIWebViews中到Facebook在你的應用程序,而不必強制第二次登錄。 Cookie不適用於您。

+0

這仍然是這種情況嗎?我想知道現在是否有辦法解決這個問題,因爲要求用戶登錄兩次是相當煩人的... – Smikey

+3

是的 - 我沒有看到這個變化。 Facebook身份驗證過程實際上是獲取令牌,因此您可以使用API​​ - 瀏覽器Cookie是一個附帶好處。 FB應用程序爲您提供身份驗證令牌,以通過單點登錄使用API​​調用,從而將瀏覽器Cookie視爲另一項任務。身份驗證令牌是您的應用使用有限權限登錄的功能 - 而瀏覽器Cookie對於用戶來說就是城堡的關鍵字。 – giff