苦苦于解决这个问题并且不愿实施自定义cookie管理系统.
看来iOS的一些隐藏级别的HTTP实现无法正确管理无会话cookie.每当HTTP响应设置或删除cookie时,立即检查NSHTTPCookieStorage cookie将产生预期结果并指示正确的sessionOnly值.
但是,如果应用程序在响应更新cookie后立即退出,则重新启动时,这些sessionOnly = FALSE cookie将恢复为某个先前状态,并且最新更新将丢失.
是否通过响应头或NSHTTPCookieStorage setCookie设置/删除cookie:没有区别.
一些缓存/同步伏都教必须在幕后进行.cookie变为持久化所需的时间最长可达5秒.
在那里有谁或者可以指出这种行为的明确解释?这是一个简单明了的bug吗?还是一些我无法理解的无证特征?
您可以使用一些代码重现:
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
NSHTTPCookie *cookie;
for (cookie in [NSHTTPCookieStorage sharedHTTPCookieStorage].cookies) {
NSLog(@"%@=%@", cookie.name, cookie.value);
}
NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
[cookieProperties setObject:@"testCookie" forKey:NSHTTPCookieName];
[cookieProperties setObject:[NSString stringWithFormat:@"%f", [[NSDate date] timeIntervalSince1970]] forKey:NSHTTPCookieValue];
[cookieProperties setObject:@"www.example.com" forKey:NSHTTPCookieDomain];
[cookieProperties setObject:@"www.example.com" forKey:NSHTTPCookieOriginURL];
[cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];
[cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];
// set expiration to one month from now
[cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];
cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
}
Run Code Online (Sandbox Code Playgroud)
此代码应在每次启动时输出新值.相反,您会看到如果您快速退出应用程序,则值将保持不变. …
我正在开发一个应用程序,其中服务器递给我一个cookie来识别用户.
我的连续请求需要使用该cookie来获得用户期望的响应.我无法理解的是NSHTTPCookieStorage的共享实例如何以及何时丢失其cookie.
我使用的第一个解决方案是将cookie从我的服务器存档并保存到应用程序终端的用户默认值,然后在应用程序启动时从我的服务器清除现有的cookie并重置我存储的那些.通过开发过程我没有遇到问题,因为调试会话非常短,通常不需要将应用程序放在后台.
在beta测试期间,麻烦开始了.我带来的黑客攻击不仅是在应用程序终止时保存cookie,而且还在API调用后将这些cookie保存回来.并且不仅在应用程序启动时加载已保存的cookie,而且还在应用程序返回到前台时加载.
为什么NSHTTPCookieStorage共享实例摆脱了这些cookie以及处理它的最佳实践是什么,因为它是我的应用程序的重要部分,如果没有经验丰富的开发人员支持,我不能相信这样一个被黑客入侵的解决方案.
提前感谢您的回答
编辑:以下是保存/读取/清除cookie的方法
-(void)saveStoredCookies
{
NSURL *httpUrl = @"http://myServer.com";
NSURL *httpsUrl = @"https://myServer.com";
NSArray *httpCookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpUrl];
NSData *httpCookiesData = [NSKeyedArchiver archivedDataWithRootObject:httpCookies];
[[NSUserDefaults standardUserDefaults] setObject:httpCookiesData forKey:@"savedHttpCookies"];
NSArray *httpsCookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpsUrl];
NSData *httpsCookiesData = [NSKeyedArchiver archivedDataWithRootObject:httpsCookies];
[[NSUserDefaults standardUserDefaults] setObject:httpsCookiesData forKey:@"savedHttpsCookies"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
-(void)readStoredCookies
{
//clear, read and install stored cookies
NSURL *httpUrl = @"http://myServer.com";
NSURL *httpsUrl = @"https://myServer.com";
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpUrl];
for (NSHTTPCookie *cookie in cookies) {
[[NSHTTPCookieStorage …Run Code Online (Sandbox Code Playgroud) 我正在使用iOS AVPlayer播放HLS流.在HLS会话开始时,当我收到index.m3u8 URL以响应创建AVPlayerItem时,响应还会设置基于会话的身份验证所需的cookie.假设这个cookie名称是myCookie,它是为域".myhost.com"创建的.现在一切正常,播放器发送myCookie从xxx.myhost.com/stream下载ts块.随着播放的进行,播放列表最终会更新,播放器会下载更新的播放列表.有时,更新的播放列表包含从其他主机的URL下载的ts块.因此,当尝试使用不同的主机播放块时,播放器请求xxx.someotherhost.com下载块.这导致响应302重定向与位置:xxx-abc.myhost.com/ads.显然AVPlayer没有 从someotherhost.com请求一个块时发送myCookie,因为它与myCookie的域不匹配.但问题是在重定向到xxx-abc.myhost.com/ads后,AVPlayer不发送myCookie,即使重定向URL的域名也是myhost.com,也与cookie的域匹配.
请注意,重定向URL域与原始流域相同,也与myCookie域相同.由于AVPlayer在重定向后没有将cookie发送到下载块,因此ts块请求失败,403 Forbidden(No Token)
我在这里做错了什么,或者这看起来像iOS AVPlayer中的错误?
有没有办法解决这个问题?请分享你的想法.
我遇到了NSRange的问题.这是我的代码:
NSRange range = [[[NSHTTPCookie requestHeaderFieldsWithCookies:[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:[NSURL URLWithString:cookie]]] objectForKey:@"Cookie"] rangeOfString:@"x"];
NSLog(@"%f", range.length);
if (range.length >= 1) {
NSLog(@"Do Something");
} else {
NSLog(@"AUTHING");
}
Run Code Online (Sandbox Code Playgroud)
控制台输出:
0.000000
Do something
Run Code Online (Sandbox Code Playgroud)
然后我第二次浏览代码:
0.000000
AUTHING
Run Code Online (Sandbox Code Playgroud)
这到底是怎么回事?NSNotFound我认为它不起作用,我不是唯一一个发现这个问题的人因此使用它不是一个解决方案.
谢谢你的帮助.
干杯
编辑:我尝试使用NSLog(@"%d",range.length),但它第一次运行时输出错误,第二次运行是正确的.我已经尝试过使用NSNotFound认为奇怪的输出是由于它是NSNotFound但它没有触发
在:这个问题据说AFNetworking在后台自动处理cookie,但在我之前提出的一个问题中,我在登录时在php上保存会话时遇到了麻烦.一旦我关闭(停止调试)在Xcode中)应用程序并在会话中回去了.答案是坚持像这样的cookie来解决问题:
NSData *cookiesData = [[NSUserDefaults standardUserDefaults] objectForKey:@"User"];
if ([cookiesData length] > 0) {
for (NSHTTPCookie *cookie in [NSKeyedUnarchiver cookiesData]) {
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试做这样的事情时,这给了我一个应用程序崩溃.当我登录时,我将NSUserDefault设置为:
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"User"];
//Then synthesize
Run Code Online (Sandbox Code Playgroud)
这是错误的使用方法吗?NSHTTPCookieStorage甚至是我的问题吗?谢谢.
我想登录不同的同一网站的许多帐户webView.例如,我有Tab Bar Controller三个视图控制器,每个视图控制器包含webView.例如,我在每个班级都嵌入了stackoverflow网址webView.用户如何使用这三个帐户同时登录到不同的帐户webView?我试过这个,但我一次只能登录一个用户.我发现我需要cookie为每个人创建单独的UIWebView,但主要是答案是在objective-c而不是我想要的正确答案.例如(First Second Third)任何人都可以告诉我如何做到这一点?
class FirstViewController: UIViewController , UIWebViewDelegate{
@IBOutlet weak var webView: UIWebView!
@IBOutlet weak var activityIndicator: UIActivityIndicatorView!
override func viewDidLoad() {
webView.delegate = self
let requestURL = NSURL(string: "http://stackoverflow.com")
let request = NSURLRequest(URL: requestURL!)
activityIndicator.hidesWhenStopped = true
activityIndicator.startAnimating()
webView.loadRequest(request)
}
func webViewDidFinishLoad(webView: UIWebView) {
activityIndicator.stopAnimating()
}
}
class SecondViewController: UIViewController, UIWebViewDelegate{
@IBOutlet weak var webView: …Run Code Online (Sandbox Code Playgroud) 我的应用程序需要一个注销按钮,我有以下代码:
while ([[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies] count] != 0) {
for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {
[[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
}
}
Run Code Online (Sandbox Code Playgroud)
(只是在那里确保它们被删除,但它只运行一次)
如果我在上面的代码之后NSLog记录共享cookie存储,它输出数组为空.然而,我终止应用程序或只是关闭它,然后NSLog应用程序启动后的第一件事,共享cookie存储的描述,所有的cookie仍然存在.
我已经尝试Cookie在for循环中设置为nil,甚至尝试将dealloc发送到cookie(我知道你不应该这样做,但我现在正在尝试任何事情)
我正在尝试创建一个不在本地跟踪或存储任何浏览历史记录的webview(作为练习).
我已经做到了这一点,当webview关闭时,它会调用以下内容
[[NSURLSession sharedSession]resetWithCompletionHandler:^{}];
Run Code Online (Sandbox Code Playgroud)
但我发现像谷歌搜索历史这样的东西会在会话之间持续存在.我也试过通过单独清除cookie
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [storage cookies]) {
[storage deleteCookie:cookie];
}
[[NSUserDefaults standardUserDefaults] synchronize];
Run Code Online (Sandbox Code Playgroud)
仍无济于事.在创建新的Web视图时,Google搜索仍会显示.
是否有人知道一种方法来删除谷歌用来匹配该搜索历史记录的标识符给我?我担心它的类似于包标识符,这可能有点难以防止被读取.
任何想法都表示赞赏.
此致,
卢克
我正在使用incongnito浏览器。当我清除所有cookie时,我正在使用wkwebview,我可以看到像google这样的流行搜索引擎会记住进行的搜索。
我尝试使用NSURLSession清理NSHTTPCookieStorage中的所有cookie和resetcookies,但仍无法正常工作。
在我们的iPhone应用中,我们在服务器通信期间使用两个cookie 一个是短会话cookie(JSESSION),另一个是长会话cookie(记住我).如果答案来自服务器,它会发送一个短会话cookie,我可以在NSHTTPCookieStorage中找到它.
我的问题是这个存储如何处理cookie的到期日期?因此,如果cookie过期,它是否会自动删除该cookie,如果我尝试在到期后从存储中获取其名称,那么我能得到任何东西吗?或者我是否必须手动检查到期日期?
nshttpcookie ×10
ios ×8
objective-c ×4
iphone ×3
cookies ×2
nsurlsession ×2
wkwebview ×2
afnetworking ×1
avplayer ×1
caching ×1
cocoa-touch ×1
ios5 ×1
nsrange ×1
session ×1
swift ×1
uiwebview ×1