iPhone 应用程序可以读取 Safari Mobile 之前存储的 cookie 吗?
8 回答
要实际回答您的问题:
不。
SDK 应用程序无法访问 Mobile Safari 的 cookie。每个 SDK 应用程序都有自己的 WebKit 缓存和 cookie 存储,因此虽然 cookie 将在同一个应用程序中持久存在,但它们无法在应用程序之间访问。
从 iOS 9 开始,这是可能的!
您将需要设置:
- 应用中用于接收 cookie 数据的自定义 URL 方案。
- 您从中获取 cookie 的网站需要实现特定于您应用的自定义 URL 方案的 API,以重定向回您的应用。
你可以克隆这个repo,它有一个完整的工作演示。
希望这可以帮助,
利亚姆
如果您可以访问服务器 url,实际上有一种有趣的方式。
- 在您的应用程序中启动带有移动 safari 的服务器 url。
- 目标服务器 url 读取 cookie 并重定向回应用程序特定的 url (myapp://cookie=123)
- 然后应用程序切换回来,您可以从 url 处理程序中读取该值
这有点 hacky,因为应用程序会切换移动 safari,然后立即切换回应用程序。但是,这是可能的。
请注意,在 iOS 8 上,您最好使用Safari 密码共享来解决一些导致此问题的用例。
这不是直接可能的,但在网站的合作下是可能的。
澄清一下,用户案例是一个 Objective C 应用程序想要读取一个 cookie 的值,该值是由一个网站在移动 safari 中设置的。(即,特别是 UIWebView 不参与设置 cookie)
你的应用应该这样做:
- 使用 [[UIApplication sharedApplication] openURL:url] 启动移动 Safari;
- URL 应该是一个特殊的,例如。http://yourwebsite.com/give-ios-app-the-cookie
- 在您的网站上,当该 url 启动时,发出重定向到 your-app-url-scheme:cookievalue= (例如,angeringbirds:cookievalue=hh4523523sapdfa )
- 当您的应用程序委托接收 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 处理 url 以获取 cookie 值
请注意,您不应在应用程序启动时自动执行此操作 - 用户将看到传输到 Mobile Safari 并返回,这不是一个好的用户体验,Apple 将拒绝您的应用程序(Apple 还认为这是“上传用户的个人数据未经他们事先同意而送达服务器”)。最好是响应用户,注意用户体验 - 例如。等待用户点击“登录”按钮,然后执行此操作,如果用户未登录您的网站,http: //yourwebsite.com/give-ios-app-the-cookie应该向用户显示登录信息Safari 中的屏幕。如果用户已登录,您可以在 Safari 中短暂显示“自动登录...”屏幕一两秒,然后再将用户重定向回来。
当然,没有办法让它与 hotmail/gmail/etc 一起使用——它需要是你自己的网站。
归功于移动 safari 和 iOS 应用程序中的唯一标识符,以建议这种方法。
由于 iPhone 上的沙盒功能,您无法访问 Safari 的 cookie。您只能访问在您的应用程序中创建的 cookie - 例如通过 UIWebView。
尽管您之前曾两次 问过相同的问题,但这里有一种方法尚未提及...
这可能有点令人费解,但您可以使用UIWebView做 Greasemonkey 式的事情。像这样的东西:
- 加载您的目标页面
- 制作一些 javascript 来读取 document.cookie 并返回你需要的数据
- 在webViewDidFinishLoad委托中,使用stringByEvaluatingJavaScriptFromString消息将此 javascript 注入 UIWebView
我已经使用这种技术来增强 iPhone 应用程序中的第 3 方页面,但我不确定它是否会从与 Safari 移动设备相同的位置读取 cookie。
值得一试吗?
这是我的 utils 获取/设置 cookie 方法。
+(void)setCookie:(NSString *)key withValue:(NSString *)value {
NSArray *keys = [NSArray arrayWithObjects:
NSHTTPCookieDomain,
NSHTTPCookieExpires,
NSHTTPCookieName,
NSHTTPCookiePath,
NSHTTPCookieValue, nil];
NSArray *objects = [NSArray arrayWithObjects:
@"YOURDOMAIN",
[NSDate distantFuture],
key,
@"/",
value, nil];
NSDictionary *dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:dict];
NSHTTPCookieStorage *sharedHTTPCookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
[sharedHTTPCookieStorage setCookie:cookie];
}
+(NSString *)getCookie:(NSString *)key {
NSHTTPCookieStorage *sharedHTTPCookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *cookies = [sharedHTTPCookieStorage cookiesForURL:[NSURL URLWithString:@"YOURDOMAIN"]];
NSEnumerator *enumerator = [cookies objectEnumerator];
NSHTTPCookie *cookie;
while (cookie = [enumerator nextObject])
{
if ([[cookie name] isEqualToString:key])
{
return [cookie value];
}
}
return nil;
}
你可能想检查
if ([[NSHTTPCookieStorage sharedHTTPCookieStorage] cookieAcceptPolicy] != NSHTTPCookieAcceptPolicyAlways) {
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
}
但显然 NSHTTPCookieStorage 甚至不保存来自 iOS 上当前应用程序中最后一个请求的 cookie (rdar://8190706)