Skip to content

Commit f367fe0

Browse files
authored
Develop (#15)
* Feature/default attributes (#14)
1 parent 5822ae0 commit f367fe0

17 files changed

+458
-65
lines changed

Backtrace.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
Pod::Spec.new do |s|
1010

1111
s.name = "Backtrace"
12-
s.version = "1.1.0"
12+
s.version = "1.2.0"
1313
s.summary = "Backtrace's integration with iOS and macOS"
1414
s.description = "Backtrace's integration with iOS and macOS for handling crashes"
1515
s.homepage = "https://backtrace.io/"

Backtrace.xcodeproj/project.pbxproj

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,15 @@
99
/* Begin PBXBuildFile section */
1010
18ABC4BAF017FF456E5E5186 /* Pods_Example_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0FD3E3727B2ED6C3130FFE5 /* Pods_Example_iOS.framework */; };
1111
27F936A322CFBB6FE46EDEFE /* Pods_Example_macOS_ObjC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70856A4F8005B8D4E85C332B /* Pods_Example_macOS_ObjC.framework */; };
12+
28614F9E220B6D7C00D35EFB /* DefaultAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28614F9D220B6D7C00D35EFB /* DefaultAttributes.swift */; };
13+
28614F9F220B900300D35EFB /* DefaultAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28614F9D220B6D7C00D35EFB /* DefaultAttributes.swift */; };
14+
28966EFA2214BBD200E6E891 /* AttributesStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28966EF92214BBD200E6E891 /* AttributesStorage.swift */; };
15+
28966EFB2214BBDC00E6E891 /* AttributesStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28966EF92214BBD200E6E891 /* AttributesStorage.swift */; };
1216
28AC773A21F8C29800FED661 /* PersistentRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2C1513F21F7D8E30014F1B3 /* PersistentRepository.swift */; };
1317
28AC773C21FA5A8400FED661 /* BacktraceDatabaseSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28AC773B21FA5A8400FED661 /* BacktraceDatabaseSettings.swift */; };
1418
28AC773D21FA5A8900FED661 /* BacktraceDatabaseSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28AC773B21FA5A8400FED661 /* BacktraceDatabaseSettings.swift */; };
19+
28AC773F220A2A2900FED661 /* MultipartRequestType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28AC773E220A2A2900FED661 /* MultipartRequestType.swift */; };
20+
28AC7740220A2A3300FED661 /* MultipartRequestType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28AC773E220A2A2900FED661 /* MultipartRequestType.swift */; };
1521
49457C1D713EE46AB68B8DB4 /* Pods_Backtrace_macOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3CF3D5FE35B28DBBEE4FF32C /* Pods_Backtrace_macOS.framework */; };
1622
722A9E367FDFA23769CB4418 /* Pods_Backtrace_iOSTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF47A4A177C5A149E93E11E9 /* Pods_Backtrace_iOSTests.framework */; };
1723
7EE441EDD781250A50387BB8 /* Pods_Backtrace_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB1DDC29EB6DE43140A0290D /* Pods_Backtrace_iOS.framework */; };
@@ -180,7 +186,10 @@
180186
/* Begin PBXFileReference section */
181187
080261C779321096E82CBEA0 /* Pods-Backtrace-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Backtrace-iOS.release.xcconfig"; path = "Pods/Target Support Files/Pods-Backtrace-iOS/Pods-Backtrace-iOS.release.xcconfig"; sourceTree = "<group>"; };
182188
0CAEB5685940F7A87F1D5269 /* Pods-Backtrace-macOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Backtrace-macOS.release.xcconfig"; path = "Pods/Target Support Files/Pods-Backtrace-macOS/Pods-Backtrace-macOS.release.xcconfig"; sourceTree = "<group>"; };
189+
28614F9D220B6D7C00D35EFB /* DefaultAttributes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultAttributes.swift; sourceTree = "<group>"; };
190+
28966EF92214BBD200E6E891 /* AttributesStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttributesStorage.swift; sourceTree = "<group>"; };
183191
28AC773B21FA5A8400FED661 /* BacktraceDatabaseSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BacktraceDatabaseSettings.swift; sourceTree = "<group>"; };
192+
28AC773E220A2A2900FED661 /* MultipartRequestType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultipartRequestType.swift; sourceTree = "<group>"; };
184193
34D9997A1948E63D0311201D /* Pods_Example_iOS_ObjC.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Example_iOS_ObjC.framework; sourceTree = BUILT_PRODUCTS_DIR; };
185194
3676E30A5B3FD2E883AB5D38 /* Pods-Backtrace-macOSTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Backtrace-macOSTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-Backtrace-macOSTests/Pods-Backtrace-macOSTests.release.xcconfig"; sourceTree = "<group>"; };
186195
3BFE1A58A30C867A60163ED5 /* Pods-Backtrace-iOSTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Backtrace-iOSTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-Backtrace-iOSTests/Pods-Backtrace-iOSTests.release.xcconfig"; sourceTree = "<group>"; };
@@ -227,7 +236,6 @@
227236
F29CD78C21FC6BC700216C59 /* BacktraceFileManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BacktraceFileManager.swift; sourceTree = "<group>"; };
228237
F29CD79021FCC25600216C59 /* BacktraceWatcher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BacktraceWatcher.swift; sourceTree = "<group>"; };
229238
F29CD79321FDD5E900216C59 /* BacktraceClientDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BacktraceClientDelegate.swift; sourceTree = "<group>"; };
230-
F29CD79A21FE015700216C59 /* BacktraceDatabase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BacktraceDatabase.swift; sourceTree = "<group>"; };
231239
F2C1513E21F7D8E30014F1B3 /* Model.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = Model.xcdatamodel; sourceTree = "<group>"; };
232240
F2C1513F21F7D8E30014F1B3 /* PersistentRepository.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PersistentRepository.swift; sourceTree = "<group>"; };
233241
F2C2FA5021BBD26300934744 /* Backtrace.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Backtrace.framework; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -338,6 +346,15 @@
338346
/* End PBXFrameworksBuildPhase section */
339347

