23

iPhone 应用程序可以读取 Safari Mobile 之前存储的 cookie 吗?

4

8 回答 8

15

要实际回答您的问题:

不。

SDK 应用程序无法访问 Mobile Safari 的 cookie。每个 SDK 应用程序都有自己的 WebKit 缓存和 cookie 存储,因此虽然 cookie 将在同一个应用程序中持久存在,但它们无法在应用程序之间访问。

于 2009-02-10T14:27:34.293 回答
12

从 iOS 9 开始,这是可能的!

使用sfSafariViewController

您将需要设置:

  • 应用中用于接收 cookie 数据的自定义 URL 方案。
  • 您从中获取 cookie 的网站需要实现特定于您应用的自定义 URL 方案的 API,以重定向回您的应用。

你可以克隆这个repo,它有一个完整的工作演示。

希望这可以帮助,

利亚姆

于 2016-01-17T11:44:37.630 回答
10

如果您可以访问服务器 url,实际上有一种有趣的方式。

  1. 在您的应用程序中启动带有移动 safari 的服务器 url。
  2. 目标服务器 url 读取 cookie 并重定向回应用程序特定的 url (myapp://cookie=123)
  3. 然后应用程序切换回来,您可以从 url 处理程序中读取该值

这有点 hacky,因为应用程序会切换移动 safari,然后立即切换回应用程序。但是,这是可能的。

于 2011-04-21T04:10:22.223 回答
6

请注意,在 iOS 8 上,您最好使用Safari 密码共享来解决一些导致此问题的用例。

这不是直接可能的,但在网站的合作下是可能的。

澄清一下,用户案例是一个 Objective C 应用程序想要读取一个 cookie 的值,该值是由一个网站在移动 safari 中设置的。(即,特别是 UIWebView 不参与设置 cookie)

你的应用应该这样做:

  1. 使用 [[UIApplication sharedApplication] openURL:url] 启动移动 Safari;
  2. URL 应该是一个特殊的,例如。http://yourwebsite.com/give-ios-app-the-cookie
  3. 在您的网站上,当该 url 启动时,发出重定向到 your-app-url-scheme:cookievalue= (例如,angeringbirds:cookievalue=hh4523523sapdfa )
  4. 当您的应用程序委托接收 - (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 应用程序中的唯一标识符,以建议这种方法。

于 2012-07-11T11:49:48.310 回答
4

由于 iPhone 上的沙盒功能,您无法访问 Safari 的 cookie。您只能访问在您的应用程序中创建的 cookie - 例如通过 UIWebView。

于 2009-02-10T10:26:05.130 回答
3

尽管您之前曾两次 问过相同的问题,但这里有一种方法尚未提及...

这可能有点令人费解,但您可以使用UIWebView做 Greasemonkey 式的事情。像这样的东西:

我已经使用这种技术来增强 iPhone 应用程序中的第 3 方页面,但我不确定它是否会从与 Safari 移动设备相同的位置读取 cookie。

值得一试吗?

于 2009-02-10T12:44:35.603 回答
2

这是我的 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;
}
于 2010-10-13T08:12:11.370 回答
0

你可能想检查

if ([[NSHTTPCookieStorage sharedHTTPCookieStorage] cookieAcceptPolicy] != NSHTTPCookieAcceptPolicyAlways) {
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];       
}

但显然 NSHTTPCookieStorage 甚至不保存来自 iOS 上当前应用程序中最后一个请求的 cookie (rdar://8190706)

于 2010-07-14T18:16:38.157 回答