@@ -28,20 +28,23 @@ extension NSItemProvider {
28
28
try ? await loadItem ( forTypeIdentifier: UTType . text. identifier) as? String
29
29
}
30
30
31
- func storeData( ) async -> URL ? {
31
+ /// Stores the item's data from the provider within the temporary directory, returning the URL on success.
32
+ /// - Parameter withinAppGroupContainer: Whether the data needs to be shared between bundles.
33
+ /// If passing `true` you will need to manually clean up the file once you have the data in the receiving bundle.
34
+ func storeData( withinAppGroupContainer: Bool = false ) async -> URL ? {
32
35
guard let contentType = preferredContentType else {
33
36
MXLog . error ( " Invalid NSItemProvider: \( self ) " )
34
37
return nil
35
38
}
36
39
37
40
if contentType. type. identifier == UTType . image. identifier {
38
- return await generateURLForUIImage ( contentType)
41
+ return await generateURLForUIImage ( contentType, withinAppGroupContainer : withinAppGroupContainer )
39
42
} else {
40
- return await generateURLForGenericData ( contentType)
43
+ return await generateURLForGenericData ( contentType, withinAppGroupContainer : withinAppGroupContainer )
41
44
}
42
45
}
43
46
44
- private func generateURLForUIImage( _ contentType: PreferredContentType ) async -> URL ? {
47
+ private func generateURLForUIImage( _ contentType: PreferredContentType , withinAppGroupContainer : Bool ) async -> URL ? {
45
48
guard let uiImage = try ? await loadItem ( forTypeIdentifier: contentType. type. identifier) as? UIImage else {
46
49
MXLog . error ( " Failed casting UIImage, invalid NSItemProvider: \( self ) " )
47
50
return nil
@@ -52,22 +55,25 @@ extension NSItemProvider {
52
55
return nil
53
56
}
54
57
58
+ let filename = if let suggestedName = suggestedName as NSString ? ,
59
+ // Suggestions are nice but their extension is `jpeg`
60
+ let filename = ( suggestedName. deletingPathExtension as NSString ) . appendingPathExtension ( contentType. fileExtension) {
61
+ filename
62
+ } else {
63
+ " \( UUID ( ) . uuidString) . \( contentType. fileExtension) "
64
+ }
65
+
55
66
do {
56
- if let suggestedName = suggestedName as? NSString ,
57
- // Suggestions are nice but their extension is `jpeg`
58
- let filename = ( suggestedName. deletingPathExtension as NSString ) . appendingPathExtension ( contentType. fileExtension) {
59
- return try FileManager . default. writeDataToTemporaryDirectory ( data: pngData, fileName: filename)
60
- } else {
61
- let filename = " \( UUID ( ) . uuidString) . \( contentType. fileExtension) "
62
- return try FileManager . default. writeDataToTemporaryDirectory ( data: pngData, fileName: filename)
63
- }
67
+ return try FileManager . default. writeDataToTemporaryDirectory ( data: pngData,
68
+ fileName: filename,
69
+ withinAppGroupContainer: withinAppGroupContainer)
64
70
} catch {
65
71
MXLog . error ( " Failed storing NSItemProvider data \( self ) with error: \( error) " )
66
72
return nil
67
73
}
68
74
}
69
75
70
- private func generateURLForGenericData( _ contentType: PreferredContentType ) async -> URL ? {
76
+ private func generateURLForGenericData( _ contentType: PreferredContentType , withinAppGroupContainer : Bool ) async -> URL ? {
71
77
let providerDescription = description
72
78
let shareData : Data ? = await withCheckedContinuation { continuation in
73
79
_ = loadDataRepresentation ( for: contentType. type) { data, error in
@@ -92,15 +98,19 @@ extension NSItemProvider {
92
98
return nil
93
99
}
94
100
101
+ let filename = if let suggestedName = suggestedName as NSString ? ,
102
+ suggestedName. hasPathExtension {
103
+ suggestedName as String
104
+ } else if let suggestedName {
105
+ " \( suggestedName) . \( contentType. fileExtension) "
106
+ } else {
107
+ " \( UUID ( ) . uuidString) . \( contentType. fileExtension) "
108
+ }
109
+
95
110
do {
96
- if let filename = suggestedName {
97
- let hasExtension = !( filename as NSString ) . pathExtension. isEmpty
98
- let filename = hasExtension ? filename : " \( filename) . \( contentType. fileExtension) "
99
- return try FileManager . default. writeDataToTemporaryDirectory ( data: shareData, fileName: filename)
100
- } else {
101
- let filename = " \( UUID ( ) . uuidString) . \( contentType. fileExtension) "
102
- return try FileManager . default. writeDataToTemporaryDirectory ( data: shareData, fileName: filename)
103
- }
111
+ return try FileManager . default. writeDataToTemporaryDirectory ( data: shareData,
112
+ fileName: filename,
113
+ withinAppGroupContainer: withinAppGroupContainer)
104
114
} catch {
105
115
MXLog . error ( " Failed storing NSItemProvider data \( self ) with error: \( error) " )
106
116
return nil
@@ -164,3 +174,7 @@ extension NSItemProvider {
164
174
return mimeType. hasPrefix ( " image/ " ) || mimeType. hasPrefix ( " video/ " ) || mimeType. hasPrefix ( " application/ " )
165
175
}
166
176
}
177
+
178
+ private extension NSString {
179
+ var hasPathExtension : Bool { !pathExtension. isEmpty }
180
+ }
0 commit comments