Как удалить файлы в расширении службы уведомлений iOS? - PullRequest
0 голосов
/ 29 марта 2019

У меня есть UNNotificationServiceExtension, который загружает видео и изображения в каталог Documents для использования классами, которые принимают UNNotificationContentExtension.Я хочу удалить мультимедийные файлы, которые больше не используются никакими уведомлениями.Я не уверен, как это сделать.

  • Я пытался удалить файлы в моем AppDelegate, но я считаю, что UNNotificationServiceExtension имеет свой собственный каталог Documents в соответствии с «Обмен данными сРаздел «Содержащее приложение» этого документа: https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html,, поэтому я не могу получить доступ к этим файлам из своего основного приложения.Они находятся в другом контейнере.
  • Я не хочу создавать группу приложений для обмена данными между приложением и расширением, чтобы я мог удалить неиспользуемые файлы.
  • Iя не хочу удалять неиспользуемые файлы в UNNotificationServiceExtension, потому что расширение имеет ограниченное время для завершения своей работы, и если я попытаюсь загрузить файлы и удалить другие файлы, это может привести к превышению времени ожидания.

Я думаю, что лучший вариант - это проверить, какие файлы нужны для любых доставляемых уведомлений, и удалить ненужные файлы в каталоге Documents расширения службы уведомлений.Меня беспокоит это то, что UNNotificationServiceExtension дается только короткий период времени, в течение которого он должен завершить всю свою работу, после чего он истекает.

Итак, мой вопрос: «Этоправильный способ очистки неиспользуемых файлов из расширения службы уведомлений или есть лучший способ? "

1 Ответ

0 голосов
/ 03 апреля 2019

Благодаря manishsharma93 мне удалось реализовать хорошее решение.Сейчас я храню файлы в каталоге, который используется главным приложением и расширением службы уведомлений.Сначала мне нужно было настроить общую группу приложений, используя информацию, найденную здесь: https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/EnablingAppSandbox.html#//apple_ref/doc/uid/TP40011195-CH4-SW19

Затем в свой AppDelegate я добавил эту приватную функцию, которую я вызываю в конце метода applicationDidFinishLaunching(_:):

// I call this at the end of the AppDelegate.applicationDidFinishLaunching(_:) method
private func clearNotificationMedia() {
    // Check to see if there are any delivered notifications. If there are, don't delete the media yet,
    // because the notifications may be using them. If you wanted to be more fine-grained here,
    // you could individually check to see which files the notifications are using, and delete everything else.
    UNUserNotificationCenter.current().getDeliveredNotifications { (notifications) in
        guard notifications.isEmpty else { return }

        let fileManager = FileManager.default

        guard let mediaCacheUrl = fileManager.containerURL(forSecurityApplicationGroupIdentifier: "group.com.yourGroupHere")?.appendingPathComponent("media_cache", isDirectory: true) else { return }

        // Check to see if the directory exists. If it doesn't, we have nothing to do here.
        var isDirectory: ObjCBool = false
        let directoryExists = FileManager.default.fileExists(atPath: mediaCacheUrl.path, isDirectory: &isDirectory)
        guard directoryExists && isDirectory.boolValue else {
            print("No media_cache directory to delete.", terminator: "\n")
            return
        }

        // The directory exists and there aren't any notifications using media stored there,
        // so go ahead and delete it. Use a lock to make sure that there isn't data corruption,
        // since the directory is shared.
        let lock = NSLock()
        lock.lock()
        do {
            try FileManager.default.removeItem(at: mediaCacheUrl)
            DebugLog("Successfully deleted media_cache directory.")
        } catch let error as NSError {
            DebugLog("Error: \(error.localizedDescription). Failed to delete media_cache directory.")
        }
        lock.unlock()
    }
}

Работает как шарм.Еще раз спасибо за указание мне в правильном направлении manishsharma93.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...