3 /// MatomoUserDefaults is a wrapper for the UserDefaults with properties
4 /// mapping onto values stored in the UserDefaults.
5 /// All getter and setter are sideeffect free and automatically syncronize
7 internal struct MatomoUserDefaults {
8 let userDefaults: UserDefaults
10 init(suiteName: String?) {
11 userDefaults = UserDefaults(suiteName: suiteName)!
14 var totalNumberOfVisits: Int {
16 return userDefaults.integer(forKey: MatomoUserDefaults.Key.totalNumberOfVisits)
19 userDefaults.set(newValue, forKey: MatomoUserDefaults.Key.totalNumberOfVisits)
20 userDefaults.synchronize()
24 var firstVisit: Date? {
26 return userDefaults.object(forKey: MatomoUserDefaults.Key.firstVistsTimestamp) as? Date
29 userDefaults.set(newValue, forKey: MatomoUserDefaults.Key.firstVistsTimestamp)
30 userDefaults.synchronize()
34 var previousVisit: Date? {
36 return userDefaults.object(forKey: MatomoUserDefaults.Key.previousVistsTimestamp) as? Date
39 userDefaults.set(newValue, forKey: MatomoUserDefaults.Key.previousVistsTimestamp)
40 userDefaults.synchronize()
44 var currentVisit: Date? {
46 return userDefaults.object(forKey: MatomoUserDefaults.Key.currentVisitTimestamp) as? Date
49 userDefaults.set(newValue, forKey: MatomoUserDefaults.Key.currentVisitTimestamp)
50 userDefaults.synchronize()
56 return userDefaults.bool(forKey: MatomoUserDefaults.Key.optOut)
59 userDefaults.set(newValue, forKey: MatomoUserDefaults.Key.optOut)
60 userDefaults.synchronize()
64 var clientId: String? {
66 return userDefaults.string(forKey: MatomoUserDefaults.Key.clientID)
69 userDefaults.setValue(newValue, forKey: MatomoUserDefaults.Key.clientID)
70 userDefaults.synchronize()
74 var visitorUserId: String? {
76 return userDefaults.string(forKey: MatomoUserDefaults.Key.visitorUserID);
79 userDefaults.setValue(newValue, forKey: MatomoUserDefaults.Key.visitorUserID);
80 userDefaults.synchronize()
85 extension MatomoUserDefaults {
86 public mutating func copy(from userDefaults: UserDefaults) {
87 totalNumberOfVisits = UserDefaults.standard.integer(forKey: MatomoUserDefaults.Key.totalNumberOfVisits)
88 firstVisit = UserDefaults.standard.object(forKey: MatomoUserDefaults.Key.firstVistsTimestamp) as? Date
89 previousVisit = UserDefaults.standard.object(forKey: MatomoUserDefaults.Key.previousVistsTimestamp) as? Date
90 currentVisit = UserDefaults.standard.object(forKey: MatomoUserDefaults.Key.currentVisitTimestamp) as? Date
91 optOut = UserDefaults.standard.bool(forKey: MatomoUserDefaults.Key.optOut)
92 clientId = UserDefaults.standard.string(forKey: MatomoUserDefaults.Key.clientID)
93 visitorUserId = UserDefaults.standard.string(forKey: MatomoUserDefaults.Key.visitorUserID)
97 extension MatomoUserDefaults {
99 static let totalNumberOfVisits = "PiwikTotalNumberOfVistsKey"
100 static let currentVisitTimestamp = "PiwikCurrentVisitTimestampKey"
101 static let previousVistsTimestamp = "PiwikPreviousVistsTimestampKey"
102 static let firstVistsTimestamp = "PiwikFirstVistsTimestampKey"
104 // Note: To be compatible with previous versions, the clientID key retains its old value,
105 // even though it is now a misnomer since adding visitorUserID makes it a bit confusing.
106 static let clientID = "PiwikVisitorIDKey"
107 static let visitorUserID = "PiwikVisitorUserIDKey"
108 static let optOut = "PiwikOptOutKey"