340348
/* Begin PBXGroup section */
349+
28614F9C220B6C6F00D35EFB /* Attributes */ = {
350+
isa = PBXGroup;
351+
children = (
352+
28614F9D220B6D7C00D35EFB /* DefaultAttributes.swift */,
353+
28966EF92214BBD200E6E891 /* AttributesStorage.swift */,
354+
);
355+
path = Attributes;
356+
sourceTree = "<group>";
357+
};
341358
449A1ACC1A947DD39B4F31F2 /* Pods */ = {
342359
isa = PBXGroup;
343360
children = (
@@ -406,6 +423,7 @@
406423
F282075F21CEABBC0017367F /* NetworkClientType.swift */,
407424
F28F165021E2A08F008E4B96 /* Method.swift */,
408425
F28F165321E2A097008E4B96 /* RequestType.swift */,
426+
28AC773E220A2A2900FED661 /* MultipartRequestType.swift */,
409427
F21771BF21E344C10059896E /* SendCrashRequest.swift */,
410428
);
411429
path = Network;
@@ -457,7 +475,6 @@
457475
F2D7122021F10C45002D2A26 /* BacktraceClientConfiguration.swift */,
458476
F2D7122321F10E78002D2A26 /* BacktraceCredentials.swift */,
459477
28AC773B21FA5A8400FED661 /* BacktraceDatabaseSettings.swift */,
460-
F29CD79A21FE015700216C59 /* BacktraceDatabase.swift */,
461478
);
462479
path = Foundation;
463480
sourceTree = "<group>";
@@ -539,6 +556,7 @@
539556
F2C2FA8421BBD2AE00934744 /* Sources */ = {
540557
isa = PBXGroup;
541558
children = (
559+
28614F9C220B6C6F00D35EFB /* Attributes */,
542560
F29CD79521FDD5EE00216C59 /* Event */,
543561
F29CD78F21FCC23800216C59 /* Watcher */,
544562
F28F165621E2A0BD008E4B96 /* Extensions */,
@@ -1229,10 +1247,12 @@
12291247
F28F164A21E2844A008E4B96 /* BacktraceUnregisteredClient.swift in Sources */,
12301248
F266B83321C77B9600D14417 /* BacktraceClient.swift in Sources */,
12311249
F25F9E9821EE84AF00236E04 /* BacktraceResultStatus.swift in Sources */,
1250+
28AC7740220A2A3300FED661 /* MultipartRequestType.swift in Sources */,
12321251
F21771C121E344C10059896E /* SendCrashRequest.swift in Sources */,
12331252
F25F9E9B21EE84EA00236E04 /* BacktraceResult.swift in Sources */,
12341253
F282076121CEABBC0017367F /* NetworkClientType.swift in Sources */,
12351254
F266B83421C77B9600D14417 /* BacktraceError.swift in Sources */,
1255+
28966EFB2214BBDC00E6E891 /* AttributesStorage.swift in Sources */,
12361256
F2C1514121F7D8E30014F1B3 /* Model.xcdatamodeld in Sources */,
12371257
F2D7122521F10E78002D2A26 /* BacktraceCredentials.swift in Sources */,
12381258
F28F164721E28441008E4B96 /* BacktraceRegisteredClient.swift in Sources */,
@@ -1241,6 +1261,7 @@
12411261
F266B83521C77B9600D14417 /* BacktraceNetworkClient.swift in Sources */,
12421262
F28F164421E28433008E4B96 /* BacktraceClientType.swift in Sources */,
12431263
F266B83621C77B9600D14417 /* CrashReporter+StringConvertible.swift in Sources */,
1264+
28614F9F220B900300D35EFB /* DefaultAttributes.swift in Sources */,
12441265
F282075C21CEA37A0017367F /* Repository.swift in Sources */,
12451266
F28F165221E2A08F008E4B96 /* Method.swift in Sources */,
12461267
F29CD78E21FC6BC700216C59 /* BacktraceFileManager.swift in Sources */,
@@ -1275,10 +1296,12 @@
12751296
F28F164321E28433008E4B96 /* BacktraceClientType.swift in Sources */,
12761297
F25F9E9721EE84AF00236E04 /* BacktraceResultStatus.swift in Sources */,
12771298
F21771C021E344C10059896E /* SendCrashRequest.swift in Sources */,
1299+
28AC773F220A2A2900FED661 /* MultipartRequestType.swift in Sources */,
12781300
F25F9E9A21EE84EA00236E04 /* BacktraceResult.swift in Sources */,
12791301
F28F165121E2A08F008E4B96 /* Method.swift in Sources */,
12801302
F22EB87721BBD36800DEE94E /* BacktraceClient.swift in Sources */,
12811303
F2C1514021F7D8E30014F1B3 /* Model.xcdatamodeld in Sources */,
1304+
28966EFA2214BBD200E6E891 /* AttributesStorage.swift in Sources */,
12821305
F2D7122421F10E78002D2A26 /* BacktraceCredentials.swift in Sources */,
12831306
F28F165421E2A097008E4B96 /* RequestType.swift in Sources */,
12841307
F28F164621E28441008E4B96 /* BacktraceRegisteredClient.swift in Sources */,
@@ -1287,6 +1310,7 @@
12871310
F2D8BE3821BD7894007CFEFA /* BacktraceError.swift in Sources */,
12881311
F282075821CEA31F0017367F /* BacktraceCrashReport.swift in Sources */,
12891312
F28F165821E2A0DA008E4B96 /* URLSession+Sync.swift in Sources */,
1313+
28614F9E220B6D7C00D35EFB /* DefaultAttributes.swift in Sources */,
12901314
F2D8BE3A21BD78A9007CFEFA /* BacktraceNetworkClient.swift in Sources */,
12911315
F2D7122121F10C45002D2A26 /* BacktraceClientConfiguration.swift in Sources */,
12921316
F29CD78D21FC6BC700216C59 /* BacktraceFileManager.swift in Sources */,
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import Foundation
2+
3+
class AttributesStorage {
4+
struct Config {
5+
let cacheUrl: URL
6+
let directoryUrl: URL
7+
let fileUrl: URL
8+
9+
init(fileName: String) throws {
10+
guard let cacheDirectoryURL =
11+
FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first else {
12+
throw FileError.noCacheDirectory
13+
}
14+
self.cacheUrl = cacheDirectoryURL
15+
self.directoryUrl = cacheDirectoryURL.appendingPathComponent(directoryName)
16+
self.fileUrl = directoryUrl.appendingPathComponent("\(fileName).plist")
17+
}
18+
}
19+
20+
typealias AttributesType = [String: Any]
21+
private static let directoryName = Bundle(for: AttributesStorage.self).bundleIdentifier ?? "BacktraceCache"
22+
23+
static func store(_ attributes: AttributesType, fileName: String) throws {
24+
let config = try Config(fileName: fileName)
25+
26+
if !FileManager.default.fileExists(atPath: config.directoryUrl.path) {
27+
try FileManager.default.createDirectory(atPath: config.directoryUrl.path,
28+
withIntermediateDirectories: false,
29+
attributes: nil)
30+
}
31+
32+
if #available(iOS 11.0, macOS 10.13, *) {
33+
try (attributes as NSDictionary).write(to: config.fileUrl)
34+
} else {
35+
guard (attributes as NSDictionary).write(to: config.fileUrl, atomically: true) else {
36+
throw FileError.fileNotWritten
37+
}
38+
}
39+
BacktraceLogger.debug("Stored attributes at path: \(config.fileUrl)")
40+
}
41+
42+
static func retrieve(fileName: String) throws -> AttributesType {
43+
let config = try Config(fileName: fileName)
44+
guard FileManager.default.fileExists(atPath: config.fileUrl.path) else {
45+
throw FileError.fileNotExists
46+
}
47+
// load file to NSDictionar
48+
let dictionary: NSDictionary
49+
if #available(iOS 11.0, macOS 10.13, *) {
50+
dictionary = try NSDictionary(contentsOf: config.fileUrl, error: ())
51+
} else {
52+
guard let dictionaryFromFile = NSDictionary(contentsOf: config.fileUrl) else {
53+
throw FileError.invalidPropertyList
54+
}
55+
dictionary = dictionaryFromFile
56+
}
57+
// cast safety to AttributesType
58+
guard let attributes: AttributesType = dictionary as? AttributesType else {
59+
throw FileError.invalidPropertyList
60+
}
61+
BacktraceLogger.debug("Retrieved attributes from path: \(config.fileUrl)")
62+
return attributes
63+
}
64+
65+
static func remove(fileName: String) throws {
66+
let config = try Config(fileName: fileName)
67+
// check file exists
68+
guard FileManager.default.fileExists(atPath: config.fileUrl.path) else {
69+
throw FileError.fileNotExists
70+
}
71+
// remove file
72+
try FileManager.default.removeItem(at: config.fileUrl)
73+
BacktraceLogger.debug("Removed attributes at path: \(config.fileUrl)")
74+
}
75+
}

0 commit comments

Comments
 (0)