iPad 上的欧路词典是怎么做到实时监听剪贴板的 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
acoldfox
V2EX    Apple

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

  •  
  •   acoldfox 2024-08-01 10:17:33 +08:00 2963 次点击
    这是一个创建于 438 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近用 iPad 装了欧路词典,发现了几个问题

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

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

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

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

    所以我有个猜测:
    首先就是对于 iOS 14 以下的设备就无所谓了,直接读剪贴板,反正也没有弹框询问。
    对于 iOS 14 以上的设备,会先判断是否有文本内容,如果有的话再取剪贴板内容(此时 iOS 会弹框询问),如果取到了,就把这个内容记下来,然后切到其他 app 再切回来的时候,还是先判断是否有文本内容,如果有文本内容,就调用 detectPatterns 去判断当前剪贴板的内容跟 app 内记录的内容是否一致,如果一致就不做任何操作,不一致则取剪贴板的内容(此时 iOS 会弹框询问)。
    acoldfox
        13
    acoldfox  
    OP
       2024-08-02 21:51:27 +08:00
    @DogeFlyKite 感谢回复,现在主要是第三条不知道欧路词典怎么做到,我在其他苹果设备上复制的内容可以实时获取到,并且没有任何弹窗提示,即使我把欧路词典的“从其他 app 读取粘贴”的权限关闭之后依然不受影响。(所有苹果设备的系统版本都是当前最新的)
    noahhhh
        14
    noahhhh  
       2024-08-02 23:10:44 +08:00
    我试了下没复现,系统版本都是最新开发者
    DogeFlyKite
        15
    DogeFlyKite  
       2024-08-05 16:53:02 +08:00   1
    @acoldfox 第三条我也试了一下,复现了,但是 kill 掉欧路词典重新进入之后就没有复现了,猜测这个应该算是苹果的 bug ,楼上说系统版本都是最新开发者(应该是开发者预览版)没有复现,可能在 iOS 18 上修复了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2540 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 46ms UTC 15:31 PVG 23:31 LAX 08:31 JFK 11:31
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86