Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 34 additions & 10 deletions ios/RiveReactNativeView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ class RiveReactNativeView: RCTView, RivePlayerDelegate, RiveStateMachineDelegate
case .empty:
return "empty"
case .none:
return "none"
return "none"
}
}()
error.message = "Failed to create data binding instance with config: \(configDescription)"
Expand Down Expand Up @@ -346,7 +346,7 @@ class RiveReactNativeView: RCTView, RivePlayerDelegate, RiveStateMachineDelegate
}
resourceName = nil
resourceFromBundle = false
downloadUrlAsset(url: url) { [weak self] data in
loadUrlAsset(url: url) { [weak self] data in
guard let self = self else { return }
guard !data.isEmpty else {
handleRiveError(error: createIncorrectRiveURL(url))
Expand Down Expand Up @@ -472,13 +472,13 @@ class RiveReactNativeView: RCTView, RivePlayerDelegate, RiveStateMachineDelegate
return
}

downloadUrlAsset(url: sourceAssetId) { [weak self] data in
loadUrlAsset(url: sourceAssetId) { [weak self] data in
self?.processAssetBytes(data, asset: asset, factory: factory)
}
}

private func handleSourceUrl(_ sourceUrl: String, asset: RiveFileAsset, factory: RiveFactory) {
downloadUrlAsset(url: sourceUrl) { [weak self] data in
loadUrlAsset(url: sourceUrl) { [weak self] data in
self?.processAssetBytes(data, asset: asset, factory: factory)
}
}
Expand Down Expand Up @@ -516,33 +516,57 @@ class RiveReactNativeView: RCTView, RivePlayerDelegate, RiveStateMachineDelegate
}
}

private func downloadUrlAsset(url: String, listener: @escaping (Data) -> Void) {
private func loadUrlAsset(url: String, listener: @escaping (Data) -> Void) {
guard isValidUrl(url) else {
handleInvalidUrlError(url: url)
return
}

let queue = URLSession.shared
guard let requestUrl = URL(string: url) else {
guard let assetUrl = URL(string: url) else {
handleInvalidUrlError(url: url)
return
}

let request = URLRequest(url: requestUrl)
if assetUrl.isFileURL {
loadFileUrlAsset(url: assetUrl, listener: listener)
} else {
loadRemoteUrlAsset(url: assetUrl, listener: listener)
}
}

private func loadFileUrlAsset(url: URL, listener: @escaping (Data) -> Void) {
DispatchQueue.global(qos: .background).async { [weak self] in
do {
let fileData = try Data(contentsOf: url)
DispatchQueue.main.async {
listener(fileData)
}
} catch {
DispatchQueue.main.async {
self?.handleInvalidUrlError(url: url.absoluteString)
}
}
}
}

private func loadRemoteUrlAsset(url: URL, listener: @escaping (Data) -> Void) {
let queue = URLSession.shared
let request = URLRequest(url: url)
let task = queue.dataTask(with: request) {[weak self] data, response, error in
if error != nil {
self?.handleInvalidUrlError(url: url)
self?.handleInvalidUrlError(url: url.absoluteString)
} else if let data = data {
listener(data)
}
}

task.resume()
}


private func isValidUrl(_ url: String) -> Bool {
if let url = URL(string: url) {
return UIApplication.shared.canOpenURL(url)
return url.isFileURL || UIApplication.shared.canOpenURL(url)
} else {
return false
}
Expand Down