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 吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 iPhone 应用中添加和读取一个 json 文件

读取 iPhone 推送通知的设备令牌

这是不是可以从 xcode 将 iphone 应用程序运行到 ipad 物理设备中?

Xcode 5 开发代码可以在 iPhone 4s 上运行

iPhone & iPad - 可以在 Xcode 上更改产品名称吗?

iPad 模拟器上的 Xcode 5 iPhone 应用程序