美文网首页iOS开发iOSiOS精品文章
【IOS】APP使用Safari做分享推广功能

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

作者: 雨声不吃鱼 | 来源:发表于2016-11-03 19:28 被阅读2719次
    • 文章已在 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

    相关文章

      网友评论

      • faee2f946885:两个问题:
        1.直接访问带参数的地址会直接存cookie?不可能吧??
        2.能否共享一下你的web代码,我想参看一下js怎么写的
      • 骑猪兜风_3355:请问一下app本身获取不到cookie,那么应该把这cookie传给服务器呢
        5dbca6037233:你这和cookie 完全没关系,scheme传参之类啊
        雨声不吃鱼:@骑猪兜风_3355 请您再看一下这篇文章我刚更新的内容,当时第一次做有点懵,写的不是很清楚,其实和服务器没太大关系,只不过是需要那边给链接就行了,按需求来做

      本文标题:【IOS】APP使用Safari做分享推广功能

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