Skip to content

Commit ce7431c

Browse files
zhmmfazekas
authored andcommitted
Fix file:// URLs on iOS so expo-asset works
1 parent d434b05 commit ce7431c

File tree

1 file changed

+34
-10
lines changed

1 file changed

+34
-10
lines changed

ios/RiveReactNativeView.swift

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ class RiveReactNativeView: RCTView, RivePlayerDelegate, RiveStateMachineDelegate
236236
case .empty:
237237
return "empty"
238238
case .none:
239-
return "none"
239+
return "none"
240240
}
241241
}()
242242
error.message = "Failed to create data binding instance with config: \(configDescription)"
@@ -346,7 +346,7 @@ class RiveReactNativeView: RCTView, RivePlayerDelegate, RiveStateMachineDelegate
346346
}
347347
resourceName = nil
348348
resourceFromBundle = false
349-
downloadUrlAsset(url: url) { [weak self] data in
349+
loadUrlAsset(url: url) { [weak self] data in
350350
guard let self = self else { return }
351351
guard !data.isEmpty else {
352352
handleRiveError(error: createIncorrectRiveURL(url))
@@ -472,13 +472,13 @@ class RiveReactNativeView: RCTView, RivePlayerDelegate, RiveStateMachineDelegate
472472
return
473473
}
474474

475-
downloadUrlAsset(url: sourceAssetId) { [weak self] data in
475+
loadUrlAsset(url: sourceAssetId) { [weak self] data in
476476
self?.processAssetBytes(data, asset: asset, factory: factory)
477477
}
478478
}
479479

480480
private func handleSourceUrl(_ sourceUrl: String, asset: RiveFileAsset, factory: RiveFactory) {
481-
downloadUrlAsset(url: sourceUrl) { [weak self] data in
481+
loadUrlAsset(url: sourceUrl) { [weak self] data in
482482
self?.processAssetBytes(data, asset: asset, factory: factory)
483483
}
484484
}
@@ -516,33 +516,57 @@ class RiveReactNativeView: RCTView, RivePlayerDelegate, RiveStateMachineDelegate
516516
}
517517
}
518518

519-
private func downloadUrlAsset(url: String, listener: @escaping (Data) -> Void) {
519+
private func loadUrlAsset(url: String, listener: @escaping (Data) -> Void) {
520520
guard isValidUrl(url) else {
521521
handleInvalidUrlError(url: url)
522522
return
523523
}
524524

525-
let queue = URLSession.shared
526-
guard let requestUrl = URL(string: url) else {
525+
guard let assetUrl = URL(string: url) else {
527526
handleInvalidUrlError(url: url)
528527
return
529528
}
530529

531-
let request = URLRequest(url: requestUrl)
530+
if assetUrl.isFileURL {
531+
loadFileUrlAsset(url: assetUrl, listener: listener)
532+
} else {
533+
loadRemoteUrlAsset(url: assetUrl, listener: listener)
534+
}
535+
}
536+
537+
private func loadFileUrlAsset(url: URL, listener: @escaping (Data) -> Void) {
538+
DispatchQueue.global(qos: .background).async { [weak self] in
539+
do {
540+
let fileData = try Data(contentsOf: url)
541+
DispatchQueue.main.async {
542+
listener(fileData)
543+
}
544+
} catch {
545+
DispatchQueue.main.async {
546+
self?.handleInvalidUrlError(url: url.absoluteString)
547+
}
548+
}
549+
}
550+
}
551+
552+
private func loadRemoteUrlAsset(url: URL, listener: @escaping (Data) -> Void) {
553+
let queue = URLSession.shared
554+
let request = URLRequest(url: url)
532555
let task = queue.dataTask(with: request) {[weak self] data, response, error in
533556
if error != nil {
534-
self?.handleInvalidUrlError(url: url)
557+
self?.handleInvalidUrlError(url: url.absoluteString)
535558
} else if let data = data {
536559
listener(data)
537560
}
538561
}
539562

540563
task.resume()
541564
}
565+
542566

543567
private func isValidUrl(_ url: String) -> Bool {
544568
if let url = URL(string: url) {
545-
return UIApplication.shared.canOpenURL(url)
569+
return url.isFileURL || UIApplication.shared.canOpenURL(url)
546570
} else {
547571
return false
548572
}

0 commit comments

Comments
 (0)