狸叔资产隐私策略
狸叔资产隐私策略数据的收集
数据类型
狸叔资产收集情况
备注
位置 Location精确位置 Precise Location粗略位置 Coarse Location
收集
狸叔资产会获取地理位置信息用于广告投放与反作弊。应用被用户授予地理位置权限时,狸叔资产会获取地理位置信息,用于广告定向与反作弊;当应用不获取地理位置权限时,狸叔资产不会主动获取地理位置权限及地理位置信息。
标识符 Identifiers用户ID User ID设备ID Device ID
收集
用户ID仅用于功能-奖励视频服务器端验证回调。开发者在广告请求期间向狸叔资产发送他们的用户名(基本上是一系列数字,狸叔资产不知道它与该应用内的内部用户id或内部用户名的关系。狸叔资产只接收这些数据,不检查、不验证、不存储、不使用)。当用户完全观看奖励视频时,狸叔资产将把这个用户id发送回开发者的服务器。如果开发者不使用此功能,则开发者不需要传递此类数据。设备ID当应用被用户授予广告追踪权限时,狸叔资产将获取idfa用于广告归因与追踪。
其他数据 Other Data其他数据类型 Other Data Typ ...
Git clone报The remote end hung up unexpectedly错误
Git clone报The remote end hung up unexpectedly错误错误提示
解决办法
尝试设置缓冲区上限
git config http.postBuffer 524288000
网络原因,设置一下最低速度时间
git config --global http.lowSpeedLimit 0git config --global http.lowSpeedTime 999999
第三方库推荐
第三方库推荐
通知,吐司等提醒。
NotificationBanner,好看的通知控件,可以代替HUD。
PKHUD
UI库 JXSegmentedView
本地数据库
WCDB, 腾讯开源本地加密数据库
RxSwift-调度者
RxSwift-调度者Schedulers(调度者)**是Rx**实现多线程的核心模块,它主要用于控制任务在哪个线程或队列运行。
MainScheduler: 代表主线程。
SerialDispatchQueueScheduler: 抽象了串行DispatchQueue,执行串行任务使用此scheduler。
ConcurrentDispatchQueueScheduler:**抽象了并行**DispatchQueue,执行并行任务可以使用此scheduler。
**OperationQueueScheduler:**抽象了NSOperationQueue。
常见用法Observable.of(1,2,3,4) .subscribe(on: ConcurrentDispatchQueueScheduler(qos: .userInitiated)) .observe(on: MainScheduler.instance) .subscribe(onNext: { data in print(data) }) .dispo ...
RxSwift-高阶函数
RxSwift-高阶函数RxSwift操作符操作符可以帮助大家创建新的序列,或者变化组合原有的序列,从而生成一个新的序列。比如filter过滤,map转换等,具体可参考文档Operator - 操作符。
filter,map等操作符都是高阶函数,高阶函数接受一个或多个函数作为输入,最后输出一个函数。下面我们就以map为例进行分析。
map原理分析先来一段最简单的map使用代码
let ob = Observable.of(1,2,3,4)ob.map { (number) -> Int in return number+2 } .subscribe{ print("\($0)") } .disposed(by: disposeBag)
查看map函数,在注释部分,可以看到,具体实现在map文件中
// Map.swiftextension ObservableType { public func map<Result>(_ transform ...
RxSwift-核心逻辑分析
RxSwift-核心逻辑分析基本名词解析
Observable:可监听序列,他是事件的生产者。举个例子,你可以将温度看作是一个序列,然后监测这个温度值,最后对这个值做出响应。例如:当室温高于 33 度时,打开空调降温。
Observer:观察者,是用来监听事件,然后它需要这个事件做出响应。比如监听当前室温,室温高于 33 度时,打开空调降温。打开空调降温就是观察者。
RxSwift核心逻辑分析RxSwift中,对事件的处理遵循以下三个步骤:
创建可监听序列Observable。
订阅序列,创建观察者Observer对此序列进行观察。
序列中产生事件,观察者对序列中的事件进行响应。
创建序列流程分析下面这段代码,是RxSwift的最基本使用,我们就此开始进行分析
let ob = Observable<Int>.create { (observer) -> Disposable in observer.onNext(1) return Disposables.create()} ob.subscribe { (v ...
框架分析目录汇总
框架分析目录汇总RxSwift框架分析
RxSwift-如何用协议实现一个命名空间
RxSwift-核心逻辑分析
RxSwift-高阶函数
RxSwift-调度者
RxSwift-如何用协议实现一个命名空间
RxSwift-如何用协议实现一个命名空间RxSwift简介RxSwift是一个函数响应式框架,使用到的是FRP(函数响应式编程)编程思想。它是通过构建函数操作数据序列,然后对这些序列做出响应的编程方式。基本的使用可以参考官方的RxSwift中文文档。
rx是什么?在RxSwift的使用过程中我们经常可以看到以下代码:
cameraButton.rx.tap .bind(to: imageView.rx.image) .disposed(by: disposeBag)
其中rx具体是什么呢?我们点击进去,找到以下源码
/// A type that has reactive extensions.public protocol ReactiveCompatible: AnyObject { /// associatedtype,用来实现protocol的泛型功能 associatedtype ReactiveBase: AnyObject /// Reactive的类变量 static var rx: Reactive<Reacti ...
[iOS底层]-KVC底层原理
[iOS底层]-KVC底层原理KVC概述KVC提供了一种可以间接访问对象属性的方式,即可以通过字符串key来访问某个属性。主要是通过NSKeyValueCoding协议实现。
KVC API介绍KVC的主要API有4个,两个设置,两个取值。
// 通过key设置值- (void)setValue:(nullable id)value forKey:(NSString *)key;- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;- // 通过key取值- (nullable id)valueForKey:(NSString *)key;- (nullable id)valueForKeyPath:(NSString *)keyPath;
forKey和forKeyPath的区别是什么呢?我们通过例子感受一下
// Car 类@interface Car : NSObject@property (nonatomic, strong) NSSt ...
[iOS底层]-autoreleasepool底层原理
[iOS底层]-autoreleasepool底层原理autoreleasepool的基本原理下载Demo,通过使用Clang编译器把OC文件编译成C++文件的学习,我们已经知道如何把OC编译成C++。接下来就把main.m编译成main.cpp,得到@autoreleasepool的C++的底层源码:
int main(int argc, char * argv[]) { NSString * appDelegateClassName; /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool; appDelegateClassName = NSStringFromClass(((Class (*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("AppDelegate"), sel_registerName("class"))); } return UI ...