iPhone xcode 应用程序可以读取 Safari Mobile 之前存储的 cookie 吗?
Posted
技术标签:
【中文标题】iPhone xcode 应用程序可以读取 Safari Mobile 之前存储的 cookie 吗?【英文标题】:Can an iPhone xcode application read cookies previously stored by Safari Mobile? 【发布时间】:2009-02-10 12:29:46 【问题描述】:iPhone 应用程序能否读取 Safari Mobile 之前存储的 cookie?
【问题讨论】:
【参考方案1】:真正回答你的问题:
没有。
无法从 SDK 应用访问 Mobile Safari 的 cookie。每个 SDK 应用程序都有自己的 WebKit 缓存和 cookie 存储,因此虽然 cookie 会在同一个应用程序中持续存在,但它们不能在应用程序之间访问。
【讨论】:
嗨,马可,谢谢。即使对我来说也足够响亮和清晰:)。您说每个 SDK 应用程序都有自己的 WebKit 缓存,我假设可以使用 HSHTTPCookieStorage 类访问这些缓存。还是我还有很长的路要走?span> 我不确定——我从未尝试过。尝试一下。嵌入 UIWebView 只需几分钟的工作,让它加载一个网站的 URL,给它一个 cookie,然后尝试读取 cookie。如果仍然可以访问 webview,我可能会使用 javascript 来完成。 (stringByEvaluatingJavascriptString:)【参考方案2】:从 ios 9 开始,这是可能的!
使用sfSafariViewController。
您需要设置:
您的应用中的custom URL scheme 用于接收 cookie 数据。 您从中获取 cookie 的网站需要实施特定于您应用的自定义 URL 方案的 API,以重定向回您的应用。你可以克隆这个repo,它有一个完整的演示。
希望这会有所帮助,
利亚姆
【讨论】:
【参考方案3】:如果您可以访问服务器 url,实际上有一个有趣的方法。
-
在您的应用中启动带有移动 safari 的服务器 URL。
目标服务器 url 读取 cookie 并重定向回应用特定的 url (myapp://cookie=123)
应用程序随即切换回来,您可以从 url 处理程序中读取该值
这有点 hacky,因为应用会切换移动 safari,然后立即切换回应用。但是,这是可能的。
【讨论】:
嗨,这是对一个相当老的答案的评论。几年前,Apple 开始拒绝切换到 Safari 并重新使用该应用程序。在给出答案时,我认为这是一个相当不错的解决方案。【参考方案4】:请注意,在 iOS 8 上,您最好使用 Safari Password Sharing 来解决一些导致此问题的用例。
这不是直接可以的,但是在网站的配合下是可以的。
为了澄清,用户案例是一个 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 一起使用 - 它需要是您自己的网站。
感谢 Unique Identifier for both mobile safari and in app in iOS 提出这种方法。
【讨论】:
“Safari 密码共享”的最佳文档来源是 WWDC2014 Session 506:“Your App, Your Website, and Safari”【参考方案5】:由于 iPhone 上的沙盒功能,您无法访问 Safari 的 cookie。您只能访问在您的应用程序中创建的 cookie - 例如通过 UIWebView。
【讨论】:
嗨 mfazekas,再次感谢您的回复。 cookie 是通过我从应用程序的文档目录加载到应用程序的 UIWebView 控件中的页面的 javascript 设置的。这会确保 cookie 存储在我的应用程序沙箱中吗?谢谢你的帮助。【参考方案6】:虽然你问过同样的问题twicebefore,这里还有一种方法还没有提到......
这可能有点令人费解,但您可以使用 UIWebView 来做 Greasemonkey 式的事情。像这样的:
加载您的目标页面 制作一些 javascript 来读取 document.cookie 并返回您需要的数据 在 webViewDidFinishLoad 委托中,使用 stringByEvaluatingJavaScriptFromString 消息将此 javascript 注入 UIWebView我已经使用这种技术来增强 iPhone 应用程序中的第 3 方页面,但我不确定它是否会从与 Safari 移动设备相同的位置读取 cookie。
值得一试吗?
【讨论】:
嗨,保罗,感谢您的建议。注入 javascript 来读取 document.cookies 仍然没有什么害怕的。但值得一试。以为我有它:)【参考方案7】:这是我的 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;
【讨论】:
用这种方法保存的cookie永不过期?【参考方案8】:您可能需要检查
if ([[NSHTTPCookieStorage sharedHTTPCookieStorage] cookieAcceptPolicy] != NSHTTPCookieAcceptPolicyAlways)
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
但显然 NSHTTPCookieStorage 甚至不保存来自 iOS 上当前应用程序中最后一个请求的 cookie (rdar://8190706)
【讨论】:
以上是关于iPhone xcode 应用程序可以读取 Safari Mobile 之前存储的 cookie 吗?的主要内容,如果未能解决你的问题,请参考以下文章
这是不是可以从 xcode 将 iphone 应用程序运行到 ipad 物理设备中?