내가 iOS 개-발자라니.

옆집 스위프트: Swift Cookie 종속성 본문

This is da(大) SWIFT

옆집 스위프트: Swift Cookie 종속성

옆집개 2024. 7. 4. 16:47

백그라운드로 보낸뒤 오랜 시간 동안 inactive 상태였지만 완전히 종료되지 않은채 켜지면 쿠키가 다른활동들에 밀려 웹뷰를 못불러오는 상황이 판단되었다.

 

 

그래서 SceneDelegate에 넣기위해 아래 HTTPCookieStorage Extension을 추가하고 값을 UserDefault에 저장해 다시 보내는 방식을 적용해 보았다.

 

HTTPCookieStore Extension:

import Foundation

extension HTTPCookieStorage {
    // 현재의 쿠키값을 삭제
    static func clear() {
        if let cookies = HTTPCookieStorage.shared.cookies {
            for cookie in cookies {
                HTTPCookieStorage.shared.deleteCookie(cookie)
            }
        }
    }

    // 현재 쿠키값을 가져와 UserDefaults에 저장
    static func save() {
        var cookies = [[HTTPCookiePropertyKey: Any]]()
        if let newCookies = HTTPCookieStorage.shared.cookies {
            for newCookie in newCookies {
                var cookie = [HTTPCookiePropertyKey: Any]()
                cookie[.name] = newCookie.name
                cookie[.value] = newCookie.value
                cookie[.domain] = newCookie.domain
                cookie[.path] = newCookie.path
                cookie[.version] = newCookie.version
                if let date = newCookie.expiresDate {
                    cookie[.expires] = date.timeIntervalSince1970
                }
                cookies.append(cookie)
            }
            UserDefaults.standard.setValue(cookies, forKey: "cookies")
            UserDefaults.standard.synchronize()
        }
        print("###cookie saved: \(cookies)")
    }

    // UserDefaults에 저장된 쿠키값을 불러와 set
    static func restore() {
        if let storedCookies = UserDefaults.standard.value(forKey: "cookies") as? [[HTTPCookiePropertyKey: Any]] {
            for storedCookie in storedCookies {
                var cookieProperties = storedCookie
                if let expiresTimeInterval = storedCookie[.expires] as? TimeInterval {
                    cookieProperties[.expires] = Date(timeIntervalSince1970: expiresTimeInterval)
                }
                if let cookie = HTTPCookie(properties: cookieProperties) {
                    HTTPCookieStorage.shared.setCookie(cookie)
                    print("=== cookie loaded: \(cookie)")
                }
            }
            print("###cookie restored: \(storedCookies)")
        }
    }
}

 

 

그리고 

 

SceneDelegate 호출:

func sceneWillEnterForeground(_ scene: UIScene) {
        print("foreground")
        if window?.rootViewController is WebViewController {
            HTTPCookieStorage.restore()
        }
    }
    
func sceneDidEnterBackground(_ scene: UIScene) {
        print("background")
        if window?.rootViewController is WebViewController {
            HTTPCookieStorage.save()
        }
    }