У меня есть приложение, которое использует некоторые известные большие форматы файлов и поддерживает функцию «Открыть в ...» в iOS со времен iOS4.
До недавнего времени все работало нормально, некоторые приложения, такие каквстроенное в iOS почтовое приложение для iOS откроет приложение, сделав копию в каталоге ~ / Documents / Inbox внутри моего приложения, и жизнь будет хорошей.
Недавно мне стало известно о том, что "Open In... "больше не работает для моего приложения, по крайней мере, когда файлы приходят из iCloud / Dropbox / GoogleDrive через встроенное приложение Files iOS11 +, и мне интересно, что я что-то упустил.
После проверки кода я начинаю думать, что мне, должно быть, не хватает чего-то действительно очевидного, потому что код, по-видимому, правильный, чтобы не открывал файлы, поскольку указанные пути либо недействительны, либо мое приложение не имеетнеобходимые разрешения для их чтения.
Это мой код:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)urlToOpen sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
if([urlToOpen isFileURL]) // <<< this goes through
{
if([[NSFileManager defaultManager] isReadableFileAtPath:urlToOpen.path])
{
// <<< this doesn't
}
}
}
Пример рабочих путей:
/private/var/mobile/Containers/Data/Application/F99A3EA4-457C-4043-AEB3-A9D961184360/Documents/plane.obj
/private/var/mobile/Containers/Data/Application/F99A3EA4-457C-4043-AEB3-A9D961184360/Documents/Inbox/cube.obj
Примеры путей, которые не работают:
/private/var/mobile/Library/Mobile Documents/com~apple~CloudDocs/somedir/somefile.ext
/private/var/mobile/Containers/Shared/AppGroup/A7FA40A0-2C7D-4FC1-BF21-A8E88B106FF9/File Provider Storage/7791941/local-storage/L3dzX3JhZmFfemFiYWxhL2Jhc2VvcmNfbWVzaC5vYmo=/somefile.ext
Как уВы можете видеть, что оба файла, которые работали, скопировали свои данные в мой локальный каталог приложений на устройстве.
Как я могу открыть эти файлы?Обратите внимание, что я упомянул, что приложение использует большие файлы, потому что оно делает, поэтому я не могу получить их копию в памяти, это не очень поможет, мне нужно найти путь к файлу, чтобы я мог сделать отображение памятии загружаю то, что нужно в нужное время.
Я немного читал об открытых на месте и т. д., но это не относится к типу приложения, которое я разрабатываю, так как оно не работает на одном«элемент» больших файлов, о которых я упоминаю, является лишь одним из возможных источников, и поэтому такие вещи, как то, что я видел в отношении открытия на месте, не применимы к моему делу.
Есть ли способзаставить приложение иметь доступ к этим файлам напрямую или, по крайней мере, скопировать их во временную директорию с изолированными программными приложениями, чтобы я мог напрямую отобразить их в памяти?
Ура!