2016-09-29 70 views
15

Yerel iPhone uygulamamda, giriş/kayıt yapılmasına izin veren bir web sitesinde WKWebView kullanıyorum ve oturum bilgilerini çerezlerde saklıyor. Çerez bilgilerinin nasıl kalıcı olarak saklanacağını anlamaya çalışıyorum, böylece uygulama yeniden başlatıldığında, kullanıcının hala web oturumu kullanılabilir.WKWebView Çerezlerin Kalıcı Depolama Alanı

Uygulamada 2 WKWebView var ve bir WKProcessPool paylaşıyorlar. Paylaşılan bir süreç havuzu ile başlar: Ben ilk WKWebView kullanarak giriş ve sonra bir süre sonra 2 WKWebView için harekete geçmesi

WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init]; 
theConfiguration.processPool = processPool; 
self.webView = [[WKWebView alloc] initWithFrame:frame configuration:theConfiguration]; 

: Her WKWebView için Ardından WKProcessPool *processPool = [[WKProcessPool alloc] init];

oturum tutulur, böylece çerezler başarıyla paylaşıldı. Ancak, uygulamayı yeniden başlattığımda yeni bir işlem havuzu oluşturuluyor ve oturum bilgisi yok oluyor. Bir uygulamanın yeniden başlatılmasıyla oturum bilgisinin kalıcı hale gelmesi için herhangi bir yol var mı? Bilgileri NSUserDefaults'da saklayın.

+0

"WKWebView" verilerini kaydetmek için ek işlemler yapmanız gerekmiyor - bu otomatik olarak kaydedilmelidir (açıklanması gereken tek şey "defaultDataStore" kullanıyor olmanızdır yapılandırmada, çünkü diske kaydedilen yalnızca bir tanesidir). WKWebView'de oturum bilgisinin kaybolduğundan emin misiniz? Çerezlerin küçük ttl veya başka bir şey olması mümkün mü? Bunu kontrol ettin mi? –

cevap

9

a) hala Apple (Bence) ve b) istediğini çerezleri bağlıdır çözülür değil bazı bug, sanırım bulunmasından dolayı aslında olsa biridir.

Şimdi bu test etmek mümkün değildi, ama sana bazı ipuçları verebiliriz:

  1. Alma çerezleri NSHTTPCookieStorage.sharedHTTPCookieStorage() dan. Görünüşe göre bu çerezler, onları bulmak için NSHTTPCookieStorage için hemen kaydedilmiyor. People, işlem havuzunu sıfırlayarak bir kaydetmeyi tetiklemenizi önerir, ancak bunun güvenilir şekilde çalışıp çalışmadığını bilmiyorum. Bunu kendiniz için denemek isteyebilirsiniz.
  2. İşlem havuzu, tanımlama bilgilerini (aslında doğru şekilde belirttiğiniz şekilde paylaşılıp paylaşılmadıklarını tanımlar olsa da) kazandıran bir özellik değildir. Belgeleme, bunun WKWebsiteDataStore olduğunu söylüyor, ben de öyle görünüyor. En azından fetchDataRecordsOfTypes:completionHandler: kullanarak kurabiyeleri almak mümkün olabilir (bunları nasıl ayarlayacağınızdan emin değilsiniz, ve sanırım işlem havuzunda olduğu gibi aynı kullanıcı için depoyu kullanıcı varsayılanlarına kaydedemezsiniz).
  3. İhtiyacınız olan çerezleri (veya onların değerlerini) almayı başarırsınız, ancak sanırım geri yüklenemeyeceğini düşündüğümden emin olun, here'a bakın (temelde httprequest'i bunlarla önceden nasıl hazırlayacağınızı gösterir, ilgili bölüm: [request addValue:@"TeskCookieKey1=TeskCookieValue1;TeskCookieKey2=TeskCookieValue2;" forHTTPHeaderField:@"Cookie"]).
  4. Diğer her şey başarısız olursa, this'u kontrol edin. Sadece bağlantı sağladığını biliyorum sadece cevaplar iyi değil, ama hepsini kopyalayamıyorum ve sadece tamamlama uğruna eklemek istiyorum.

