@@ -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