@lodev09/react-native-exify 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # @lodev09/react-native-exify
1
+ # React Native Exify
2
2
 
3
- A simple library to read and write image Exif metadata in React Native.
3
+ A simple library to read and write image Exif metadata in React Native. Inspired from [this thread](https://github.com/mrousavy/react-native-vision-camera/issues/780).
4
4
 
5
5
  ## Features
6
6
  - Read Exif data from an image
@@ -33,17 +33,20 @@ console.log(tags)
33
33
  ```ts
34
34
  const uri = 'file://path/to/image.jpg'
35
35
  const newTags: ExifTags = {
36
- GPSLatitude: 69.696969,
37
- GPSLongitude: 69.696969,
36
+ GPSLatitude: 69.69,
37
+ GPSLongitude: 69.69,
38
38
  UserComment: 'Someone wrote GPS here!',
39
39
  }
40
40
 
41
41
  const result = await writeAsync(uri, newTags)
42
- console.log(result)
42
+ console.log(result.tags)
43
43
  ```
44
44
 
45
- 💡 Note: On IOS, writing exif into an Asset file will duplicate the image.
46
- Try to write to a local file first before saving!
45
+ See [example](example) for more detailed usage.
46
+
47
+ ℹ️ Note that on IOS, writing exif into an Asset file will duplicate the image. IOS does not allow writing exif into an Asset file directly.
48
+
49
+ If you're getting the photo from a [camera](https://github.com/mrousavy/react-native-vision-camera/), write it into the output file first before saving to the Asset library!
47
50
 
48
51
  ## Contributing
49
52
  Contributions are welcome!
@@ -87,9 +87,9 @@ def kotlin_version = getExtOrDefault("kotlinVersion")
87
87
  dependencies {
88
88
  // For < 0.71, this will be from the local maven repo
89
89
  // For > 0.71, this will be replaced by `com.facebook.react:react-android:$version` by react gradle plugin
90
- //noinspection GradleDynamicVersion
90
+ // noinspection GradleDynamicVersion
91
91
  implementation "com.facebook.react:react-native:+"
92
92
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
93
- implementation 'androidx.exifinterface:exifinterface:1.3.7'
93
+ implementation "androidx.exifinterface:exifinterface:1.3.7"
94
94
  }
95
95
 
@@ -80,7 +80,6 @@ class ExifyModule(reactContext: ReactApplicationContext) :
80
80
  }
81
81
 
82
82
  params.putString("uri", uri)
83
- params.putString("assetId", null)
84
83
  params.putMap("tags", formatTags(exif))
85
84
 
86
85
  exif.saveAttributes()
package/ios/Exify.swift CHANGED
@@ -11,14 +11,19 @@ import PhotosUI
11
11
 
12
12
  @objc(Exify)
