Commit 417b99b1 by pierce

fixed bugs

parent ecbfc465
Showing with 680 additions and 49 deletions
......@@ -13,10 +13,10 @@ import GDToolBox
public struct GDLoginWebPublicUrl {
/// 隐私政策
public static let userPrivacyAggrement = "https://xiuse.ishuaji.cn/other/text/xsTips.html"
public static let userPrivacyAggrement = "https://xiuse.cxylive.top/other/text/xsTips.html"
// 用户使用协议
public static let userAgreement = "https://xiuse.ishuaji.cn/other/text/comm.html"
public static let userAgreement = "https://xiuse.cxylive.top/other/text/comm.html"
}
public struct GDLoginAndRegistPublicUDKey {
......
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1530"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "BED055992B4FD18400BCACD8"
BuildableName = "GDBaseBussiness.framework"
BlueprintName = "GDBaseBussiness"
ReferencedContainer = "container:GDBaseBussiness.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Release"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "BED055992B4FD18400BCACD8"
BuildableName = "GDBaseBussiness.framework"
BlueprintName = "GDBaseBussiness"
ReferencedContainer = "container:GDBaseBussiness.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
......@@ -223,7 +223,7 @@ class GDFriendsCenter: BaseViewModel {
FTIndicator.showProgress(withMessage: nil)
GDFriendHttpHelper.shared.checkFriendApply(for: fid).subscribe { model in
FTIndicator.dismissProgress()
if model.isreachbonds || GDRouter.BaseBusinessRouter?.isCurrentVersionVerified.value == false {
if model.isreachbonds || GDRouter.BaseBusinessRouter?.isCurrentVersionVerified.value == true {
// 达到要求,不需要送礼
let applyVC = GDFriendApplyViewController(with: fid, gid: nil)
vc.navigationController?.pushViewController(applyVC, animated: true)
......
......@@ -28,9 +28,6 @@ class GDLoginFirstOpenView: BaseView {
bgImageView.contentMode = .scaleAspectFill
self.addSubview(bgImageView)
wordsImageView.contentMode = .scaleAspectFit
self.addSubview(wordsImageView)
iconImageView.contentMode = .scaleAspectFit
iconImageView.animationImages = UIImage.getAnimateImageArray(for: "user_login_AppIcon_")
iconImageView.animationRepeatCount = 1
......@@ -41,13 +38,6 @@ class GDLoginFirstOpenView: BaseView {
make.edges.equalToSuperview()
}
wordsImageView.snp.makeConstraints { make in
make.width.equalTo(300)
make.height.equalTo(145)
make.centerX.equalToSuperview()
make.centerY.equalToSuperview().offset(-140)
}
iconImageView.snp.makeConstraints { make in
make.width.height.equalTo(143)
make.centerX.equalToSuperview()
......@@ -57,7 +47,6 @@ class GDLoginFirstOpenView: BaseView {
}
let bgImageView = UIImageView(image: GDLoginBundle.imageNamed("user_login_bg1"))
let wordsImageView = UIImageView(image: GDLoginBundle.imageNamed("user_logoin_words"))
let iconImageView = UIImageView(image: GDLoginBundle.imageNamed("user_login_AppIcon_6"))
// MARK: Data
......@@ -66,11 +55,6 @@ class GDLoginFirstOpenView: BaseView {
}
func startAnimation(with completion: EmptyClosure?) {
UIView.animate(withDuration: 0.5) {
self.wordsImageView.alpha = 0
} completion: { _ in
}
self.iconImageView.startAnimating()
......
{
"images": [
{
"idiom": "universal",
"scale": "1x"
},
{
"filename": "user_logoin_words.png",
"idiom": "universal",
"scale": "2x"
},
{
"idiom": "universal",
"scale": "3x"
}
],
"info": {
"author": "xcode",
"version": 1
}
}
\ No newline at end of file
//
// GDPostMomentModel.swift
// TealiveSwift
//
// Created by Jim Chan on 2021/5/28.
// Copyright © 2021 YAZHAI Inc. All rights reserved.
//
import UIKit
import GDToolBox
class GDPostMomentModel: BaseModel {
}
//
// GDPostMomentAssetCell.swift
// TealiveSwift
//
// Created by Jim Chan on 2021/5/28.
// Copyright © 2021 YAZHAI Inc. All rights reserved.
//
import UIKit
import GDToolBox
class GDPostMomentAssetCell: BaseCollectionViewCell {
var addHandler: EmptyClosure?
var clickHandler: EmptyClosure?
var longPressHandler: EmptyClosure?
var isAdd: Bool = false {
didSet {
if isAdd {
playBtn.isHidden = true
assetImageView.isHidden = true
addBtn.isHidden = false
} else {
assetImageView.isHidden = false
addBtn.isHidden = true
}
}
}
// MARK: UI
override func makeUI() {
super.makeUI()
makeAssetImageView()
makeAddButton()
let tap = UITapGestureRecognizer()
tap.rx.event.subscribe(onNext: {[weak self] (tap) in
if tap.state == .recognized {
self?.clickHandler?()
}
}).disposed(by: disposeBag)
self.addGestureRecognizer(tap)
// 长按
let longpress = UILongPressGestureRecognizer()
longpress.minimumPressDuration = 0.5
longpress.rx.event.subscribe(onNext: {[weak self] longpress in
if longpress.state == .began {
self?.longPressHandler?()
}
}).disposed(by: disposeBag)
self.addGestureRecognizer(longpress)
}
private let assetImageView = UIImageView(image: nil)
private let playBtn = UIButton(type: .custom)
let addBtn = UIButton(type: .custom)
private func makeAssetImageView() {
assetImageView.contentMode = .scaleAspectFill
assetImageView.layer.masksToBounds = true
assetImageView.layer.cornerRadius = 10
self.contentView.addSubview(assetImageView)
assetImageView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
playBtn.setImage(GDMomentBundle.imageNamed("moment_create_video_play_icon"), for: .normal)
playBtn.isUserInteractionEnabled = false
self.contentView.addSubview(playBtn)
playBtn.snp.makeConstraints { make in
make.center.equalToSuperview()
make.width.height.equalTo(40)
}
}
private func makeAddButton() {
addBtn.isHidden = true
addBtn.imageView?.contentMode = .scaleAspectFit
addBtn.setImage(GDMomentBundle.imageNamed("moment_create_image_add_icon"), for: .normal)
self.contentView.addSubview(addBtn)
addBtn.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
}
// MARK: Data
override func bindViewModel() {
super.bindViewModel()
addBtn.rx.tap.subscribe(onNext: {[weak self] _ in
self?.addHandler?()
}).disposed(by: disposeBag)
}
// MARK: Method
func setup(with videoAsset: GDImagePickerAsset) {
reuseDisposeBag = DisposeBag()
isAdd = false
playBtn.isHidden = false
self.assetImageView.image = videoAsset.normalImage
videoAsset.requestNormalImage { image in
self.assetImageView.image = image
}
}
func setup(with image: UIImage) {
reuseDisposeBag = DisposeBag()
isAdd = false
playBtn.isHidden = true
self.assetImageView.image = image
}
}
//
// GDPostMomentTextView.swift
// TealiveSwift
//
// Created by Jim Chan on 2021/8/28.
// Copyright © 2021 YAZHAI Inc. All rights reserved.
//
import UIKit
import YYKit
import GDToolBox
class GDPostMomentTextView: YYTextView {
override func unmarkText() {
super.unmarkText()
self.delegate?.textViewDidChange?(self)
}
override func copy(_ sender: Any?) {
super.copy(sender)
guard let attr = self.attributedText?.attributedSubstring(from: self.selectedRange) else { return }
let targetAttr = NSMutableAttributedString(attributedString: attr)
attr.enumerateAttributes(in: attr.rangeOfAll(), options: .reverse) { attrDict, range, _ in
if let attachment = attrDict[NSAttributedString.Key(rawValue: "YYTextAttachment")] as? YYTextAttachment {
if attachment.userInfo?["type"] != nil {
var infoDict = attachment.userInfo ?? [:]
infoDict["start"] = range.location
let btn = (attachment.content as? UIButton) ?? UIButton(type: .custom)
targetAttr.insertString(btn.titleLabel?.text ?? "", at: UInt(range.location + 1))
}
}
}
targetAttr.removeAttribute(NSAttributedString.Key(rawValue: "YYTextAttachment"), range: targetAttr.rangeOfAll())
let copyStr = targetAttr.string
UIPasteboard.general.string = copyStr
}
}
//
// GDLocationInfoModel.swift
// TealiveSwift
//
// Created by Jim Chan on 2021/7/7.
// Copyright © 2021 YAZHAI Inc. All rights reserved.
//
import UIKit
import GDToolBox
class GDLocationInfoModel: BaseModel {
var cityName: String?
var address: String?
var detailAddress: String?
var coordinate: CLLocationCoordinate2D?
}
//
// GDMomentTopicSearchModel.swift
// TealiveSwift
//
// Created by Jim Chan on 2021/10/25.
// Copyright © 2021 YAZHAI Inc. All rights reserved.
//
import UIKit
import GDToolBox
class GDMomentTopicSearchRequestModel: BaseModel, NetworkModelType {
var pages : Int = 0
var result : [GDPostMomentTopicModel] = []
static func createFrom(_ json: JSON) -> Self {
let model = GDMomentTopicSearchRequestModel()
model.pages = json["pages"].intValue
model.result = json["result"].arrayValue.map { GDPostMomentTopicModel.createFrom($0) }
return model as! Self
}
}
//final class GDMomentTopicSearchModel: BaseModel, NetworkArrType {
// var content : String?
// var desc : String?
// var tid : String?
//
// static func createFrom(_ json: JSON) -> GDMomentTopicSearchModel {
// let model = GDMomentTopicSearchModel()
// model.content = json["content"].stringValue
// model.desc = json["desc"].stringValue
// model.tid = json["tid"].stringValue
// return model
// }
//
// static func createArrFrom(_ json: JSON) -> [GDMomentTopicSearchModel] {
// json.arrayValue.map { GDMomentTopicSearchModel.createFrom($0) }
// }
//
//}
//
// GDPostMomentTopicModel.swift
// TealiveSwift
//
// Created by Jim Chan on 2021/5/31.
// Copyright © 2021 YAZHAI Inc. All rights reserved.
//
import UIKit
import GDToolBox
final class GDPostMomentTopicModel: BaseModel, NetworkArrType {
var content : String?
var cover : String?
var desc : String?
var hotlevel : String?
var ishot : Bool = false
var istoday : Bool = false
var state : Int = 0
var tid : String?
var todaylevel : String?
static func createFrom(_ json: JSON) -> GDPostMomentTopicModel {
let model = GDPostMomentTopicModel()
model.content = json["content"].stringValue
model.cover = json["cover"].stringValue
model.desc = json["desc"].stringValue
model.hotlevel = json["hotlevel"].stringValue
model.ishot = json["ishot"].boolValue
model.istoday = json["istoday"].boolValue
model.state = json["state"].intValue
model.tid = json["tid"].stringValue
model.todaylevel = json["todaylevel"].stringValue
return model
}
static func createArrFrom(_ json: JSON) -> [GDPostMomentTopicModel] {
json["data"].arrayValue.map { dataJson in
return GDPostMomentTopicModel.createFrom(dataJson)
}
}
}
//
// GDMomentTopicSearchCell.swift
// TealiveSwift
//
// Created by Jim Chan on 2021/10/25.
// Copyright © 2021 YAZHAI Inc. All rights reserved.
//
import UIKit
import GDToolBox
class GDMomentTopicSearchCell: BaseTableViewCell {
var currentModel: GDPostMomentTopicModel?
// MARK: UI
override func makeUI() {
super.makeUI()
topicNameLabel.font = .gd_pingfang(14)
self.contentView.addSubview(topicNameLabel)
let lineView = UIView(frame: .zero)
lineView.backgroundColor = .init(white: 0.7, alpha: 0.5)
self.contentView.addSubview(lineView)
topicNameLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(16)
make.centerY.equalToSuperview()
}
lineView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(32)
make.right.equalToSuperview().offset(-32)
make.height.equalTo(0.5)
make.bottom.equalToSuperview()
}
}
private let topicNameLabel = UILabel(frame: .zero)
// MARK: Method
func setup(with model: GDPostMomentTopicModel) {
currentModel = model
reuseDisposeBag = DisposeBag()
topicNameLabel.text = "#\(model.content ?? "")#"
}
}
//
// GDPostMomentTopicSelectCell.swift
// TealiveSwift
//
// Created by Jim Chan on 2021/5/31.
// Copyright © 2021 YAZHAI Inc. All rights reserved.
//
import UIKit
import GDToolBox
class GDPostMomentTopicSelectCell: BaseTableViewCell {
var currentModel: GDPostMomentTopicModel?
// MARK: UI
override func makeUI() {
super.makeUI()
makeCoverImageView()
makeTitleLabel()
makeDescLabel()
let lineView = UIView(frame: .zero)
lineView.backgroundColor = .init(white: 0, alpha: 0.1)
self.contentView.addSubview(lineView)
lineView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(16)
make.right.equalToSuperview()
make.bottom.equalToSuperview()
make.height.equalTo(0.5)
}
}
private let coverImageView = UIImageView(frame: .zero)
private let titleLabel = UILabel(frame: .zero)
private let descLabel = UILabel(frame: .zero)
private func makeCoverImageView() {
coverImageView.contentMode = .scaleAspectFill
coverImageView.layer.cornerRadius = 5
coverImageView.layer.masksToBounds = true
self.contentView.addSubview(coverImageView)
coverImageView.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.left.equalToSuperview().offset(16)
make.width.height.equalTo(60)
}
}
private func makeTitleLabel() {
titleLabel.font = .gd_pingfangBold(17)
titleLabel.textColor = .black
self.contentView.addSubview(titleLabel)
titleLabel.snp.makeConstraints { make in
make.left.equalTo(coverImageView.snp.right).offset(8)
make.centerY.equalToSuperview().offset(-12)
make.right.equalToSuperview().offset(-8)
}
}
private func makeDescLabel() {
descLabel.font = .gd_pingfang(13)
descLabel.textColor = .init(white: 0.7, alpha: 1)
self.contentView.addSubview(descLabel)
descLabel.snp.makeConstraints { make in
make.left.equalTo(coverImageView.snp.right).offset(8)
make.centerY.equalToSuperview().offset(12)
make.right.equalToSuperview().offset(-8)
}
}
// MARK: Method
func setup(with model: GDPostMomentTopicModel) {
currentModel = model
reuseDisposeBag = DisposeBag()
coverImageView.cancelDownload()
coverImageView.setWebImage("\(model.cover ?? "")?x-oss-process=image/resize,m_fill,h_200,w_200", placeholderImage: .facePlaceholder)
titleLabel.text = "#\(model.content ?? "")#"
descLabel.text = model.desc
}
}
//
// GDPostMomentTopicSelectViewModel.swift
// TealiveSwift
//
// Created by Jim Chan on 2021/5/31.
// Copyright © 2021 YAZHAI Inc. All rights reserved.
//
import UIKit
import MJRefresh
import GDToolBox
class GDPostMomentTopicSelectViewModel: BaseViewModel {
var currentPage: Int = 1
var searchPage: Int = 1
let topics = BehaviorRelay<[GDPostMomentTopicModel]>(value: [])
let refreshState = BehaviorRelay<MJRefreshState>(value: .idle)
let searchRefreshState = BehaviorRelay<MJRefreshState>(value: .idle)
let searchKeyword = BehaviorRelay<String?>(value: nil)
let searchResult = BehaviorRelay<[GDPostMomentTopicModel]>(value: [])
override func setupViewModel() {
super.setupViewModel()
refreshTopicList(with: 1)
searchKeyword.distinctUntilChanged().subscribe(onNext: {[weak self] keyword in
guard let keyword = keyword else { return }
self?.searchPage = 1
if keyword.count > 0 {
self?.search(for: keyword, page: 1)
} else {
self?.searchResult.accept([])
}
}).disposed(by: disposeBag)
}
// MARK: Method
func refreshTopicList(with page: Int) {
currentPage = page
GDMomentHttpHelper.shared.getMomentTopicList(with: .all, size: 20, page: page).subscribe {[weak self] topics in
if topics.count == 0 {
self?.refreshState.accept(.noMoreData)
} else {
self?.refreshState.accept(.idle)
}
guard let self = self else { return }
if page == 1 {
self.topics.accept(topics)
} else {
var oldData = self.topics.value
oldData.append(contentsOf: topics)
self.topics.accept(oldData)
}
} onFailure: {[weak self] error in
self?.refreshState.accept(.idle)
guard let error = error as? GDMoyaError else {
FTIndicator.showToastMessage(GDMoyaError.networkError().msg)
return
}
FTIndicator.showToastMessage(error.msg)
}.disposed(by: disposeBag)
}
func search(for keyword: String, page: Int) {
searchPage = page
GDMomentHttpHelper.shared.searchMomentTopic(with: keyword, page: page).subscribe {[weak self] model in
guard let self = self else { return }
if page == 1 {
self.searchResult.accept(model.result)
} else {
let arr = self.searchResult.value
self.searchResult.accept(arr + model.result)
}
if page >= model.pages {
self.searchRefreshState.accept(.noMoreData)
} else {
self.searchRefreshState.accept(.idle)
}
} onFailure: {[weak self] error in
self?.searchRefreshState.accept(.idle)
guard let error = error as? GDMoyaError else {
FTIndicator.showToastMessage(GDMoyaError.networkError().msg)
return
}
FTIndicator.showToastMessage(error.msg)
}.disposed(by: disposeBag)
}
func createTopic(with topicName: String, success: ((GDPostMomentTopicModel) -> Void)?, failure: EmptyClosure?) {
FTIndicator.showProgress(withMessage: nil, userInteractionEnable: false)
GDMomentHttpHelper.shared.createNewTopic(with: topicName).subscribe { json in
FTIndicator.dismissProgress()
let model = GDPostMomentTopicModel()
model.content = topicName
model.tid = json["tid"].stringValue
success?(model)
} onFailure: { error in
FTIndicator.dismissProgress()
guard let error = error as? GDMoyaError else {
FTIndicator.showToastMessage(GDMoyaError.networkError().msg)
return
}
FTIndicator.showToastMessage(error.msg)
failure?()
}.disposed(by: disposeBag)
}
}
......@@ -153,14 +153,14 @@ class GDZoneContentMomentView: GDZoneContentPublicMomentView {
}
}).disposed(by: disposeBag)
// tableView.rx.observe(CGSize.self, "contentSize").subscribe(onNext: {[weak self] (size) in
// if self?.viewModel.fid == GDRouter.UserRouter?.uid {
// self?.viewHeight.accept(size?.height ?? 0.0 + GDScreen.SafeArea.bottom + 80)
// } else {
// self?.viewHeight.accept(size?.height ?? 0.0)
// }
//
// }).disposed(by: disposeBag)
tableView.rx.observe(CGSize.self, "contentSize").subscribe(onNext: {[weak self] (size) in
if self?.viewModel.fid == GDRouter.UserRouter?.uid {
self?.viewHeight.accept(size?.height ?? 0.0 + GDScreen.SafeArea.bottom + 80)
} else {
self?.viewHeight.accept(size?.height ?? 0.0)
}
}).disposed(by: disposeBag)
}
private func showMoreAction(model: GDZoneContentMomentModel) {
......
......@@ -80,6 +80,8 @@ class GDHostPlugin: GDToolBoxAPIPlugin {
override var baseApiUrl: String { GDHostManager.apiAddress }
override var imageDownUrl: String { GDHostManager.imageDownUrl }
override var payUrl: String { GDHostManager.payUrl }
/// 简易拼接CDN域名
/// - Parameter urlstr: 地址
/// - Returns: 完整资源地址
......
......@@ -77,6 +77,7 @@
38E95B622948B09500DE03BC /* GDToolBox.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = GDToolBox.framework; sourceTree = BUILT_PRODUCTS_DIR; };
38E95B632948B09500DE03BC /* HostManager.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = HostManager.framework; sourceTree = BUILT_PRODUCTS_DIR; };
B2F46393D7C21DA532456665 /* Pods-TealiveModule.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TealiveModule.debug.xcconfig"; path = "Target Support Files/Pods-TealiveModule/Pods-TealiveModule.debug.xcconfig"; sourceTree = "<group>"; };
BE025E132BB2B49500FF27CD /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
BE352CE8299CD00900FE07AB /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
BE352CEA299CD01C00FE07AB /* MetalPerformanceShaders.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalPerformanceShaders.framework; path = System/Library/Frameworks/MetalPerformanceShaders.framework; sourceTree = SDKROOT; };
BE352CEC299CD69700FE07AB /* TTSDKFramework.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = TTSDKFramework.framework; path = ../Module/GDToolBox/GDToolBox/ThirdParty/TTSDKFramework.framework; sourceTree = "<group>"; };
......@@ -179,6 +180,7 @@
3888D62F29407F5F00807031 /* Assets.xcassets */,
3888D63129407F5F00807031 /* LaunchScreen.storyboard */,
3888D63429407F5F00807031 /* Info.plist */,
BE025E132BB2B49500FF27CD /* PrivacyInfo.xcprivacy */,
);
path = TealiveModule;
sourceTree = "<group>";
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>35F9.1</string>
</array>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategorySystemBootTime</string>
</dict>
<dict>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>DDA9.1</string>
</array>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
</dict>
<dict>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>E174.1</string>
</array>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryDiskSpace</string>
</dict>
<dict>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
</dict>
</array>
</dict>
</plist>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment