- 文章已在 2017年04月26日14:00 更新
例如:
分享一个页面,然后用户通过这个页面去下载app,完成安装后,打开这个app,就可以获取分享的一些数据,比如:扫码注册、分享、推广邀请... 当通过appstore下载完app之后,打开该app,可以完成自动注册,自动登录,自动绑定等等操作
一、获取Cookies思路
iOS9之前是不可以的,因为iOS应用是在沙盒运行,app中创建的webView的cookies都是存储在单独的沙盒中的,但是iOS9之后,增加了一个全新的类SFSafariViewController
,这个相当于在app内部创建了一个浏览器,用的和safari浏览器共同的cookies,所以可以用SFSafariViewController
来获取cookies
二、使用SFSafariViewController
//首先需要导入头文件
#import <SafariServices/SafariServices.h>
self.safariView = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:@"三步骤中所说的web页地址"]];
self.safariView.delegate = self;
[self presentViewController:self.safariView animated:false completion:nil]
一般使用这两个代理函数
//点击Done按钮
- (void)safariViewControllerDidFinish:(SFSafariViewController *)controller{}
//加载完成
- (void)safariViewController:(SFSafariViewController *)controller didCompleteInitialLoad:(BOOL)didLoadSuccessfully{}
之后就可以打开指定的URL,并且使用的是系统safari的cookies,打开的页面像下面这样
三、系统Safari和App共用cookies
首先,必须让用户在safari中打开指定的链接(可以带有cookie),比如:http://www.jdxyz.com:10000/common/share?uid=12386&shareid=588
然后这样cookie就存在safari浏览器中了
然后,我们再打开我们的app,如果我们代码设置为打开就调用SFSafariViewController,那么SFSafariViewController就会访问一个web页面,这个web页面是前端写给我的,可以获取到safari的cookies,然后这个页面中通过js(调用的代码为:location.href = "myscheme://?uid=12386&shareid=588")这样就可以在app的openurl代理方法中获取传过来的值
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options NS_AVAILABLE_IOS(9_0)
{
[self getUrlDataAPI:url];
return true;
}
// 获取参数
-(void)getUrlDataAPI:(NSURL *)url
{
NSLog(@"获取到url:%@",[url relativeString]);
if ([[url scheme] isEqualToString:@"myscheme"] && [url query])
{
//例子: myscheme://?uid=12386&shareid=588
NSString * uidString = [self getParamsWithScheme:@"uid" webaddress:[url relativeString]];
NSString * shareidString = [self getParamsWithScheme:@"shareid" webaddress:[url relativeString]];
}
}
//根据正则表达式获取 url scheme 的参数
-(NSString *)getParamsWithScheme:(NSString *)param webaddress:(NSString *)webAddress
{
NSError *error;
NSString *regTags=[[NSString alloc] initWithFormat:@"(^|&|\\?)+%@=+([^&]*)(&|$)",param];
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regTags options:NSRegularExpressionCaseInsensitive error:&error];
NSArray *matches = [regex matchesInString:webAddress
options:0
range:NSMakeRange(0, [webAddress length])];
for (NSTextCheckingResult *match in matches) {
NSString *tagValue = [webAddress substringWithRange:[match rangeAtIndex:2]];
return tagValue;
}
return @"";
}
四、使用SFSafariViewController时的体验优化
下面这个方法是目前比较不错的,目的就是不让SFSafariViewController在app运行期间展示出来,这样就“仿佛”在后台自己获取
self.safariView.modalPresentationStyle = UIModalPresentationOverCurrentContext;
self.safariView.view.alpha = 0.05f;(不能设置为0)
self.safariView.view.backgroundColor = [UIColor clearColor];
self.safariView.view.userInteractionEnabled = NO;
[self presentViewController:self.safariView animated:false completion:nil];
//初始化完成时隐藏
-(void)safariViewController:(SFSafariViewController *)controller didCompleteInitialLoad:(BOOL)didLoadSuccessfully{
if (didLoadSuccessfully){
[controller dismissViewControllerAnimated:true completion:nil]; //隐藏
}
}
五、使用webView获取cookies
这个cookies是沙盒中的cookies,就是App自己的cookies,不是safari的cookies,所以无法共用
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
NSHTTPCookieStorage * sharedHTTPCookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray * cookies = [sharedHTTPCookieStorage cookiesForURL:[NSURL URLWithString:@"http://adapp.jidonggame.com/"]];
NSEnumerator * enumerator = [cookies objectEnumerator];
NSHTTPCookie * cookie;
while (cookie = [enumerator nextObject])
{
NSLog(@"COOKIE{name: %@, value: %@}", [cookie name], [cookie value]);
[sharedHTTPCookieStorage deleteCookie:cookie];
}
}
六、URL的说明
NSString * linkStr = @"damon://sdf?mmmm?ss";
NSURL * s = [NSURL URLWithString:linkStr];
NSLog(@"uu:%@\n",s);
NSLog(@"scheme:%@\n",[s scheme]);
NSLog(@"host:%@\n",[s host]);
NSLog(@"query:%@\n",[s query]);
NSLog(@"%@\n",[s relativeString]);
这是输出的内容:
七、参考文章
胡东东的博客 - IOS未安装APP获取Safari浏览器数据
欢迎关注我的微信公共号:iapp666666