美文网首页iOS精品文章
通过SafariServices获取 Safari 中缓存的 c

通过SafariServices获取 Safari 中缓存的 c

作者: 友友果果 | 来源:发表于2017-05-12 15:30 被阅读2589次

需求场景:

通过推广人分享获得的新用户要确认与推广人产生直接联系(即与推广人绑定),iOS 因为系统封闭无法取得其他应用的信息,iOS9后苹果推出的SafariServices可以在应用中打开一个 Safari 页面,这个页面与 safari 共享 cookie,解决了这个问题

基本流程与思路:

1、推广人A分享链接
2、新用户B打开该链接(必须用 Safari 打开,否则在 app中无法读取 cookie
3、写入信息到 cookie(这里写的是A的id,cookie 的有效时间可以自己设定)
4、B打开 app
5、 在 app中通过SafariViewController使服务器获取到 Safari 保存的 cookie 并通过 openurl 传给 app
6、B获取到 cookie

上面的流程都是隐形过程,用户感受不到。

不过 iOS10.0之后,iOS可以通过 js 读写剪切板,即新用户打开某个连接后将所需要的内容保存在剪切板中,在需要的时候再从剪切板中取出(目前Android 多是采用这种做法)。因为使用SafariServices这种获取 cookie 的方式,SafariViewController始终是隐藏的,而这是苹果命令禁止的:

SafariViewContoller must be used to visibly present information to users; the controller may not be hidden or obscured by other views or layers. Additionally, an app may not use SafariViewController to track users without their knowledge and consent.

所以如果你仅支持 iOS10的话,使用剪切板是最安全的,

iOS 部分代码
需要添加库SafariServices.framwork
并引入头文件#import <SafariServices/SafariServices.h>
遵循协议SFSafariViewControllerDelegate

- (void)getCookieFromSafari{
    //获取 safari cookie推广人 id
    SFSafariViewController *safari = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:@"your url"]];
          safari.view.frame = CGRectMake(0, 0, 1, 1);
    safari.delegate = self;
    UIViewController *C = [UIApplication sharedApplication].keyWindow.rootViewController;
//    [C presentViewController:safari animated:NO completion:nil];
        [C addChildViewController:safari];
        [self.window addSubview:safari.view];
}
#pragma mark ------SFSafariViewControllerDelegate{
- (void)safariViewController:(SFSafariViewController *)controller didCompleteInitialLoad:(BOOL)didLoadSuccessfully{
    
    if (didLoadSuccessfully) {
//        [controller dismissViewControllerAnimated:NO completion:nil];
                [controller removeFromParentViewController];
                [controller.view removeFromSuperview];
        }
}

**在 AppDelegate 中会通过方法 **

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

将你需要的信息通过 url传过来

相关文章

网友评论

  • 清辉_:不过 iOS10.0之后,iOS可以通过 js 读写剪切板,即新用户打开某个连接后将所需要的内容保存在剪切板中,在需要的时候再从剪切板中取出 这需要怎么做呢
  • 简简简简方方:技术大大,有没有可以运行的demo呀
    友友果果:不需要 demo 的, 主要代码就在文中,主要是逻辑搞清楚,大部分工作例如读取 cookie 都是在服务端完成的, 你要把服务器的部分配置好。
  • 芒果仙人球:按照这种方法试了,但是获取不到,有什么需要注意的地方吗?我测试的时候是有两个页面地址,一个地址A在Safari里写cookie,另一个地址B在自己app里读cookie,然后显示到页面上,试了下在同一个浏览器里先加载A,再加载B都没有问题,可以读出来,但是跨app就不行了
    小如99:@友友果果 您好,请问服务器怎么通过openURL打开App呢?我现在的方案是App加载safari的H5页面,然后H5页面主动触发openURL,把coockie值通过yourApp://coockie参数 这种格式传过来,调用App的回调函数,你是怎么做的呢?
    芒果仙人球:我不是自己读,我的A、B地址都是一个页面地址,A加载出来是一个空白页,作用是写cookie,加载B的作用是读cookie,如果读到了就显示在页面上,读不到就显示nil。现在是在Safari里先加载B就是显示nil,加载一次A再刷新B页面,B页面就可以把写的内容读出来然后显示出来了,然而我在自己的应用里用以上方式直接加载B就读不出来了
    友友果果:你可能搞错了流程, 读 cookie 是在服务器操作的, 自己是读不到 Safari 里面的 cookie 的, 你的地址 A 的用处是让你的服务器去读取 Safari 里的 cookie, 然后服务器通过 openURL 打开你的 app 把你的信息通过代理方法传过来,

本文标题:通过SafariServices获取 Safari 中缓存的 c

本文链接:https://www.haomeiwen.com/subject/zbgztxtx.html