จะลบคุกกี้ทั้งหมดของ UIWebView ได้อย่างไร?


91

ในแอปพลิเคชันของฉันฉันมีหน้าที่UIWebviewโหลด linkedin auth เพื่อเข้าสู่ระบบ เมื่อผู้ใช้เข้าสู่ระบบคุกกี้จะบันทึกลงในแอปพลิเคชัน

แอพของฉันมีปุ่มล็อกเอาต์ที่ไม่เกี่ยวข้องกับการล็อกอินที่เชื่อมโยง ดังนั้นเมื่อผู้ใช้คลิกที่ปุ่มนี้เขาจะออกจากระบบแอป ฉันต้องการให้การออกจากระบบนี้จะล้างคุกกี้ที่เชื่อมโยงของเขาออกจากแอปด้วยเพื่อให้ผู้ใช้นั้นออกจากระบบโดยสมบูรณ์

คำตอบ:


209

ตามคำถามนี้คุณสามารถอ่านคุกกี้แต่ละรายการใน "ขวดคุกกี้" และลบออกได้ดังนี้:

NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [storage cookies]) {
   [storage deleteCookie:cookie];
}
[[NSUserDefaults standardUserDefaults] synchronize];

@Felipe พบวิธีชั่วคราวต้องลบคุกกี้ในการโหลดแอปหากคุณออกจากระบบครั้งล่าสุด
Ishu

@Ishu ใช่นั่นคือสิ่งที่ฉันกำลังทำอยู่ตอนนี้ แต่มันไม่ได้ตอบคำถามเกี่ยวกับวิธีการลบคุกกี้ตลอดไปจริงๆไม่ใช่แค่สำหรับเซสชั่นปัจจุบันเท่านั้น
Felipe Brahm

มันลบคุกกี้อย่างถาวร การร้องขอใด ๆ ที่เกิดขึ้นหลังจากนั้นอาจส่งผลให้คุกกี้ถูกสร้างขึ้นใหม่ นอกจากนี้หากคุณต้องการลบคุกกี้เฉพาะในสถานการณ์ที่ผู้ใช้กำลังออกจากระบบฉันขอแนะนำให้ลบคุกกี้เซสชันเท่านั้นเนื่องจากการออกจากระบบเป็นเพียงการยุติเซสชันเท่านั้น มิฉะนั้นคุณจะสูญเสียการตั้งค่าที่เป็นไปได้ที่ผู้ใช้ต้องการคงอยู่ตลอดเซสชัน
dsingleton

19
อย่าลืมเรียก [[NSUserDefaults standardUserDefaults] ซิงโครไนซ์] เพื่อให้แน่ใจว่าการเปลี่ยนแปลงถูกบันทึกลงในดิสก์ @felipe นี่คือสาเหตุที่คุณเห็นคุกกี้กลับมาในการรันครั้งต่อไป
Yetanotherjosh

ฉันลองสิ่งนี้ แต่พื้นที่เก็บข้อมูลกลับเป็น 0 ฉันทดสอบบน iOS 8 Simulator ดังนั้นฉันจะลบคุกกี้ของ Facebook บนซาฟารีได้อย่างไร
Nada Gamal

8

แค่อยากจะเพิ่มข้อมูลบางอย่างเกี่ยวกับเรื่องนี้

ในOS X 10.9 / iOS 7และใหม่กว่าคุณสามารถใช้-resetWithCompletionHandler:เพื่อล้างคุกกี้และแคช ฯลฯ ของแอพทั้งหมดจากsharedSession:

ล้างคุกกี้แคชและที่เก็บข้อมูลรับรองทั้งหมดลบไฟล์ดิสก์ล้างการดาวน์โหลดที่อยู่ระหว่างดำเนินการลงในดิสก์และทำให้แน่ใจว่าคำขอในอนาคตจะเกิดขึ้นบนซ็อกเก็ตใหม่

[[NSURLSession sharedSession] resetWithCompletionHandler:^{
    // Do something once it's done.
}];

สำหรับในวงด้วยdeleteCookie:เสียงเหมือนการปรับเปลี่ยนในขณะที่แจงคอลเลกชันให้ฉัน (ไม่รู้อาจเป็นความคิดที่ไม่ดี?)


ฉันใช้ทั้งสองวิธีซึ่งทำงานได้สำเร็จ แต่ฉันยังพบว่า google ยังคงแสดงประวัติการค้นหาทั้งหมดหลังจากนี้ (ไม่ได้ลงชื่อเข้าใช้) ความคิดใด ๆ ? ขอบคุณ
mylogon

สิ่งนี้จะส่งผลต่อสถานะของ Alamofire และการใช้ Backend REST API ของฉันหรือไม่ Alamofire ไม่ได้ใช้โซลูชันบน URLSession ใช่หรือไม่
Sajjon

1

คุณสามารถสร้างฟังก์ชันภายใน html ของ WebView ที่ทำความสะอาดคุกกี้ได้

หากคุณต้องการให้ทำความสะอาดเพียงครั้งเดียวคุณสามารถเรียกใช้ฟังก์ชันนี้ด้วยเหตุการณ์ Titanium ได้ก็ต่อเมื่อแอปเริ่มทำงาน


1

หากใครกำลังมองหา Swift Solution:

    let storage = HTTPCookieStorage.shared
    if let cookies = storage.cookies{
        for cookie in cookies {
             storage.deleteCookie(cookie)
        }
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.