V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
2232588429
V2EX  ›  iOS

ios 在不同 app 之间分享文件会不会增加设备占用空间?

  •  
  •   2232588429 · 2024-05-04 11:22:07 +08:00 via iPhone · 2570 次点击
    这是一个创建于 416 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如我已经在一款读书软件里打开了一个图书文件,把它分享到另一个读书软件里打开,设备的总空间占用会增加吗?

    20 条回复    2024-05-06 00:12:31 +08:00
    beimenjun
        1
    beimenjun  
    PRO
       2024-05-04 11:23:51 +08:00   ❤️ 3
    一般情况下会增加,因为这相当于文件从一个 App 的沙盒,传到了另外一个 App 的沙盒里。
    SenLief
        2
    SenLief  
       2024-05-04 11:29:13 +08:00
    应该是会的
    1145148964
        3
    1145148964  
       2024-05-04 11:41:40 +08:00
    即使是一楼说的情况。我记得 ios 存储系统是有去重的
    beimenjun
        4
    beimenjun  
    PRO
       2024-05-04 11:43:32 +08:00
    @1145148964 系统不会管你沙盒里两份文件是不是一样的。不存在什么去重。
    zhigang1992
        5
    zhigang1992  
       2024-05-04 11:43:57 +08:00
    APFS 在文件系统层级 Copy-on-Write 。 是不会占用更多空间的,只有在修改文件内容的时候会 Duplicate 一份再修改
    dadadadaadada
        6
    dadadadaadada  
       2024-05-04 11:47:56 +08:00 via iPhone
    同疑惑,因为删掉一个 app 里的文件,对另一个 app 无影响
    dilidilid
        7
    dilidilid  
       2024-05-04 11:48:50 +08:00 via iPhone
    beimenjun 的说法是错误的,APFS 作为 CoW 文件系统支持 copy by reflink ,这跟去重是两码事。如果从外部往 APFS 里复制两个一样的文件 APFS 是不会自动触发去重的所以会增加占用,但在 APFS 里内部复制是不会增加空间占用的,即使后续有修改操作也只增加修改部分的体积,这个 feature 是在引入 APFS 的时候专门强调的优点
    dilidilid
        8
    dilidilid  
       2024-05-04 11:51:15 +08:00 via iPhone   ❤️ 1
    @zhigang1992 修改文件内容只会增加 modified content 对应的 block ,并不会整个文件 duplicate
    ProvinceV
        9
    ProvinceV  
       2024-05-04 11:57:23 +08:00
    APFS ( macOS 、iOS 等 Apple 设备使用的文件系统)支持 Clones 和拆分编码(增量编码,Delta encoding )。

    > Clones allow the operating system to make efficient file copies on the same volume without occupying additional storage space. Changes to a cloned file are saved as delta extents, reducing storage space required for document revisions and copies.
    https://en.wikipedia.org/wiki/Apple_File_System
    hheng101
        10
    hheng101  
       2024-05-04 11:58:46 +08:00
    我记得 APFS 和 iOS 的内存管理有点像,有类似的引用计数功能来去重
    dooogle
        11
    dooogle  
       2024-05-04 11:58:55 +08:00 via iPhone   ❤️ 3
    微信:我不管,我就复制多一份
    beimenjun
        12
    beimenjun  
    PRO
       2024-05-04 12:08:08 +08:00
    @zhigang1992 @dilidilid 作为 iOS App 开发,稍微解释一下我的看法吧。

    当文件通过分享过来的时候,使用 AppDelegate/SceneDelegate 来管理周期的 iOS 应用,使用的是类似 application(_:open:options:) 方法来响应,这一步系统会传来一个 url ,然后接收方可以通过这个 URL 来读取文件的 Data 。

    但是在 OP 举的这个例子里,市面上正常点的 PDF 阅读器,都会把 Data 保存为 PDF 格式到自己的沙盒里。除非有谁写了接收 PDF 分享过来,但是不做持久化保存,只存在内存里。

    所以一般情况下会增加。

    ---------------

    这个问题还可以延展出来,比如开发者也许可以保存系统提供 URL 到数据库里,以供下次使用?我个人是不建议。因为这个 URL 可能系统重启了就没了。
    0TSH60F7J2rVkg8t
        13
    0TSH60F7J2rVkg8t  
       2024-05-04 12:15:05 +08:00
    @dooogle 可不止多一份
    chengYT
        14
    chengYT  
       2024-05-04 13:11:57 +08:00
    不会,iOS10 引入了 apfs 解决了你说的这个问题,你可以试一下 iOS9 的老机器分享个大文件去 QQ 或者微信,再弹出分享界面之前是要有一段时间没反应的,就是在复制文件,iOS10 之后就不需要了
    lixuehan123
        15
    lixuehan123  
       2024-05-04 20:06:51 +08:00 via iPhone
    删除的时候呢?还保留了一份啊
    AceRacer
        16
    AceRacer  
       2024-05-05 05:30:11 +08:00 via Android
    @beimenjun 你这 iOS 开发技术不过关呀,是两个相同的文件,但是只占一份存储空间 https://sspai.com/post/38377
    beimenjun
        17
    beimenjun  
    PRO
       2024-05-05 11:31:28 +08:00
    @AceRacer 自己看代码去调试吧……

    https://github.com/zizicici/Duplicator
    beimenjun
        18
    beimenjun  
    PRO
       2024-05-05 11:43:54 +08:00   ❤️ 1
    @chengYT @hheng101 @dilidilid @zhigang1992 @AceRacer @1145148964

    请到 https://github.com/zizicici/Duplicator 里自取代码,跑一下测试一下。看看你们说的是不是正确的。

    -------------------

    所谓 iOS 10.3 blabla APFS blabla 的,其实对于这个场景是不奏效的。

    你们说的场景可能在一个沙盒内部的某些情况会奏效,但是对于通过系统控件 Sharing 到另外一个 App 是没有用的。

    大概的流程是 iOS 系统把分享的文件先投递到 Receiver 的 Documents/Inbox 处,这时候文件已经进入 Receiver 的沙盒里了,然后 Receiver 在 `scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>)` 处进行处理。

    甚至 Receiver 这一步处理中,你选择将 URL 里的 data 直接读取再转存,会再增加数据的体积。

    ---------------------

    另外因为每个 Documents/Inbox 是有可能因为空间不够,被系统删除。所以正常靠谱点的 App ,如果有需要会将 Inbox 里的文件挪到自己沙盒里设计好的位置。

    ---------------------

    附录:

    测试内容:

    我这边用了一个 1.53 G 的文件测试。

    在分享前:

    Sender 占用体积 1.54G ,Receiver 占用体积 300K 。
    iOS 可用空间比之前少了 1.5G 左右,符合两个应用加起来的体积。

    在分享后:

    Sender 占用体积 1.54G ,Receiver 占用体积 1.53G 。
    iOS 可用空间比之前少了 3.1G 左右,符合两个应用加起来的体积。
    AceRacer
        19
    AceRacer  
       2024-05-06 00:01:31 +08:00 via Android
    @beimenjun 你是正确的,这些科技自媒体乱写文章误导人,mac 端还有 iPhone 自带的一些应用内部是共用的,三方 app 直接还是独立的拷贝,你是专业的 iOSer
    voidless
        20
    voidless  
       2024-05-06 00:12:31 +08:00
    @beimenjun 支持你,很多人空对空分析一大堆,和实际情况具体场景相差十万八千里
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2485 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 15:43 · PVG 23:43 · LAX 08:43 · JFK 11:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.