【IOS】APP使用Safari做分享推广功能

  • 文章已在 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,打开的页面像下面这样

SFView

三、系统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浏览器数据

胡东东的博客 - IOS的软件之间的调用


欢迎关注我的微信公共号:iapp666666

推荐阅读更多精彩内容