diff --git a/Riot.xcodeproj/project.pbxproj b/Riot.xcodeproj/project.pbxproj index d4b4ca8a8..1f916c7f0 100644 --- a/Riot.xcodeproj/project.pbxproj +++ b/Riot.xcodeproj/project.pbxproj @@ -769,6 +769,10 @@ EC3B066A24AC6ADE000DF9BF /* CrossSigningSetupBannerCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = EC3B066624AC6ADD000DF9BF /* CrossSigningSetupBannerCell.xib */; }; EC3B066B24AC6ADE000DF9BF /* CrossSigningBannerPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC3B066724AC6ADD000DF9BF /* CrossSigningBannerPreferences.swift */; }; EC3B066C24AC6ADE000DF9BF /* CrossSigningSetupBannerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC3B066824AC6ADD000DF9BF /* CrossSigningSetupBannerCell.swift */; }; + EC619C1424D9C60C00663A80 /* PushNotificationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC619C1324D9C60C00663A80 /* PushNotificationManager.swift */; }; + EC619C1524D9C6EB00663A80 /* PushNotificationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC619C1324D9C60C00663A80 /* PushNotificationManager.swift */; }; + EC619C1624D9C6F900663A80 /* KeyValueStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC1CA87124C823E700DE9EBF /* KeyValueStore.swift */; }; + EC619C1724D9C70000663A80 /* KeychainStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC1CA87424C8259700DE9EBF /* KeychainStore.swift */; }; EC711B4624A63B13008F830C /* MXRecoveryService.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC711B4524A63B13008F830C /* MXRecoveryService.swift */; }; EC711B7424A63B37008F830C /* SecretsSetupRecoveryKeyViewModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC711B4A24A63B36008F830C /* SecretsSetupRecoveryKeyViewModelType.swift */; }; EC711B7524A63B37008F830C /* SecretsSetupRecoveryKeyCoordinatorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC711B4B24A63B36008F830C /* SecretsSetupRecoveryKeyCoordinatorType.swift */; }; @@ -1898,6 +1902,7 @@ EC3B066624AC6ADD000DF9BF /* CrossSigningSetupBannerCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CrossSigningSetupBannerCell.xib; sourceTree = ""; }; EC3B066724AC6ADD000DF9BF /* CrossSigningBannerPreferences.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CrossSigningBannerPreferences.swift; sourceTree = ""; }; EC3B066824AC6ADD000DF9BF /* CrossSigningSetupBannerCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CrossSigningSetupBannerCell.swift; sourceTree = ""; }; + EC619C1324D9C60C00663A80 /* PushNotificationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushNotificationManager.swift; sourceTree = ""; }; EC711B4524A63B13008F830C /* MXRecoveryService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MXRecoveryService.swift; sourceTree = ""; }; EC711B4A24A63B36008F830C /* SecretsSetupRecoveryKeyViewModelType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretsSetupRecoveryKeyViewModelType.swift; sourceTree = ""; }; EC711B4B24A63B36008F830C /* SecretsSetupRecoveryKeyCoordinatorType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretsSetupRecoveryKeyCoordinatorType.swift; sourceTree = ""; }; @@ -4850,6 +4855,7 @@ children = ( EC85D73C2477DDD0002C44C9 /* PushNotificationService.h */, EC85D73D2477DDD0002C44C9 /* PushNotificationService.m */, + EC619C1324D9C60C00663A80 /* PushNotificationManager.swift */, ); path = PushNotification; sourceTree = ""; @@ -5716,9 +5722,12 @@ EC2B4EF224A1EF34005EB739 /* DataProtectionHelper.swift in Sources */, EC85D7462477E5F7002C44C9 /* NotificationService.swift in Sources */, 32FD755424D074C700BA7B37 /* CommonConfiguration.swift in Sources */, + EC619C1524D9C6EB00663A80 /* PushNotificationManager.swift in Sources */, 32FD757424D2BEF700BA7B37 /* InfoPlist.swift in Sources */, EC85D752247C0F52002C44C9 /* UNUserNotificationCenter.swift in Sources */, + EC619C1624D9C6F900663A80 /* KeyValueStore.swift in Sources */, 32FD757A24D2C9BA00BA7B37 /* Bundle.swift in Sources */, + EC619C1724D9C70000663A80 /* KeychainStore.swift in Sources */, 32FD755B24D15C7A00BA7B37 /* Configurable.swift in Sources */, EC85D755247C0F84002C44C9 /* Constants.swift in Sources */, ); @@ -6178,6 +6187,7 @@ B1B5572820EE6C4D00210D55 /* RoomViewController.m in Sources */, B108932123AB8D7D00802670 /* KeyVerificationIncomingRequestApprovalViewData.swift in Sources */, EC85D7172477DCD7002C44C9 /* KeyVerificationScanConfirmationViewModel.swift in Sources */, + EC619C1424D9C60C00663A80 /* PushNotificationManager.swift in Sources */, B18DEDDA243377C10075FEF7 /* KeyVerificationSelfVerifyWaitViewState.swift in Sources */, B1B9DEED22EB34EF0065E677 /* ReactionHistoryCoordinator.swift in Sources */, B1DCC62A22E60D1000625807 /* EmojiMartService.swift in Sources */, diff --git a/Riot/Managers/PushNotification/PushNotificationManager.swift b/Riot/Managers/PushNotification/PushNotificationManager.swift new file mode 100644 index 000000000..96368fad6 --- /dev/null +++ b/Riot/Managers/PushNotification/PushNotificationManager.swift @@ -0,0 +1,62 @@ +// +// Copyright 2020 Vector Creations Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation +import KeychainAccess + +@objcMembers +final class PushNotificationManager: NSObject { + + // MARK: - Constants + + private struct PushNotificationConstants { + static let pushNotificationKeychainService: String = "im.vector.app.pushnotification-service" + } + + private struct StoreKeys { + static let pushToken: String = "pushtoken" + } + + static let shared = PushNotificationManager() + + /// Store. Defaults to `KeychainStore` + private let store: KeyValueStore + + override init() { + store = KeychainStore(withKeychain: Keychain(service: PushNotificationConstants.pushNotificationKeychainService, + accessGroup: Constants.keychainAccessGroup)) + super.init() + } + + /// Saved push token + var pushToken: Data? { + get { + do { + return try store.data(forKey: StoreKeys.pushToken) + } catch let error { + NSLog("[PinCodePreferences] Error when reading push token from store: \(error)") + return nil + } + } set { + do { + try store.set(newValue, forKey: StoreKeys.pushToken) + } catch let error { + NSLog("[PinCodePreferences] Error when storing push token to the store: \(error)") + } + } + } + +}