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

58 天前
 acoldfox
最近用 iPad 装了欧路词典,发现了几个问题

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

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

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

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

所以我有个猜测:
首先就是对于 iOS 14 以下的设备就无所谓了,直接读剪贴板,反正也没有弹框询问。
对于 iOS 14 以上的设备,会先判断是否有文本内容,如果有的话再取剪贴板内容(此时 iOS 会弹框询问),如果取到了,就把这个内容记下来,然后切到其他 app 再切回来的时候,还是先判断是否有文本内容,如果有文本内容,就调用 detectPatterns 去判断当前剪贴板的内容跟 app 内记录的内容是否一致,如果一致就不做任何操作,不一致则取剪贴板的内容(此时 iOS 会弹框询问)。
acoldfox
56 天前
@DogeFlyKite 感谢回复,现在主要是第三条不知道欧路词典怎么做到,我在其他苹果设备上复制的内容可以实时获取到,并且没有任何弹窗提示,即使我把欧路词典的“从其他 app 读取粘贴”的权限关闭之后依然不受影响。(所有苹果设备的系统版本都是当前最新的)
noahhhh
56 天前
我试了下没复现,系统版本都是最新开发者
DogeFlyKite
54 天前
@acoldfox 第三条我也试了一下,复现了,但是 kill 掉欧路词典重新进入之后就没有复现了,猜测这个应该算是苹果的 bug ,楼上说系统版本都是最新开发者(应该是开发者预览版)没有复现,可能在 iOS 18 上修复了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1061651

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX