Flutter:从 iCloud-Backup 中排除目录

Posted

技术标签:

【中文标题】Flutter:从 iCloud-Backup 中排除目录【英文标题】:Flutter: Exclude directory from iCloud-Backup 【发布时间】:2020-07-05 05:57:30 【问题描述】:

我正在编写一个颤振应用程序。这个应用程序将包含图像、音频和视频文件。即使应用程序离线,这些文件也应该可用。这些文件可以从服务器下载,或通过 USB 连接手动放置在应用程序的文档目录 (ios) 或外部目录 (android) 中。此外,Json 文件将为应用程序提供有关如何处理这些媒体文件的信息。目录结构如下所示:

AppContent
-> info.json
-> Audio folder
->-> Files...
-> Video folder
->-> Files...
-> Pictures folder
->-> Files...

根据 apple.developers,此类文件不应由 icloud 备份。在此应用程序中也不需要这样做。 JSON 文件仅包含有关媒体文件的信息,不包含用户数据。 https://developer.apple.com/icloud/documentation/data-storage/index.html

本教程展示了如何从 iCloud 备份中排除文件夹:https://developer.apple.com/library/archive/qa/qa1719/_index.html

在 Flutter 中是否有一种简单的方法来实现这一点?还是必须调用原生的ios函数?

【问题讨论】:

您好!您是新来的,所以您可能不熟悉 Stack Overflow 的指南。这并不意味着您可以通过索取东西来索取完整代码。但是,一旦您在编写代码时遇到问题,请告诉我们,我们将很乐意提供帮助。有关如何提问的提示,请参阅 here 和 here。谢谢! 【参考方案1】:

我通过这样做在我的应用的 Documents 文件夹中禁用了 iCloud Backup:

    将以下函数添加到ios/Runner/AppDelegate.swift
private func setExcludeFromiCloudBackup(isExcluded: Bool) throws 
    var fileOrDirectoryURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
    var values = URLResourceValues()
    values.isExcludedFromBackup = isExcluded
    try fileOrDirectoryURL.setResourceValues(values)

    application()函数中调用它:
    GeneratedPluginRegistrant.register(with: self)
      
    // Exclude the documents folder from iCloud backup.
    try! setExcludeFromiCloudBackup(isExcluded: true)
    
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)

您的AppDelegate.swift 应该如下所示:

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate 
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool 
    GeneratedPluginRegistrant.register(with: self)
      
    // Exclude the documents folder from iCloud backup.
    try! setExcludeFromiCloudBackup(isExcluded: true)
    
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  


private func setExcludeFromiCloudBackup(isExcluded: Bool) throws 
    var fileOrDirectoryURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
    var values = URLResourceValues()
    values.isExcludedFromBackup = isExcluded
    try fileOrDirectoryURL.setResourceValues(values)

请注意,没有进行错误检查,但我想不出它会失败的任何原因。我没有注意到运行该函数会导致任何额外的启动时间,这是有道理的,因为它只是在目录上设置一个属性。

【讨论】:

以上是关于Flutter:从 iCloud-Backup 中排除目录的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:如何使用 ffmpeg 从视频中读取数据

flutter - 如何在Dart/Flutter中将某些元素从一个Map复制到新Map中?

Flutter Firestore:从 Firestore 中检索数据并在 Flutter 中显示为小部件

Flutter:无法从存储中读取密钥:无法恢复密钥

Flutter - 从资产中读取文本文件

Flutter:从 AppBar 中减去状态栏高度