У меня есть приложение, использующее ARKit. До текущей сборки все активы были включены в сам пакет приложения, и у пользователей не возникало проблем с использованием приложения.
Однако я хотел включить в приложении Ресурс по требованию, чтобы ресурсы новых модулей (игр) можно было загрузить из AppStore, тем самым избегая большого размера приложения. Следуя документации iOS, я смог использовать ODR, и приложение отлично работало на моем устройстве. Он загружал ресурсы, используя ODR, как и должно.
Однако при загрузке в AppStore для обзора приложений я столкнулся с ошибкой:
Моя структура папок для конкретной папки SCNAssets (которая помечена) приведена ниже:
Обратите внимание, что приложение отлично работает с ODR на моем устройстве. Я сделал следующее и пытался несколько раз, но безрезультатно.
- Создание чистой сборки.
- Изменение версии/сборки.
- Убедитесь, что ODR включен в настройках сборки и т. Д. - все гигиенические шаги. И все это XCode, нет платформы, которую я использую (например, Xamarin и т. Д.)
- Использование существующих решений, связанных с SO.
Apple не так много документации по вопросам, связанным с загрузкой в AppStore приложений с поддержкой ODR. Мне интересно, могут ли в папке с тегами ресурсов быть и другие папки или нет, так как моя структура папок прямо сейчас - не уверен, может ли это быть причиной, поскольку прикрепленная ошибка указывает на все папки в моей структуре папок .
Буду очень признателен за помощь. На данный момент я отказываюсь от ODR и строю без него, однако это не может продолжаться долго. Примечание. Активами являются все файлы scn, системы частиц scn и изображения.
Код для доступа к ODR приведен ниже (кратко), однако, если код работает с моим устройством, он должен работать и в других местах. Я думаю, что проблема может быть связана с расположением папок.
Менеджер ODR:
class ODRManager {
static let shared = ODRManager()
var currentRequest: NSBundleResourceRequest?
var currentProgressFractionCompleted: Double?
func requestSceneWith(tag: String, onSuccess: @escaping () -> Void, onFailure: @escaping (NSError) -> Void) {
currentRequest = NSBundleResourceRequest(tags: [tag])
guard let request = currentRequest else { return }
request.beginAccessingResources { (error: Error?) in
if let error = error {
onFailure(error as NSError)
return
}
onSuccess()
}
}
}
Доступ к ODR в ViewController
// tagName is the name of the tag on the ODR related scnassets folder.
ODRManager.shared.requestSceneWith(tag: tagName, onSuccess: {
DispatchQueue.main.async {
self.game = self.gameFactory.createGame(...)
}, onFailure: { (error) in
self.threeSurfaceLabel.text = "Problem with downloading content. Make sure internet connection is working, and restart."
})