इस उत्तर को पोस्ट करने के पीछे कारण है कि मैंने कई समाधान की कोशिश की, लेकिन कोई भी ठीक से काम नहीं करता है, अधिकांश उत्तर उस स्थिति में काम नहीं करते हैं जहां पहली बार कुकी सेट करनी है, और परिणाम कुकी पहली बार सिंक नहीं हुई है, कृपया इस समाधान का उपयोग करें दोनों के लिए काम करें iOS> = 11.0 <= iOS 11 8.0 तक, पहली बार कुकी सिंक के साथ भी काम करें।
IOS के लिए = = 11.0
- स्विफ्ट 4.2
Http कुकीज़ प्राप्त करें और wkwebview कुकी स्टोर में इस तरह से सेट करें, यह wwwebview में आपके अनुरोध को लोड करने के लिए बहुत ही मुश्किल बिंदु है , जरूरी लोड करने के लिए अनुरोध भेजा जब कुकीज़ पूरी तरह से सेट किया जा वाला, यहाँ समारोह है कि मैं लिखा था।
आप लोड वेबव्यू को पूरा करने में बंद होने के साथ कॉल फ़ंक्शन । FYI करें यह फ़ंक्शन केवल iOS> = 11.0 को संभालता है
self.WwebView.syncCookies {
if let request = self.request {
self.WwebView.load(request)
}
}
यहाँ SyncCookies फ़ंक्शन के लिए कार्यान्वयन है ।
func syncCookies(completion:@escaping ()->Void) {
if #available(iOS 11.0, *) {
if let yourCookie = "HERE_YOUR_HTTP_COOKIE_OBJECT" {
self.configuration.websiteDataStore.httpCookieStore.setCookie(yourCookie, completionHandler: {
completion()
})
}
} else {
//Falback just sent
completion()
}
}
IOS 8 के लिए iOS 11 तक
आपको कुछ अतिरिक्त चीजों को सेटअप करने की आवश्यकता है जिन्हें आपको WKUserScript का उपयोग करके दो बार कुकीज़ सेट करने की आवश्यकता है और साथ ही अनुरोध में कुकीज़ जोड़ना न भूलें, अन्यथा आपकी कुकी पहली बार सिंक नहीं होती है और आप देखेंगे कि आप पृष्ठ को पहली बार ठीक से लोड नहीं कर रहे हैं। यह वह बिल्ली है जिसे मैंने iOS 8.0 के लिए कुकीज़ का समर्थन करने के लिए पाया था
इससे पहले कि आप Wkwebview ऑब्जेक्ट निर्माण।
func setUpWebView() {
let userController: WKUserContentController = WKUserContentController.init()
if IOSVersion.SYSTEM_VERSION_LESS_THAN(version: "11.0") {
if let cookies = HTTPCookieStorage.shared.cookies {
if let script = getJSCookiesString(for: cookies) {
cookieScript = WKUserScript(source: script, injectionTime: .atDocumentStart, forMainFrameOnly: false)
userController.addUserScript(cookieScript!)
}
}
}
let webConfiguration = WKWebViewConfiguration()
webConfiguration.processPool = BaseWebViewController.processPool
webConfiguration.userContentController = userController
let customFrame = CGRect.init(origin: CGPoint.zero, size: CGSize.init(width: 0.0, height: self.webContainerView.frame.size.height))
self.WwebView = WKWebView (frame: customFrame, configuration: webConfiguration)
self.WwebView.translatesAutoresizingMaskIntoConstraints = false
self.webContainerView.addSubview(self.WwebView)
self.WwebView.uiDelegate = self
self.WwebView.navigationDelegate = self
self.WwebView.allowsBackForwardNavigationGestures = true // A Boolean value indicating whether horizontal swipe gestures will trigger back-forward list navigations
self.WwebView.addObserver(self, forKeyPath: #keyPath(WKWebView.estimatedProgress), options: .new, context: nil)
self.view.addConstraint(NSLayoutConstraint(item: WwebView, attribute: .trailing, relatedBy: .equal, toItem: self.webContainerView, attribute: .trailing, multiplier: 1, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: WwebView, attribute: .leading, relatedBy: .equal, toItem: self.webContainerView, attribute: .leading, multiplier: 1, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: WwebView, attribute: .top, relatedBy: .equal, toItem: self.webContainerView, attribute: .top, multiplier: 1, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: WwebView, attribute: .bottom, relatedBy: .equal, toItem: self.webContainerView, attribute: .bottom, multiplier: 1, constant: 0))
}
इस फ़ंक्शन पर ध्यान दें getJSCookiesString
public func getJSCookiesString(for cookies: [HTTPCookie]) -> String? {
var result = ""
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
dateFormatter.dateFormat = "EEE, d MMM yyyy HH:mm:ss zzz"
for cookie in cookies {
if cookie.name == "yout_cookie_name_want_to_sync" {
result += "document.cookie='\(cookie.name)=\(cookie.value); domain=\(cookie.domain); path=\(cookie.path); "
if let date = cookie.expiresDate {
result += "expires=\(dateFormatter.string(from: date)); "
}
if (cookie.isSecure) {
result += "secure; "
}
result += "'; "
}
}
return result
}
यहाँ अन्य चरण wkuserscript है जो तुरंत कुकीज़ को सिंक नहीं करते हैं, कुकी के साथ पहली बार पृष्ठ लोड करने के लिए बहुत सारी बिल्ली है, अगर यह प्रक्रिया समाप्त हो जाती है तो फिर से वेबव्यू फिर से लोड करना है लेकिन मैं इसका उपयोग करने की सलाह नहीं देता, यह उपयोगकर्ता की दृष्टि से अच्छा नहीं है , बिल्ली जब भी आप अनुरोध शीर्षक में अनुरोध सेट कुकीज़ को लोड करने के लिए तैयार हैं, तो इस तरह से आईओएस संस्करण की जांच को जोड़ना न भूलें। लोड अनुरोध से पहले इस फ़ंक्शन को कॉल करें।
request?.addCookies()
मैंने URLRequest के लिए एक्सटेंशन लिखा है
extension URLRequest {
internal mutating func addCookies() {
//"appCode=anAuY28ucmFrdXRlbi5yZXdhcmQuaW9zLXpOQlRTRmNiejNHSzR0S0xuMGFRb0NjbUg4Ql9JVWJH;rpga=kW69IPVSYZTo0JkZBicUnFxC1g5FtoHwdln59Z5RNXgJoMToSBW4xAMqtf0YDfto;rewardadid=D9F8CE68-CF18-4EE6-A076-CC951A4301F6;rewardheader=true"
var cookiesStr: String = ""
if IOSVersion.SYSTEM_VERSION_LESS_THAN(version: "11.0") {
let mutableRequest = ((self as NSURLRequest).mutableCopy() as? NSMutableURLRequest)!
if let yourCookie = "YOUR_HTTP_COOKIE_OBJECT" {
// if have more than one cookies dont forget to add ";" at end
cookiesStr += yourCookie.name + "=" + yourCookie.value + ";"
mutableRequest.setValue(cookiesStr, forHTTPHeaderField: "Cookie")
self = mutableRequest as URLRequest
}
}
}
}
अब आप iOS 8 का परीक्षण करने के लिए तैयार हैं