配置隐私协议 - iOS

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

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

具体 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);
    }
}

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

原文地址:https://www.cnblogs.com/survivorsfyh/p/9797034.html

时间: 2024-10-21 21:05:52

配置隐私协议 - iOS的相关文章

Mqtt协议IOS端移植1

MQTTClient.h #import <Foundation/Foundation.h> @protocol MQTTDelegate <NSObject> /** * @brief 连接服务器 * * @param [in] N/A * @param [out] N/A * @return void * @note */ - (void) didConnect: (NSUInteger)code; /** * @brief 与服务器断开连接 * * @param [in] N

配置PhoneGap 到iOS

下载 phonegap安装phonegap之前需要NodeJS环境,下载NodeJS并安装.安装环境的目的是为了使用phonegap命令行. 3. 安装phonegap使用命令    $phonegap create my-app    $cd my-app     $phonegap run iOS这样就会自动创建ios环境,可以在目录my-app/platforms/中找到ios目录.这样系统就自动为我们创建了一个ios的phonegap项目.此项目在默认目录中.4. 自定义项目创建路径命令

iOS- 如何使用Apple的零配置网络协议Bonjour?

1.前言 这段时间为了解决公司App的网络离线需求,做了个Apple推出的零配置网络协议Bonjour的Test,主要是为了解决iOS设备的IP获取,之前是可以使用socket的广播来实现,但是使用Apple推出的Bonjor相比会更加简单和稳定.希望能对大家有点帮助,如果有什么地方有error也欢迎大家指出,互相学习. 这是之前写过的一篇关于socket的blog——socket广播 iOS- 移动端Socket UDP协议广播机制的实现 2.什么是Bonjour?能做些什么? 相信没有了解过

XE6移动开发环境搭建之IOS篇(9):配置XE6的IOS SDK(有图有真相)

XE6移动开发环境搭建之IOS篇(9):配置XE6的IOS SDK(有图有真相) 2014-08-23 21:36 网上能找到的关于Delphi XE系列的移动开发环境的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 1.开启PAServer.XE6要连接MAC,必须先将MAC的PAServer运行起来.--------------------------------------------------------------- 1.在虚拟机下,点一下桌面(星空图随便某

单点登录CAS使用记(一):前期准备以及为CAS-Server配置SSL协议

知识点: SSO:单点登录(Single Sign On),是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. CAS:耶鲁大学开发的单点登录(Single Sign On)系统称为CAS(Central Authentication Server),他是一个开源的.相对比较简单易用的SSO解决方案. SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer

三次交换机如何配置生成树协议----STP

实验 STP 实验目标在两台三次交换机上配置STP,设置switch1为vlan1的根网桥,switch2为vlan1的次根网桥,switch1为vlan2的次根网桥,switch2为vlan2的根网桥 实验环境 实验步骤: 一.将vlan1设置为根网桥 二.将switch2中的vlan1设置为次根 三.在switch1中创建vlan2,封装f0/5-7 四.在switch1上将vlan2设置为次根网桥 五.在switch2中创建vlan2,封装f0/5-7 六.在switch2中将vlan2设

配置Tomcat使用https协议(配置SSL协议)

内容概览: 如果希望 Tomcat 支持 Https,主要的工作是配置 SSL 协议 1.生成安全证书 2.配置tomcat --------------------------------------------------------------------------------------------------------------------------- 预备知识: sso cas ssl https ca ------------------------------------

判断是否同意个人隐私协议

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style type="text/css"> *{margin:0; padding:0;} .box_agreement{ text-align: center; } </style

6.4 配置网络协议

6.4  配置网络协议 在客户端连接到数据库引擎之前,数据库引擎必须启用网络协议.SQL Server 数据库引擎可同时启用多种网络协议为请求服务,客户端则使用单个协议连接到数据库引擎. 可以直接在右键菜单中启用或禁用某个网络协议.还可以在"属性"窗口进行详细配置,修改过的属性在重新启动该实例后生效. 6.4.1  配置Shared Memory协议 Shared Memory 协议的配置只有一个"已启用"选项. 6.4.2  配置 Named Pipes 协议 如