美文网首页iOSiOS常用
配置隐私协议 - iOS

配置隐私协议 - iOS

作者: survivorsfyh | 来源:发表于2018-10-16 11:44 被阅读581次

    根据苹果隐私协议新规的推出,要求所有应用包含隐私保护协议,故为此在 App 中添加了如下隐私协议模块.

    首次安装 App 的情况下默认调用隐私协议模块展示相关信息一次,当用户点击同意按钮后,从此不再执行该模块方法.

    GitHub Demo Link:
    https://github.com/survivorsfyh/YHSampleCode/tree/master/YHPrivacyAgreementDemo

    具体 code 如下:

    一.声明(.h)

    /*
     隐私协议
     */
    #import <Foundation/Foundation.h>
     
    @interface PrivacyAgreement : NSObject
     
    + (instancetype)shareInstance;
     
    @end
    

    二.实现(.m)

    #import "PrivacyAgreement.h"
     
    /** 获取沙盒 Document 路径*/
    #define kDocumentPath       [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]
    #define kKeyWindow          [UIApplication sharedApplication].keyWindow
     
    #define SCREEN_WIDTH    ([UIScreen mainScreen].bounds.size.width)
    #define SCREEN_HEIGHT   ([UIScreen mainScreen].bounds.size.height)
     
    #define LocalName_ProjectConfig        @"ProjectConfigInfo.plist" // 本地存储路径设置_文件名称
    #define LocalPath_ProjectConfig        @"Project/ProjectConfigInfo/" // 本地存储路径设置_文件路径
    #define PrivacyAgreementState  @"PrivacyAgreementState"
     
    @interface PrivacyAgreement () <WKNavigationDelegate, WKUIDelegate>
     
    @property (nonatomic, strong) UIView *backgroundView;
    @property (nonatomic, strong) UIButton *btnAgree;
    @property (nonatomic, strong) WKWebView *webView;
     
    @end
     
    @implementation PrivacyAgreement
     
    + (instancetype)shareInstance {
        static PrivacyAgreement *instance = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            instance = [[PrivacyAgreement alloc] init];
        });
        
        return instance;
    }
     
    - (instancetype)init {
        self = [super init];
        if (self) {
            [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidFinishLaunchingNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
                
                NSFileManager *fileManager = [NSFileManager defaultManager];
                if ([fileManager fileExistsAtPath:[kDocumentPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@%@", LocalPath_ProjectConfig, LocalName_ProjectConfig]]]) {
                    NSMutableDictionary *configInfo = [NSMutableDictionary dictionaryWithContentsOfFile:[kDocumentPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@%@", LocalPath_ProjectConfig, LocalName_ProjectConfig]]];
                    if ([[configInfo objectForKey:@"PrivacyAgreementState"] isEqualToString:@"PrivacyAgreementState"]) {} else {
                        // Show Privacy AgreementState View
                        [self showPrivacyAgreementStateView];
                    }
                }
                else {
                    // Show Privacy AgreementState View
                    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                        [self showPrivacyAgreementStateView];
                    });
                }
            }];
        }
        
        return self;
    }
     
     
     
    /**
     渲染隐私协议视图
     */
    - (void)showPrivacyAgreementStateView {
        [kKeyWindow addSubview:self.backgroundView];
        [self webView];
        [self.backgroundView addSubview:self.btnAgree];
    }
     
     
     
    #pragma mark - ************************************************ UI
    - (UIView *)backgroundView {
        if (!_backgroundView) {
            UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];
            view.backgroundColor = [UIColor whiteColor];
            view.userInteractionEnabled = YES;
            
            _backgroundView = view;
        }
        return _backgroundView;
    }
     
    /**
     WebView 设置相关
     
     其中包含加载方式(本地文件 & 网络请求)
     @return 当前控件
     */
    - (WKWebView *)webView {
        if (!_webView) {
            NSError *error;
            // 本地 url 地址设置
            NSURL *URLBase = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];
            NSString *URLAgreement = [[NSBundle mainBundle] pathForResource:@"agreement" ofType:@"html"];
            NSString *html = [NSString stringWithContentsOfFile:URLAgreement
                                                       encoding:NSUTF8StringEncoding
                                                          error:&error];
            
            WKWebViewConfiguration *webConfig = [[WKWebViewConfiguration alloc] init];
            webConfig.preferences = [[WKPreferences alloc] init];
            webConfig.preferences.javaScriptEnabled = YES;
            webConfig.preferences.javaScriptCanOpenWindowsAutomatically = NO;
            
            WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(10, 70, SCREEN_WIDTH - 20, SCREEN_HEIGHT - 150)
                                                    configuration:webConfig];
            webView.navigationDelegate = self;
            webView.UIDelegate = self;
    #pragma mark - 本地 html 文件加载方式
            [webView loadHTMLString:html baseURL:URLBase];
    #pragma mark - 网络请求加载方式
    //        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@""]// 隐私协议的 url 地址
    //                                                 cachePolicy:NSURLRequestReloadIgnoringCacheData
    //                                             timeoutInterval:3.0];
    //        [webView loadRequest:request];
            
            [_backgroundView addSubview:webView];
            
            _webView = webView;
        }
        return _webView;
    }
     
    - (UIButton *)btnAgree {
        if (!_btnAgree) {
            UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
            btn.frame = CGRectMake(CGRectGetMidX(_webView.frame) - 50, CGRectGetMaxY(_webView.frame) + 10, 100, 44);
            btn.backgroundColor = [UIColor whiteColor];
            [btn setTitle:@"同意" forState:UIControlStateNormal];
            [btn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
            [btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
            
            _btnAgree = btn;
        }
        return _btnAgree;
    }
     
    - (void)btnClick {
        NSMutableDictionary *configInfo = [NSMutableDictionary dictionaryWithContentsOfFile:[kDocumentPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@%@", LocalPath_ProjectConfig, LocalName_ProjectConfig]]];
        [configInfo setValue:PrivacyAgreementState forKey:@"PrivacyAgreementState"];
        InsertObjectToLocalPlistFile(configInfo, LocalName_ProjectConfig, LocalPath_ProjectConfig);
        [_backgroundView removeFromSuperview];
    }
     
     
     
    @end
    

    注:如上方法中使用的本地加载的方式,若需要使用网络请求的方式,详见具体 code 中的注释部分.

    三.方法调用
    在需要的地方引用该头文件并调用接口方法即可,一般在 appdelegate 中.

    [PrivacyAgreement shareInstance];
    

    四.方法类中相关封装的方法
    4.1.点击事件中文件写入本地的方法

    /**
     插入对象至本地 plist 文件
     @param dataSource  数据源
     @param fileName    文件名称
     @param filePath    文件路径
     */
    void InsertObjectToLocalPlistFile(NSMutableDictionary *dataSource, NSString *fileName, NSString *filePath) {
        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSString *docPath = [kDocumentPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@%@", filePath, fileName]];
        if ([fileManager fileExistsAtPath:docPath]) {// 文件存在
            NSLog(@"本地 plist 文件 --- 存在");
            [dataSource writeToFile:[[kDocumentPath stringByAppendingPathComponent:filePath] stringByAppendingPathComponent:fileName] atomically:YES];
        }
        else {// 文件不存在
            NSLog(@"本地 plist 文件 --- 不存在");
            CreateLocalPlistFile(dataSource, fileName, filePath);
        }
    }
    

    以上便是此次分享的内容,还望能对大家有所帮助,谢谢!

    相关文章

      网友评论

        本文标题:配置隐私协议 - iOS

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