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

iPad 上的欧路词典是怎么做到实时监听剪贴板的

  •  
  •   acoldfox · 144 天前 · 2387 次点击
    这是一个创建于 144 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近用 iPad 装了欧路词典,发现了几个问题

    1. 我在没开启欧路词典剪贴板取词的情况下,在别的 app 里复制文字之后,欧路词典会提示是否粘贴

    2. 在同时打开欧路和 marginNote 的情况下,我在 margninNote 里复制了文字,欧路词典就能监听到了我做了复制操作,立马提示是否要粘贴,测试了下,欧路并不是做轮询读取剪贴板的操作,因为如果轮询读取剪贴板,会不断提示“欧路词典读取了你的剪贴板”,只是当我在复制操作完成之后,才会发起读取剪贴板的操作

    3. 还有更神奇的是,我在 Mac 或者其他苹果设备上做了复制操作,欧路词典不受任何权限限制,马上就能获取到复制的内容,即使我去设置里将“从其他 App 粘贴”设为拒绝的情况下,欧路词典丝毫不影响,不会弹出任何需要允许复制的提示,直接就能实时获取到我在其他苹果设备上复制的文字

    当然对于有些人来说这个功能很方便,但我觉得用户在没开启剪贴板取词的情况下,你就默认要读取剪贴板了,而且在我拒绝了“从其他 App 粘贴”下,还能不受限制的获取其他苹果设备上复制的数据。
    15 条回复    2024-08-05 16:53:02 +08:00
    zktsin
        1
    zktsin  
       144 天前 via iPhone
    第三点,是不是你手动粘贴的,用户主动粘贴是不受权限影响的
    acoldfox
        2
    acoldfox  
    OP
       144 天前
    @zktsin 没有手动粘贴,只要在其他设备上复制文字,ipad 上的欧路词典立刻就有反应了
    lukeluke
        3
    lukeluke  
       144 天前   ❤️ 1
    1. 系统剪切板内部有一个标记位叫 changeCount ,一旦内容发生变化,这个标记位就会增加。
    2. 剪切板内容变化的时候会给应用发通知,应用收到通知后再看看 changeCount 有没有变化。如果变化了,说明有新的内容了,就可以尝试读取剪切板;如果没变化,就不处理。
    3. 应用每次回到前台后,也可以根据 changeCount 查看剪切板是否变化过。
    上面几条应该能解释 OP 的 1 2 问题。第 3 个问题,如果是用户主动点击粘贴的话,是不会请求读取权限的;如果用户没有点击粘贴,欧路还能获取剪切板内容,那就说不通了…
    acoldfox
        4
    acoldfox  
    OP
       144 天前
    @lukeluke 感谢解答,第三条不是用户主动粘贴的,只要在其他苹果设备上复制了文字就会触发。即使我把“从其他 App 粘贴”设为“拒绝”了,还是会自动读取,而且不会有任何提示,如果我没有关欧路词典,我在其他设备上复制的所有文字,欧路词典都能知道
    zktsin
        5
    zktsin  
       144 天前
    @acoldfox 第三点,如果只是有反应,可以监听系统发的 UIPasteboardChangedNotification 通知来实现,但不授权还是获取不到剪贴板的内容。
    noahhhh
        6
    noahhhh  
       144 天前 via Android
    其他设备上装欧路词典了吗,欧路词典是支持 macOS 和 iOS 的“接力”功能的,dock 栏会和 Safari 一样弹出图标,macOS 应该没剪切板权限的。
    dingwen07
        7
    dingwen07  
       144 天前
    没有手动允许或者在设置里始终允许的话,App 应该是读不到的
    acoldfox
        8
    acoldfox  
    OP
       144 天前
    @noahhhh 我刚刚也怀疑是接力功能,所以我把其他设备上的欧路词典都退出了,也确保后台没有欧路词典在运行,只保留 iPad 的欧路词典打开,但是依然能读取到我在其他设备上复制的内容
    acoldfox
        9
    acoldfox  
    OP
       144 天前
    @zktsin UIPasteboardChangedNotification 这个好像只能对应用内的剪贴板内容变化进行通知吧,应用外的对剪贴板的改变应该是收不到通知的
    987N
        10
    987N  
       144 天前
    @acoldfox #9 只要 App 没被杀,都会收到通知的
    zktsin
        11
    zktsin  
       144 天前 via iPhone   ❤️ 1
    @acoldfox 试了一下确实收不到通知,欧路词典是在轮训 changeCount 判断剪贴板变化的
    DogeFlyKite
        12
    DogeFlyKite  
       143 天前
    iOS 的剪贴板有个 hasStrings 属性,可以用来判断剪贴板里是否有文本内容,调用这个 hasStrings 不会弹框询问用户是否允许。
    另外,苹果从 iOS 14 开始提供了一些新的 API ,可以用来判断剪贴板内是否有符合条件的内容。

    所以我有个猜测:
    首先就是对于 iOS 14 以下的设备就无所谓了,直接读剪贴板,反正也没有弹框询问。
    对于 iOS 14 以上的设备,会先判断是否有文本内容,如果有的话再取剪贴板内容(此时 iOS 会弹框询问),如果取到了,就把这个内容记下来,然后切到其他 app 再切回来的时候,还是先判断是否有文本内容,如果有文本内容,就调用 detectPatterns 去判断当前剪贴板的内容跟 app 内记录的内容是否一致,如果一致就不做任何操作,不一致则取剪贴板的内容(此时 iOS 会弹框询问)。
    acoldfox
        13
    acoldfox  
    OP
       142 天前
    @DogeFlyKite 感谢回复,现在主要是第三条不知道欧路词典怎么做到,我在其他苹果设备上复制的内容可以实时获取到,并且没有任何弹窗提示,即使我把欧路词典的“从其他 app 读取粘贴”的权限关闭之后依然不受影响。(所有苹果设备的系统版本都是当前最新的)
    noahhhh
        14
    noahhhh  
       142 天前
    我试了下没复现,系统版本都是最新开发者
    DogeFlyKite
        15
    DogeFlyKite  
       140 天前   ❤️ 1
    @acoldfox 第三条我也试了一下,复现了,但是 kill 掉欧路词典重新进入之后就没有复现了,猜测这个应该算是苹果的 bug ,楼上说系统版本都是最新开发者(应该是开发者预览版)没有复现,可能在 iOS 18 上修复了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3252 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 12:31 · PVG 20:31 · LAX 04:31 · JFK 07:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.