通过SafariServices获取 Safari 中缓存的 cookie

需求场景:

通过推广人分享获得的新用户要确认与推广人产生直接联系(即与推广人绑定),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传过来

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容