【问题标题】:Does an app have any minimum amount of disk space to itself?应用程序本身是否有任何最小的磁盘空间?
【发布时间】:2012-11-16 13:35:42
【问题描述】:

注意:我不是问是否有最大值,这个问题已经 之前问过,我问的是应用程序是否还有最低限度的预留空间。

我的应用从 Internet 下载内容包,我正在调查它在磁盘空间不足/没有磁盘空间的情况下应该如何表现。

包有一个时间元素,如果没有空间,那么应用程序可以自动删除旧内容,以便为新内容腾出空间。 (这些包可能会过期,因此在用户未明确删除它们的情况下将其删除是标准行为)。

但是,如果所有应用程序之间共享所有磁盘空间,并且某个其他应用程序已经吞噬了设备上的所有可用磁盘空间,以至于我的应用程序完全没有剩余空间,那么这将毫无意义。 这种情况是否可能,另一个应用程序可以消耗所有东西,而我的应用程序什么也没有?或者是否为每个应用预留了一些空间?

【问题讨论】:

    标签: ios


    【解决方案1】:

    应用程序可以使用的空间量没有限制。理论上,应用程序可以使用所有可用的磁盘空间。

    【讨论】:

    • 谢谢,但我的问题不是关于最大值,而是关于最小值。
    • 我已经通过消耗我的测试手机上的所有磁盘空间然后尝试使用我的应用程序保存一个 1 mb 的文件来测试它,但它失败了。事实上,看起来操作系统为自己保留了一点空间。
    【解决方案2】:

    AFAIK 没有实际限制。我一直在使用一个占用 1.6GB 的应用程序,并且没有遇到任何问题。本质上,您使用可用的东西,如果其他人刻薄并占据所有空间,那么您无能为力。一个好的策略可能是声明“我的应用程序将使用 512mb 的磁盘空间”或类似的东西,然后确保你永远不会超过这个值。这会让您放心,您的应用程序可以运行到上限。任何移动设备上的经验法则,永远不要假设你有足够的空间来存放任何东西,在写入磁盘时总是检查失败,并有一个处理它的策略。

    更进一步。如果你想保证你的应用总是有足够的空间。选择一个大小上限(比如 256 mb),然后在安装和首次运行您的应用程序时,创建占用大量磁盘空间的虚拟文件。然后,当您下载有用的数据时,将虚拟文件替换为有用的文件,以便您的应用程序始终使用原始保留空间量。

    我似乎也误解了这个问题。为您的应用程序保留的最小空间是从应用程序商店重新下载所占用的空间。而已。如果您只有 200mb 的免费空间并且您尝试下载 300mb 的应用程序,它不会让您。

    【讨论】:

    • “创建占用磁盘空间的虚拟文件” - 我很好奇,有没有人这样做并且应用通过了认证?
    • 好吧,苹果真的无法阻止你这样做。这与下载 1.6GB 图像的应用程序没有太大区别,其中 95% 的图像可能永远不会使用。您的应用程序实际上并没有破坏任何 HIGS,它几乎可以被视为一种良好的编程实践,因为您确保您的应用程序永远不会超过大多数应用程序不关心的上限。但是,我实际上并没有提交一个只占用空间来保留它的应用程序,所以我不能确定它是否会通过。
    • “好吧,苹果真的无法阻止你这样做。”就在这里。他们可以看到您这样做,然后阻止您的应用程序获得认证。我可以看到他们的论点是它浪费了带宽/电池/存储空间。我并不是说我不同意你的做法,我只是说这似乎会导致被拒绝。
    • 是的。如果我遇到这种情况,我的方法是为应用程序提供大量默认数据,向用户显示基本上毫无意义的信息,但被称为“样本数据”。然后应用程序将第一次运行时的样本数据替换为真实数据,并隐藏样本数据,但它仍然存在于磁盘上。这样苹果就不会有问题,因为它需要样本数据,但我仍然得到我的空间预订。另外我不应该这样说,苹果因一时兴起阻止应用程序而臭名昭著 XD
    • 如果“示例数据”是应用程序的一部分,您无法真正替换它。但是,是的,创建虚拟文件似乎是一个好主意,直​​到您考虑到有人永远不会再次启动您的应用程序来下载真实内容,而虚拟文件只是占用了他们的空间。
    【解决方案3】:

    在写入磁盘之前,您可以检查可用磁盘空间的数量并相应地提醒用户。

    -(uint64_t)getFreeDiskspacePrivate
    {
    uint64_t totalSpace = 0.0f;
    uint64_t totalFreeSpace = 0.0f;
    NSError *error = nil;  
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
    NSDictionary *dictionary = [[NSFileManager defaultManager] attributesOfFileSystemForPath:[paths lastObject] error: &error];  
    
    if (dictionary) {  
        NSNumber *fileSystemSizeInBytes = [dictionary objectForKey: NSFileSystemSize];  
        NSNumber *freeFileSystemSizeInBytes = [dictionary objectForKey:NSFileSystemFreeSize];
        totalSpace = [fileSystemSizeInBytes floatValue];
        totalFreeSpace = [freeFileSystemSizeInBytes floatValue];
        //NSLog(@"Memory Capacity of %llu MiB with %llu MiB Free memory available.", ((totalSpace/1024ll)/1024ll), ((totalFreeSpace/1024ll)/1024ll));
    } /*else {  
        NSLog(@"Error Obtaining System Memory Info: Domain = %@, Code = %@", [error domain], [error code]);  
    }  
    */
    return totalFreeSpace;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 2015-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      相关资源
      最近更新 更多