@@ -21,10 +21,10 @@ final class DeviceTransferClient {
2121 private let key : DeviceTransferKey
2222 private let remotePlatform : DeviceTransferPlatform
2323 private let connection : NWConnection
24+ private let cacheContainerURL : URL
25+ private let messageProcessor : DeviceTransferMessageProcessor
2426 private let queue = Queue ( label: " one.mixin.messenger.DeviceTransferClient " )
25- private let cacheContainerURL = FileManager . default. temporaryDirectory. appendingPathComponent ( " DeviceTransfer " , isDirectory: true )
2627 private let speedInspector = NetworkSpeedInspector ( )
27- private let messageProcessor : DeviceTransferMessageProcessor
2828
2929 private weak var statisticsTimer : Timer ?
3030
@@ -40,7 +40,18 @@ final class DeviceTransferClient {
4040 Unmanaged < DeviceTransferClient > . passUnretained ( self ) . toOpaque ( )
4141 }
4242
43- init ( hostname: String , port: UInt16 , code: UInt16 , key: DeviceTransferKey , remotePlatform: DeviceTransferPlatform ) {
43+ init ( hostname: String , port: UInt16 , code: UInt16 , key: DeviceTransferKey , remotePlatform: DeviceTransferPlatform ) throws {
44+ // https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html#//apple_ref/doc/uid/TP40010672-CH2-SW2
45+ // In iOS 5.0 and later, the system may delete the Caches directory on rare occasions when the system is very low on disk space.
46+ // This will never occur while an app is running.
47+ let manager = FileManager . default
48+ let cacheContainerURL = try manager. url ( for: . cachesDirectory, in: . userDomainMask, appropriateFor: nil , create: true )
49+ . appendingPathComponent ( " DeviceTransfer " )
50+ if manager. fileExists ( atPath: cacheContainerURL. path) {
51+ try ? manager. removeItem ( at: cacheContainerURL)
52+ }
53+ try manager. createDirectory ( at: cacheContainerURL, withIntermediateDirectories: true )
54+
4455 self . hostname = hostname
4556 self . port = port
4657 self . code = code
@@ -52,6 +63,7 @@ final class DeviceTransferClient {
5263 let endpoint = NWEndpoint . hostPort ( host: host, port: port)
5364 return NWConnection ( to: endpoint, using: . deviceTransfer)
5465 } ( )
66+ self . cacheContainerURL = cacheContainerURL
5567 self . messageProcessor = . init( key: key. aes,
5668 remotePlatform: remotePlatform,
5769 cacheContainerURL: cacheContainerURL,
@@ -65,17 +77,6 @@ final class DeviceTransferClient {
6577
6678 func start( ) {
6779 Logger . general. info ( category: " DeviceTransferClient " , message: " Will start connecting to [ \( hostname) ]: \( port) " )
68- do {
69- let manager = FileManager . default
70- if manager. fileExists ( atPath: cacheContainerURL. path) {
71- try ? manager. removeItem ( at: cacheContainerURL)
72- }
73- try manager. createDirectory ( at: cacheContainerURL, withIntermediateDirectories: true )
74- } catch {
75- Logger . general. error ( category: " DeviceTransferClient " , message: " Failed to create cache container: \( error) " )
76- fail ( error: . createCacheContainer( error) )
77- return
78- }
7980 messageProcessor. $processingError
8081 . receive ( on: queue. dispatchQueue)
8182 . sink { error in
0 commit comments