13
13
  class Exify: NSObject {
14
-
15
- func readFromFile(uri: String, resolve: @escaping RCTPromiseResolveBlock) -> Void {
16
- let metadata = getMetadata(from: URL(string: uri))
17
- resolve(getExifTags(from: metadata))
14
+
15
+ func readExif(uri: String, resolve: @escaping RCTPromiseResolveBlock) -> Void {
16
+ guard let url = URL(string: uri) else {
17
+ resolve(nil)
18
+ return
19
+ }
20
+
21
+ readExifTags(from: url) { tags in
22
+ resolve(tags)
23
+ }
18
24
  }
19
25
 
20
- func readFromAsset(uri: String, resolve: @escaping RCTPromiseResolveBlock) -> Void {
21
- let assetId = String(uri[uri.index(uri.startIndex, offsetBy: 5)...])
26
+ func readExif(assetId: String, resolve: @escaping RCTPromiseResolveBlock) -> Void {
22
27
  guard let asset = getAssetBy(id: assetId) else {
23
28
  resolve(nil)
24
29
  return
@@ -33,13 +38,13 @@ class Exify: NSObject {
33
38
  return
34
39
  }
35
40
 
36
- let metadata = getMetadata(from: url)
37
- resolve(getExifTags(from: metadata))
41
+ readExifTags(from: url) { tags in
42
+ resolve(tags)
43
+ }
38
44
  }
39
45
  }
40
46
 
41
- func writeToAsset(uri: String, tags: [String: Any], resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
42
- let assetId = String(uri[uri.index(uri.startIndex, offsetBy: 5)...])
47
+ func writeExif(assetId: String, tags: [String: Any], resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
43
48
  guard let asset = getAssetBy(id: assetId) else {
44
49
  reject("Error", "Cannot retrieve asset.", nil)
45
50
  return
@@ -66,10 +71,10 @@ class Exify: NSObject {
66
71
  request.addResource(with: .photo, data: data, options: nil)
67
72
  request.creationDate = Date()
68
73
 
69
- let assetId = request.placeholderForCreatedAsset!.localIdentifier
74
+ let newAssetId = request.placeholderForCreatedAsset!.localIdentifier
70
75
  resolve([
71
- "uri": "ph://\(assetId)",
72
- "assetId": assetId,
76
+ "uri": "ph://\(newAssetId)",
77
+ "assetId": newAssetId,
73
78
  "tags": getExifTags(from: metadata),
74
79
  ])
75
80
 
@@ -82,7 +87,7 @@ class Exify: NSObject {
82
87
  }
83
88
  }
84
89
 
85
- func writeToLocal(uri: String, tags: [String: Any], resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
90
+ func writeExif(uri: String, tags: [String: Any], resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
86
91
  guard let url = URL(string: uri) else {
87
92
  reject("Error", "Invalid URL", nil)
88
93
  return
@@ -100,7 +105,6 @@ class Exify: NSObject {
100
105
 
101
106
  resolve([
102
107
  "uri": uri,
103
- "assetId": nil,
104
108
  "tags": getExifTags(from: metadata),
105
109
  ])
106
110
 
@@ -114,18 +118,20 @@ class Exify: NSObject {
114
118
  @objc(readAsync:withResolver:withRejecter:)
115
119
  func readAsync(uri: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
116
120
  if uri.starts(with: "ph://") {
117
- readFromAsset(uri: uri, resolve: resolve)
121
+ let assetId = String(uri[uri.index(uri.startIndex, offsetBy: 5)...])
122
+ readExif(assetId: assetId, resolve: resolve)
118
123
  } else {
119
- readFromFile(uri: uri, resolve: resolve)
124
+ readExif(uri: uri, resolve: resolve)
120
125
  }
121
126
  }
122
127
 
123
128
  @objc(writeAsync:withExif:withResolver:withRejecter:)
124
129
  func writeAsync(uri: String, tags: [String: Any], resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
125
130
  if uri.starts(with: "ph://") {
126
- writeToAsset(uri: uri, tags: tags, resolve: resolve, reject: reject)
131
+ let assetId = String(uri[uri.index(uri.startIndex, offsetBy: 5)...])
132
+ writeExif(assetId: assetId, tags: tags, resolve: resolve, reject: reject)
127
133
  } else {
128
- writeToLocal(uri: uri, tags: tags, resolve: resolve, reject: reject)
134
+ writeExif(uri: uri, tags: tags, resolve: resolve, reject: reject)
129
135
  }
130
136
  }
131
137
  }
@@ -61,17 +61,23 @@ func getExifTags(from metadata: NSDictionary) -> [String: Any] {
61
61
  return tags as! [String: Any]
62
62
  }
63
63
 
64
- func getMetadata(from url: URL?) -> NSMutableDictionary {
64
+ func readExifTags(from url: URL?, completionHandler: ([String: Any]?) -> Void) -> Void {
65
65
  guard let url, let sourceImage = CGImageSourceCreateWithURL(url as CFURL, nil),
66
66
  let metadataDict = CGImageSourceCopyPropertiesAtIndex(sourceImage, 0, nil) else {
67
- return [:]
67
+ return
68
68
  }
69
69
 
70
- return NSMutableDictionary(dictionary: metadataDict)
70
+ let tags = getExifTags(from: metadataDict)
71
+ completionHandler(tags)
71
72
  }
72
73
 
73
74
  func updateMetadata(url: URL, with tags: [String: Any], completionHanlder: (NSDictionary?, Data?) -> Void) -> Void {
74
- let metadata = getMetadata(from: url)
75
+ guard let cgImageSource = CGImageSourceCreateWithURL(url as CFURL, nil) else {
76
+ return
77
+ }
78
+
79
+ let metadataDict = CGImageSourceCopyPropertiesAtIndex(cgImageSource, 0, nil) ?? [:] as CFDictionary
80
+ let metadata = NSMutableDictionary(dictionary: metadataDict)
75
81
 
76
82
  // Append additional Exif data
77
83
  let exifDict = metadata[kCGImagePropertyExifDictionary as String] as? NSMutableDictionary
@@ -116,16 +122,14 @@ func updateMetadata(url: URL, with tags: [String: Any], completionHanlder: (NSDi
116
122
 
117
123
  let destinationData = NSMutableData()
118
124
 
119
- guard let uiImage = UIImage(contentsOfFile: url.path),
120
- let sourceData = uiImage.jpegData(compressionQuality: 1.0) as CFData?,
121
- let cgImageSource = CGImageSourceCreateWithData(sourceData, nil),
122
- let sourceType = CGImageSourceGetType(cgImageSource),
125
+ guard let sourceType = CGImageSourceGetType(cgImageSource),
123
126
  let destination = CGImageDestinationCreateWithData(destinationData, sourceType, 1, nil) else {
124
127
  return
125
128
  }
126
129
 
127
- CGImageDestinationAddImage(destination, uiImage.cgImage!, metadata)
130
+ CGImageDestinationAddImageFromSource(destination, cgImageSource, 0, metadata)
128
131
  if CGImageDestinationFinalize(destination) {
129
132
  completionHanlder(metadata, destinationData as Data)
130
133
  }
131
134
  }
135
+
@@ -1,5 +1,6 @@
1
1
  /**
2
2
  * From Android's ExifInterface Tags
3
+ * Normalized for both IOS and Android
3
4
  */
4
5
  export interface ExifTags {
5
6
  SensorLeftBorder?: number;
@@ -146,15 +147,20 @@ export interface ExifTags {
146
147
  export interface ExifyWriteResult {
147
148
  /**
148
149
  * The URI of the image that was written.
149
- * On IOS asset, this will be new URI created.
150
+ * On IOS: If input URI is an asset, this will be new URI created.
151
+ *
152
+ * This will return exactly the same as the input URI if the input URI is from a local file.
150
153
  */
151
- uri?: string;
154
+ uri: string;
152
155
  /**
153
- * Media Library Asset ID
156
+ * A newly created asset ID on IOS.
157
+ * Writing exif metadata into an asset file will create a new asset file.
158
+ *
159
+ * @platform ios
154
160
  */
155
- assetId?: string | null;
161
+ assetId?: string;
156
162
  /**
157
- * Raw EXIF data from the platform
163
+ * Normalized Exif tags
158
164
  */
159
165
  tags?: ExifTags;
160
166
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAA;IAClC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,2BAA2B,CAAC,EAAE,MAAM,CAAA;IACpC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,GAAG,EAAE,MAAM,CAAA;IACX;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAA;CAChB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lodev09/react-native-exify",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "Read and write exif data into an image.",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -94,7 +94,7 @@
94
94
  "workspaces": [
95
95
  "example"
96
96
  ],
97
- "packageManager": "yarn@3.6.1",
97
+ "packageManager": "yarn@4.1.1",
98
98
  "jest": {
99
99
  "preset": "react-native",
100
100
  "modulePathIgnorePatterns": [
@@ -116,7 +116,12 @@
116
116
  "publish": true
117
117
  },
118
118
  "github": {
119
- "release": true
119
+ "release": true,
120
+ "comments": {
121
+ "submit": true,
122
+ "issue": ":rocket: _This issue has been resolved in v${version}. See [${releaseName}](${releaseUrl}) for release notes._",
123
+ "pr": ":rocket: _This pull request is included in v${version}. See [${releaseName}](${releaseUrl}) for release notes._"
124
+ }
120
125
  },
121
126
  "plugins": {
122
127
  "@release-it/conventional-changelog": {
package/src/types.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  /**
2
2
  * From Android's ExifInterface Tags
3
+ * Normalized for both IOS and Android
3
4
  */
4
5
  export interface ExifTags {
5
6
  SensorLeftBorder?: number
@@ -147,15 +148,20 @@ export interface ExifTags {
147
148
  export interface ExifyWriteResult {
148
149
  /**
149
150
  * The URI of the image that was written.
150
- * On IOS asset, this will be new URI created.
151
+ * On IOS: If input URI is an asset, this will be new URI created.
152
+ *
153
+ * This will return exactly the same as the input URI if the input URI is from a local file.
151
154
  */
152
- uri?: string
155
+ uri: string
153
156
  /**
154
- * Media Library Asset ID
157
+ * A newly created asset ID on IOS.
158
+ * Writing exif metadata into an asset file will create a new asset file.
159
+ *
160
+ * @platform ios
155
161
  */
156
- assetId?: string | null
162
+ assetId?: string
157
163
  /**
158
- * Raw EXIF data from the platform
164
+ * Normalized Exif tags
159
165
  */
160
166
  tags?: ExifTags
161
167
  }