Genel olarak son bir şey: Başarınızın aynı zamanda çerez türüne de bağlı olabileceğini söyledim. Bunun nedeni, this answer'un sunucu tarafından ayarlanan çerezlere NSHTTPCookieStorage aracılığıyla erişilemediğini bildirmesidir. Sizin için alakalı olup olmadığını bilmiyorum (sanırım öyle, muhtemelen bir oturum, yani sunucu-set çerez, doğru mu?) ve bunun diğer yöntemlerin de başarısız olduğu anlamına gelip gelmediğini bilmiyorum.

Diğer her şey başarısız olursa, kullanıcı kimlik bilgilerini bir yerde (örneğin anahtarlık) kaydetmeyi ve bir sonraki uygulamada otomatik olarak yeniden başlatmaya başlamanızı öneririz. Bu, tüm oturum verilerini geri yüklemeyebilir, ancak kullanıcı, aslında arzu edilen bir uygulamadan vazgeçmeyi düşünebilir mi? Ayrıca, belirli değerler, daha sonra kullanılmak üzere, here gibi bir enjekte edilen betik kullanılarak yakalanıp kaydedilebilirler (başlangıçta bunları başlangıçta ayarlamak için değil, belki de bir noktada onları geri almak için değil).).

İnşallah, bu sizi en azından sorunu çözecek bazı yeni yönlere yönlendirebilir. Olması gerektiği gibi önemsiz değil, o zaman (daha sonra, oturum çerezleri bir güvenlik ilgili şey tür, bu yüzden belki App onları gizleyerek Apple tarafından bilinçli bir tasarım seçimi ...).

+0

Nihayetinde NSHTTPCookiesStorage'da bazı çerezleri görüntüleyebildim, bu yüzden haklıydınız, belki hemen kaydedilemedi. Bununla birlikte, oturum için gerekli olan çerez orada görünmüyordu, bu yüzden sunucu tarafı çerezleriyle ilgili son noktanız muhtemelen ne oluyordur. – haplo1384

+0

Dang, bu çok kötü. Sanırım uygulama tamamen yeniden başlatılırsa muhtemelen etkin bir şekilde yeniden girmeniz gerekecek. Kullanıcının kimlik bilgilerini güvenli bir yerde sakladığınız sürece (en azından parola için anahtarlık öneririm) iyi olması gerekir. Elbette ideal değil, ama bu şekilde uygun bir HTTPRequest ile yeni bir oturum jetonu isteyebilirsiniz? – Gero

-1

Aynı zamanda oturum bilgisi çok kritikse, KeyChain'da saklamak daha iyidir. Eğer/deşifre sizin Web Görünümü kodlamak için NSCoder kullanın ve NSUserDefaults gibi başka bir yere saklayın, böylece

+0

Kullanıcı bilgilerini varsayılan olarak saklar mısınız? WKProcessPool varsayılan olarak saklanamaz, kodlayabilmek için hatalar vardır. – haplo1384

0

WKWebView, NSCoding uygundur.

//return data to store somewhere 
NSData* data = [NSKeyedArchiver archivedDataWithRootObject:self.webView];/ 

self.webView = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
+0

Teşekkürler, ancak yeni bir uygulama başlatıldıktan sonra nsuserdefault'tan WKWebView alınırken, web sitesinin oturum bilgileri korunamadı. – haplo1384

3

Partiye biraz geç kaldım ama insanlar bunu yararlı bulabilir. Bir geçici çözüm var, biraz sinir bozucu ama ben en azından elma kendi aptal API'leri düzeltmek kadar güvenilir bir şekilde çalışan tek çözüm olduğunu söyleyebiliriz ...

Ben iyi bir 3 gün geçirmeye çalışıyorum Önbelleğe alınmış çerezleri WKWebView'dan almamı söyleyememe gerek yok ki ... ... hiçbir şey yapmadım ... ... sonunda çerezleri doğrudan sunucudan alabilirim.

yapmaya çalıştığım ilk şey WKWebView içinde koşuyordu javascript ile tüm tanımlama almak ve sonra sadece UserDefaults bunları saklamak istiyorum WKUserContentController onları geçmek olduğunu. Bu, httponly çerezleri beri işe yaramadı ve görünüşe göre javascript ile alamıyorsunuz ...

Sunucu tarafında sayfaya bir javascript çağrısı ekleyerek sabitleme bitti (Ruby on Rail benim durumumda)

sendToDevice("key:value")

yukarıda js fonksiyonu

basit bir şekilde araç için tanımlama geçmektedir. Umarım bu, birinin aklı başında kalmasına yardımcı olur ...