|
|
@ -88,6 +88,15 @@ enum AppRestrictTokenCodec {
|
|||
try? PropertyListDecoder().decode(ApplicationToken.self, from: data)
|
||||
}
|
||||
|
||||
static func decodeBase64(_ value: String) -> ApplicationToken? {
|
||||
let text = value.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||
guard !text.isEmpty,
|
||||
let data = Data(base64Encoded: text, options: .ignoreUnknownCharacters) else {
|
||||
return nil
|
||||
}
|
||||
return decode(data)
|
||||
}
|
||||
|
||||
static func encodeSelection(_ selection: FamilyActivitySelection) -> Data? {
|
||||
try? PropertyListEncoder().encode(selection)
|
||||
}
|
||||
|
|
@ -202,6 +211,22 @@ enum AppRestrictSharedStore {
|
|||
links = links.filter { $0.tokenData != data }
|
||||
}
|
||||
|
||||
static var hasPairingData: Bool {
|
||||
let storedSelection = selection
|
||||
return !storedSelection.applicationTokens.isEmpty
|
||||
|| !storedSelection.categoryTokens.isEmpty
|
||||
|| !storedSelection.webDomainTokens.isEmpty
|
||||
|| !enabledTokens.isEmpty
|
||||
|| !links.isEmpty
|
||||
}
|
||||
|
||||
static func clearPairingData() {
|
||||
selection = FamilyActivitySelection()
|
||||
enabledTokens = []
|
||||
links = []
|
||||
clearShield()
|
||||
}
|
||||
|
||||
static func applyShield(for tokens: Set<ApplicationToken>) {
|
||||
let store = AppRestrictShared.makeStore()
|
||||
if tokens.isEmpty {
|
||||
|
|
@ -237,10 +262,15 @@ enum AppRestrictSharedStore {
|
|||
}
|
||||
}
|
||||
|
||||
static func loadShieldDisplayImage() -> UIImage? {
|
||||
// 系统把 icon 画在约 100pt 方格里;画布按这个尺寸、圆角 30,屏幕上看才是 30。
|
||||
loadShieldImage()?.appRestrictShieldIcon(size: 100, cornerRadius: 30)
|
||||
}
|
||||
|
||||
static func saveCustomImage(_ image: UIImage) -> Bool {
|
||||
guard let url = AppRestrictShared.customImageURL else { return false }
|
||||
let resized = image.appRestrictResized(maxSide: 720)
|
||||
guard let data = resized.jpegData(compressionQuality: 0.82) else { return false }
|
||||
guard let data = resized.pngData() else { return false }
|
||||
do {
|
||||
try data.write(to: url, options: .atomic)
|
||||
return true
|
||||
|
|
@ -250,7 +280,7 @@ enum AppRestrictSharedStore {
|
|||
}
|
||||
}
|
||||
|
||||
private extension UIImage {
|
||||
extension UIImage {
|
||||
func appRestrictResized(maxSide: CGFloat) -> UIImage {
|
||||
let maxCurrent = max(size.width, size.height)
|
||||
guard maxCurrent > maxSide, maxCurrent > 0 else { return self }
|
||||
|
|
@ -261,4 +291,20 @@ private extension UIImage {
|
|||
draw(in: CGRect(origin: .zero, size: newSize))
|
||||
}
|
||||
}
|
||||
|
||||
func appRestrictShieldIcon(size: CGFloat, cornerRadius: CGFloat) -> UIImage {
|
||||
let canvas = CGSize(width: size, height: size)
|
||||
let format = UIGraphicsImageRendererFormat()
|
||||
format.opaque = false
|
||||
format.scale = UIScreen.main.scale
|
||||
let renderer = UIGraphicsImageRenderer(size: canvas, format: format)
|
||||
return renderer.image { _ in
|
||||
let rect = CGRect(origin: .zero, size: canvas)
|
||||
let path = UIBezierPath(roundedRect: rect, cornerRadius: cornerRadius)
|
||||
path.addClip()
|
||||
UIColor.white.setFill()
|
||||
path.fill()
|
||||
draw(in: rect)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -342,6 +342,7 @@
|
|||
55B218B13024B00100784722 /* FeatureIntroVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B218B13024B00100784721 /* FeatureIntroVC.swift */; };
|
||||
55B218B13024B00100784724 /* FeatureIntroView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B218B13024B00100784723 /* FeatureIntroView.swift */; };
|
||||
55B219A2302A000100784751 /* UnlockRequestPopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B219A1302A000100784750 /* UnlockRequestPopView.swift */; };
|
||||
55B250023050000100784902 /* LockedAppPopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B250013050000100784901 /* LockedAppPopView.swift */; };
|
||||
55B219B2302A000100784761 /* ReceiveMessagePopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B219B1302A000100784760 /* ReceiveMessagePopView.swift */; };
|
||||
55B219B4302A000100784763 /* ReceiveMessageReportPopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B219B3302A000100784762 /* ReceiveMessageReportPopView.swift */; };
|
||||
55B219C13024C00100784722 /* BubbleHeroView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B219C13024C00100784721 /* BubbleHeroView.swift */; };
|
||||
|
|
@ -787,6 +788,7 @@
|
|||
55B218B13024B00100784721 /* FeatureIntroVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureIntroVC.swift; sourceTree = "<group>"; };
|
||||
55B218B13024B00100784723 /* FeatureIntroView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureIntroView.swift; sourceTree = "<group>"; };
|
||||
55B219A1302A000100784750 /* UnlockRequestPopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnlockRequestPopView.swift; sourceTree = "<group>"; };
|
||||
55B250013050000100784901 /* LockedAppPopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LockedAppPopView.swift; sourceTree = "<group>"; };
|
||||
55B219B1302A000100784760 /* ReceiveMessagePopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReceiveMessagePopView.swift; sourceTree = "<group>"; };
|
||||
55B219B3302A000100784762 /* ReceiveMessageReportPopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReceiveMessageReportPopView.swift; sourceTree = "<group>"; };
|
||||
55B219C13024C00100784721 /* BubbleHeroView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BubbleHeroView.swift; sourceTree = "<group>"; };
|
||||
|
|
@ -1324,6 +1326,7 @@
|
|||
55B222000000000100784830 /* AddEmojiPopView.swift */,
|
||||
55B222020000000100784832 /* AddMessagePopView.swift */,
|
||||
55B219A1302A000100784750 /* UnlockRequestPopView.swift */,
|
||||
55B250013050000100784901 /* LockedAppPopView.swift */,
|
||||
55B219B1302A000100784760 /* ReceiveMessagePopView.swift */,
|
||||
55B219B3302A000100784762 /* ReceiveMessageReportPopView.swift */,
|
||||
55B217C23022F0A000784722 /* MemberPhoneReportView.swift */,
|
||||
|
|
@ -2502,6 +2505,7 @@
|
|||
30EFF3A82FD7C6A400EB35D4 /* GroupSettingViewModel.swift in Sources */,
|
||||
55B2179130217D6600784774 /* HomeView2.swift in Sources */,
|
||||
55B219A2302A000100784751 /* UnlockRequestPopView.swift in Sources */,
|
||||
55B250023050000100784902 /* LockedAppPopView.swift in Sources */,
|
||||
55B219B2302A000100784761 /* ReceiveMessagePopView.swift in Sources */,
|
||||
55B219B4302A000100784763 /* ReceiveMessageReportPopView.swift in Sources */,
|
||||
55B219C2302A000100784771 /* PigeonMessageVC.swift in Sources */,
|
||||
|
|
|
|||
|
|
@ -148,7 +148,10 @@ enum GatewayStatusCode: Int {
|
|||
case noAuthority = 500
|
||||
// 审核中
|
||||
case review = 201
|
||||
|
||||
/** ============== 业务 ============== */
|
||||
// 需要开通vip
|
||||
case needVip = 20000
|
||||
// 您创建的圈子个数已达上限,请升级会员等级
|
||||
case groupLimit = 20009
|
||||
|
||||
|
|
|
|||
|
|
@ -34,6 +34,42 @@ enum UserAPI {
|
|||
/// 成员手机使用报告
|
||||
case phoneUsageReport(userId: String, groupKey: String)
|
||||
|
||||
/// 成员历史行程
|
||||
case phoneUsageTrips(userId: String, date: Int64)
|
||||
|
||||
/// 查询应用图标是否已存在
|
||||
case queryPhoneUsageIcon(package: String)
|
||||
|
||||
/// 登记应用图标
|
||||
case savePhoneUsageIcon(package: String, icon: String)
|
||||
|
||||
/// 上报本机配对应用
|
||||
case phoneLockApp(token: String, icon: String)
|
||||
|
||||
/// 成员可锁应用列表
|
||||
case phoneLockApps(userId: String, groupKey: String)
|
||||
|
||||
/// 删除本机配对应用;空 token 数组表示全部删除
|
||||
case phoneLockAppsDelete(os: String, tokens: [String])
|
||||
|
||||
/// 锁定成员应用
|
||||
case phoneLock(os: String, groupKey: String, userId: String, tokens: [String], iconIndex: Int, message: String)
|
||||
|
||||
/// 查询自己是否被锁
|
||||
case phoneLocked(os: String)
|
||||
|
||||
/// 发起解锁请求
|
||||
case requestPhoneUnlock(os: String, groupKey: String, tokens: [String])
|
||||
|
||||
/// 拉取解锁请求列表
|
||||
case phoneUnlockRequests(os: String)
|
||||
|
||||
/// 解锁
|
||||
case phoneUnlock(os: String, groupKey: String, userId: String, tokens: [String])
|
||||
|
||||
/// 查询本机离线期间是否允许解锁
|
||||
case phoneUnlockAllow(os: String)
|
||||
|
||||
/// 用户IM Token
|
||||
case imToken
|
||||
|
||||
|
|
@ -43,8 +79,10 @@ enum UserAPI {
|
|||
/// 更换手机号
|
||||
case changePhone(timestamp: String, phone: String, code: String)
|
||||
|
||||
/// 设置头像
|
||||
case setHeadPic(index: Int)
|
||||
/// 设置头像(预设序号或上传后的图片 URL)
|
||||
case setHeadPic(headPic: String)
|
||||
|
||||
case changeAvater(url: String)
|
||||
|
||||
/// 昵称
|
||||
case setNickName(nick: String)
|
||||
|
|
@ -116,11 +154,31 @@ extension UserAPI: MultiTargetProtocol {
|
|||
return "mapi/phone/usage/period"
|
||||
case .phoneUsageReport:
|
||||
return "mapi/phone/usage/report"
|
||||
case .phoneUsageTrips:
|
||||
return "mapi/phone/usage/trips"
|
||||
case .queryPhoneUsageIcon, .savePhoneUsageIcon:
|
||||
return "mapi/phone/usage/icon"
|
||||
case .phoneLockApp:
|
||||
return "mapi/phone/lock/app"
|
||||
case .phoneLockApps:
|
||||
return "mapi/phone/lock/apps"
|
||||
case .phoneLockAppsDelete:
|
||||
return "mapi/phone/lock/apps/delete"
|
||||
case .phoneLock:
|
||||
return "mapi/phone/lock"
|
||||
case .phoneLocked:
|
||||
return "mapi/phone/locked"
|
||||
case .requestPhoneUnlock, .phoneUnlockRequests:
|
||||
return "mapi/phone/unlock/request"
|
||||
case .phoneUnlock:
|
||||
return "mapi/phone/unlock"
|
||||
case .phoneUnlockAllow:
|
||||
return "mapi/phone/unlock/allow"
|
||||
case .imToken:
|
||||
return "mapi/openim/user/token/get"
|
||||
case .signInInfo:
|
||||
return "mapi/user/signin"
|
||||
case .changePhone:
|
||||
case .changePhone, .changeAvater:
|
||||
return "api/user"
|
||||
case .setHeadPic:
|
||||
return "mapi/user/setheadpic"
|
||||
|
|
@ -129,7 +187,7 @@ extension UserAPI: MultiTargetProtocol {
|
|||
case .setMood:
|
||||
return "mapi/user/setmood"
|
||||
case .setGender:
|
||||
return "api/user"
|
||||
return "mapi/user/setsex"
|
||||
case .emergencyContact:
|
||||
return "mapi/user/emergencycontact"
|
||||
case .deleteAccount:
|
||||
|
|
@ -155,9 +213,9 @@ extension UserAPI: MultiTargetProtocol {
|
|||
|
||||
var method: Moya.Method {
|
||||
switch self {
|
||||
case .userInfo, .userStatus, .phoneUsageToday, .phoneUsagePeriod, .phoneUsageReport, .signInInfo, .notice, .followList, .relations:
|
||||
case .userInfo, .userStatus, .phoneUsageToday, .phoneUsagePeriod, .phoneUsageReport, .phoneUsageTrips, .queryPhoneUsageIcon, .phoneLockApps, .phoneLocked, .phoneUnlockRequests, .phoneUnlockAllow, .signInInfo, .notice, .followList, .relations:
|
||||
return .get
|
||||
case .changePhone, .setGender:
|
||||
case .changePhone, .setGender, .changeAvater:
|
||||
return .put
|
||||
case .deleteAccount:
|
||||
return .delete
|
||||
|
|
@ -203,6 +261,104 @@ extension UserAPI: MultiTargetProtocol {
|
|||
]
|
||||
return .requestParameters(parameters: params, encoding: URLEncoding.queryString)
|
||||
|
||||
case let .phoneUsageTrips(userId, date):
|
||||
let params: Parameters = [
|
||||
"user_id": userId,
|
||||
"date": NSNumber(value: date),
|
||||
"simplify": "true",
|
||||
"include_events": "false"
|
||||
]
|
||||
return .requestParameters(parameters: params, encoding: URLEncoding.queryString)
|
||||
|
||||
case let .queryPhoneUsageIcon(package):
|
||||
return .requestParameters(parameters: ["package": package], encoding: URLEncoding.queryString)
|
||||
|
||||
case let .savePhoneUsageIcon(package, icon):
|
||||
return .requestParameters(
|
||||
parameters: ["package": package, "icon": icon],
|
||||
encoding: JSONEncoding()
|
||||
)
|
||||
|
||||
case let .phoneLockApp(token, icon):
|
||||
return .requestParameters(
|
||||
parameters: [
|
||||
"os": "ios",
|
||||
"token": token,
|
||||
"icon": icon
|
||||
],
|
||||
encoding: JSONEncoding()
|
||||
)
|
||||
|
||||
case let .phoneLockApps(userId, groupKey):
|
||||
return .requestParameters(
|
||||
parameters: [
|
||||
"user_id": userId,
|
||||
"group_key": groupKey
|
||||
],
|
||||
encoding: URLEncoding.queryString
|
||||
)
|
||||
|
||||
case let .phoneLockAppsDelete(os, tokens):
|
||||
return .requestParameters(
|
||||
parameters: [
|
||||
"os": os,
|
||||
"token": tokens
|
||||
],
|
||||
encoding: JSONEncoding()
|
||||
)
|
||||
|
||||
case let .phoneLock(os, groupKey, userId, tokens, iconIndex, message):
|
||||
return .requestParameters(
|
||||
parameters: [
|
||||
"os": os,
|
||||
"group_key": groupKey,
|
||||
"user_id": userId,
|
||||
"token": tokens,
|
||||
"icon_index": iconIndex,
|
||||
"message": message
|
||||
],
|
||||
encoding: JSONEncoding()
|
||||
)
|
||||
|
||||
case let .phoneLocked(os):
|
||||
return .requestParameters(
|
||||
parameters: ["os": os],
|
||||
encoding: URLEncoding.queryString
|
||||
)
|
||||
|
||||
case let .requestPhoneUnlock(os, groupKey, tokens):
|
||||
return .requestParameters(
|
||||
parameters: [
|
||||
"os": os,
|
||||
"group_key": groupKey,
|
||||
"token": tokens
|
||||
],
|
||||
encoding: JSONEncoding()
|
||||
)
|
||||
|
||||
case let .phoneUnlockRequests(os):
|
||||
return .requestParameters(
|
||||
parameters: ["os": os],
|
||||
encoding: URLEncoding.queryString
|
||||
)
|
||||
|
||||
case let .phoneUnlock(os, groupKey, userId, tokens):
|
||||
return .requestParameters(
|
||||
parameters: [
|
||||
"os": os,
|
||||
"group_key": groupKey,
|
||||
"user_id": userId,
|
||||
"token": tokens
|
||||
],
|
||||
encoding: JSONEncoding()
|
||||
)
|
||||
|
||||
case let .phoneUnlockAllow(os):
|
||||
return .requestParameters(
|
||||
parameters: ["os": os],
|
||||
encoding: URLEncoding.queryString
|
||||
)
|
||||
|
||||
case .imToken:
|
||||
var params = Parameters()
|
||||
params["platform_id"] = 1
|
||||
|
|
@ -212,6 +368,11 @@ extension UserAPI: MultiTargetProtocol {
|
|||
case .signInInfo:
|
||||
return .requestParameters(parameters: Parameters(), encoding: URLEncoding())
|
||||
|
||||
case let .changeAvater(url):
|
||||
var params = Parameters()
|
||||
params["avater"] = url
|
||||
return .requestParameters(parameters: params, encoding: JSONEncoding())
|
||||
|
||||
case let .changePhone(timestamp, phone, code):
|
||||
var params = Parameters()
|
||||
params["phone_timestamp"] = timestamp
|
||||
|
|
@ -219,9 +380,9 @@ extension UserAPI: MultiTargetProtocol {
|
|||
params["phone_code"] = code
|
||||
return .requestParameters(parameters: params, encoding: JSONEncoding())
|
||||
|
||||
case let .setHeadPic(index):
|
||||
case let .setHeadPic(headPic):
|
||||
var params = Parameters()
|
||||
params["head_pic_index"] = index
|
||||
params["head_pic_index"] = headPic
|
||||
return .requestParameters(parameters: params, encoding: JSONEncoding())
|
||||
|
||||
case let .setNickName(nick):
|
||||
|
|
|
|||
|
|
@ -26,6 +26,10 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
|||
setupLocation()
|
||||
ApiManager.shared.setup()
|
||||
AppRouter.shared.setup()
|
||||
AppUnlockCoordinator.shared.start()
|
||||
if #available(iOS 16.0, *) {
|
||||
AppRestrictManager.shared.startPermissionMonitoring()
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 137 B After Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 189 B After Width: | Height: | Size: 197 KiB |
|
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"provides-namespace" : true
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"images" : [
|
||||
{ "idiom" : "universal", "scale" : "1x" },
|
||||
{ "filename" : "clock@2x.png", "idiom" : "universal", "scale" : "2x" },
|
||||
{ "filename" : "clock@3x.png", "idiom" : "universal", "scale" : "3x" }
|
||||
],
|
||||
"info" : { "author" : "xcode", "version" : 1 }
|
||||
}
|
||||
BIN
QuickLocation/Assets.xcassets/Home/HistoryTrack/clock.imageset/clock@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 627 B |
BIN
QuickLocation/Assets.xcassets/Home/HistoryTrack/clock.imageset/clock@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
8
QuickLocation/Assets.xcassets/Home/HistoryTrack/date_next.imageset/Contents.json
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"images" : [
|
||||
{ "idiom" : "universal", "scale" : "1x" },
|
||||
{ "filename" : "Group 1901@2x.png", "idiom" : "universal", "scale" : "2x" },
|
||||
{ "filename" : "Group 1901@3x.png", "idiom" : "universal", "scale" : "3x" }
|
||||
],
|
||||
"info" : { "author" : "xcode", "version" : 1 }
|
||||
}
|
||||
BIN
QuickLocation/Assets.xcassets/Home/HistoryTrack/date_next.imageset/Group 1901@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 330 B |
BIN
QuickLocation/Assets.xcassets/Home/HistoryTrack/date_next.imageset/Group 1901@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 623 B |
8
QuickLocation/Assets.xcassets/Home/HistoryTrack/date_prev.imageset/Contents.json
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"images" : [
|
||||
{ "idiom" : "universal", "scale" : "1x" },
|
||||
{ "filename" : "Group 1900@2x.png", "idiom" : "universal", "scale" : "2x" },
|
||||
{ "filename" : "Group 1900@3x.png", "idiom" : "universal", "scale" : "3x" }
|
||||
],
|
||||
"info" : { "author" : "xcode", "version" : 1 }
|
||||
}
|
||||
BIN
QuickLocation/Assets.xcassets/Home/HistoryTrack/date_prev.imageset/Group 1900@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 334 B |
BIN
QuickLocation/Assets.xcassets/Home/HistoryTrack/date_prev.imageset/Group 1900@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 632 B |
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"images" : [
|
||||
{ "idiom" : "universal", "scale" : "1x" },
|
||||
{ "filename" : "组 48355@2x.png", "idiom" : "universal", "scale" : "2x" },
|
||||
{ "filename" : "组 48355@3x.png", "idiom" : "universal", "scale" : "3x" }
|
||||
],
|
||||
"info" : { "author" : "xcode", "version" : 1 }
|
||||
}
|
||||
BIN
QuickLocation/Assets.xcassets/Home/HistoryTrack/end.imageset/组 48355@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
QuickLocation/Assets.xcassets/Home/HistoryTrack/end.imageset/组 48355@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
22
QuickLocation/Assets.xcassets/Home/HistoryTrack/header_bg.imageset/Contents.json
vendored
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "组 46168@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "组 46168@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
BIN
QuickLocation/Assets.xcassets/Home/HistoryTrack/header_bg.imageset/组 46168@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
QuickLocation/Assets.xcassets/Home/HistoryTrack/header_bg.imageset/组 46168@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 45 KiB |
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"images" : [
|
||||
{ "idiom" : "universal", "scale" : "1x" },
|
||||
{ "filename" : "暂停@2x.png", "idiom" : "universal", "scale" : "2x" },
|
||||
{ "filename" : "暂停@3x.png", "idiom" : "universal", "scale" : "3x" }
|
||||
],
|
||||
"info" : { "author" : "xcode", "version" : 1 }
|
||||
}
|
||||
|
After Width: | Height: | Size: 171 B |
|
After Width: | Height: | Size: 227 B |
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"images" : [
|
||||
{ "idiom" : "universal", "scale" : "1x" },
|
||||
{ "filename" : "Group 2174@2x.png", "idiom" : "universal", "scale" : "2x" },
|
||||
{ "filename" : "Group 2174@3x.png", "idiom" : "universal", "scale" : "3x" }
|
||||
],
|
||||
"info" : { "author" : "xcode", "version" : 1 }
|
||||
}
|
||||
BIN
QuickLocation/Assets.xcassets/Home/HistoryTrack/play.imageset/Group 2174@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 397 B |
BIN
QuickLocation/Assets.xcassets/Home/HistoryTrack/play.imageset/Group 2174@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 817 B |
8
QuickLocation/Assets.xcassets/Home/HistoryTrack/slider_thumb.imageset/Contents.json
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"images" : [
|
||||
{ "idiom" : "universal", "scale" : "1x" },
|
||||
{ "filename" : "进度条-圆@2x.png", "idiom" : "universal", "scale" : "2x" },
|
||||
{ "filename" : "进度条-圆@3x.png", "idiom" : "universal", "scale" : "3x" }
|
||||
],
|
||||
"info" : { "author" : "xcode", "version" : 1 }
|
||||
}
|
||||
BIN
QuickLocation/Assets.xcassets/Home/HistoryTrack/slider_thumb.imageset/进度条-圆@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 471 B |
BIN
QuickLocation/Assets.xcassets/Home/HistoryTrack/slider_thumb.imageset/进度条-圆@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 869 B |
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"images" : [
|
||||
{ "idiom" : "universal", "scale" : "1x" },
|
||||
{ "filename" : "组 48354@2x.png", "idiom" : "universal", "scale" : "2x" },
|
||||
{ "filename" : "组 48354@3x.png", "idiom" : "universal", "scale" : "3x" }
|
||||
],
|
||||
"info" : { "author" : "xcode", "version" : 1 }
|
||||
}
|
||||
BIN
QuickLocation/Assets.xcassets/Home/HistoryTrack/start.imageset/组 48354@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
QuickLocation/Assets.xcassets/Home/HistoryTrack/start.imageset/组 48354@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"images" : [
|
||||
{ "idiom" : "universal", "scale" : "1x" },
|
||||
{ "filename" : "image@2x.png", "idiom" : "universal", "scale" : "2x" },
|
||||
{ "filename" : "image@3x.png", "idiom" : "universal", "scale" : "3x" }
|
||||
],
|
||||
"info" : { "author" : "xcode", "version" : 1 }
|
||||
}
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 5.5 KiB |
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"images" : [
|
||||
{ "idiom" : "universal", "scale" : "1x" },
|
||||
{ "filename" : "Rectangle 919@2x.png", "idiom" : "universal", "scale" : "2x" },
|
||||
{ "filename" : "Rectangle 919@3x.png", "idiom" : "universal", "scale" : "3x" }
|
||||
],
|
||||
"info" : { "author" : "xcode", "version" : 1 }
|
||||
}
|
||||
BIN
QuickLocation/Assets.xcassets/Home/couple_member_bg.imageset/Rectangle 919@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 4.8 KiB |
BIN
QuickLocation/Assets.xcassets/Home/couple_member_bg.imageset/Rectangle 919@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 7.7 KiB |
|
|
@ -5,12 +5,12 @@
|
|||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "Group_1483@2x.png",
|
||||
"filename" : "组 48328@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "Group_1483@3x.png",
|
||||
"filename" : "组 48328@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 117 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
|
@ -5,12 +5,12 @@
|
|||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "Group_1482@2x.png",
|
||||
"filename" : "蒙版组 13953@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "Group_1482@3x.png",
|
||||
"filename" : "蒙版组 13953@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 5.7 KiB |
22
QuickLocation/Assets.xcassets/LockDistract/app_list_lock.imageset/Contents.json
vendored
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "app_list_lock@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "app_list_lock@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
BIN
QuickLocation/Assets.xcassets/LockDistract/app_list_lock.imageset/app_list_lock@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 360 B |
BIN
QuickLocation/Assets.xcassets/LockDistract/app_list_lock.imageset/app_list_lock@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 898 B |
22
QuickLocation/Assets.xcassets/LockDistract/app_locked_overlay.imageset/Contents.json
vendored
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "app_locked_overlay@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "app_locked_overlay@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
BIN
QuickLocation/Assets.xcassets/LockDistract/app_locked_overlay.imageset/app_locked_overlay@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
QuickLocation/Assets.xcassets/LockDistract/app_locked_overlay.imageset/app_locked_overlay@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 33 KiB |
22
QuickLocation/Assets.xcassets/LockDistract/locked_self.imageset/Contents.json
vendored
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "locked_self@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "locked_self@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
BIN
QuickLocation/Assets.xcassets/LockDistract/locked_self.imageset/locked_self@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 9.9 KiB |
BIN
QuickLocation/Assets.xcassets/LockDistract/locked_self.imageset/locked_self@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 125 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 282 KiB After Width: | Height: | Size: 44 KiB |
22
QuickLocation/Assets.xcassets/Mine/avatar_album_badge.imageset/Contents.json
vendored
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "avatar_album_badge@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "avatar_album_badge@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
BIN
QuickLocation/Assets.xcassets/Mine/avatar_album_badge.imageset/avatar_album_badge@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
QuickLocation/Assets.xcassets/Mine/avatar_album_badge.imageset/avatar_album_badge@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 2.7 KiB |
22
QuickLocation/Assets.xcassets/PigeonMessage/image_placeholder.imageset/Contents.json
vendored
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "image_placeholder@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "image_placeholder@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
BIN
QuickLocation/Assets.xcassets/PigeonMessage/image_placeholder.imageset/image_placeholder@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 4.4 KiB |
BIN
QuickLocation/Assets.xcassets/PigeonMessage/image_placeholder.imageset/image_placeholder@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 7.6 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 120 KiB |
|
|
@ -5,12 +5,12 @@
|
|||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "Frame_16@2x.png",
|
||||
"filename": "1@2x.png",
|
||||
"idiom": "universal",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "Frame_16@3x.png",
|
||||
"filename": "1@3x.png",
|
||||
"idiom": "universal",
|
||||
"scale": "3x"
|
||||
}
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 99 KiB |
|
|
@ -5,12 +5,12 @@
|
|||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "Frame_20@2x.png",
|
||||
"filename": "10@2x.png",
|
||||
"idiom": "universal",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "Frame_20@3x.png",
|
||||
"filename": "10@3x.png",
|
||||
"idiom": "universal",
|
||||
"scale": "3x"
|
||||
}
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 110 KiB |
|
|
@ -5,12 +5,12 @@
|
|||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "Frame_21@2x.png",
|
||||
"filename": "11@2x.png",
|
||||
"idiom": "universal",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "Frame_21@3x.png",
|
||||
"filename": "11@3x.png",
|
||||
"idiom": "universal",
|
||||
"scale": "3x"
|
||||
}
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 122 KiB |
|
|
@ -5,12 +5,12 @@
|
|||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "Frame_22@2x.png",
|
||||
"filename" : "12@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "Frame_22@3x.png",
|
||||
"filename" : "12@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
|
@ -5,12 +5,12 @@
|
|||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "Frame_23@2x.png",
|
||||
"filename": "13@2x.png",
|
||||
"idiom": "universal",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "Frame_23@3x.png",
|
||||
"filename": "13@3x.png",
|
||||
"idiom": "universal",
|
||||
"scale": "3x"
|
||||
}
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 88 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 110 KiB |
|
|
@ -5,12 +5,12 @@
|
|||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "Frame_24@2x.png",
|
||||
"filename": "14@2x.png",
|
||||
"idiom": "universal",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "Frame_24@3x.png",
|
||||
"filename": "14@3x.png",
|
||||
"idiom": "universal",
|
||||
"scale": "3x"
|
||||
}
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 54 KiB |