1
zktsin 147 天前 via iPhone
第三点,是不是你手动粘贴的,用户主动粘贴是不受权限影响的
|
3
lukeluke 147 天前 1
1. 系统剪切板内部有一个标记位叫 changeCount ,一旦内容发生变化,这个标记位就会增加。
2. 剪切板内容变化的时候会给应用发通知,应用收到通知后再看看 changeCount 有没有变化。如果变化了,说明有新的内容了,就可以尝试读取剪切板;如果没变化,就不处理。 3. 应用每次回到前台后,也可以根据 changeCount 查看剪切板是否变化过。 上面几条应该能解释 OP 的 1 2 问题。第 3 个问题,如果是用户主动点击粘贴的话,是不会请求读取权限的;如果用户没有点击粘贴,欧路还能获取剪切板内容,那就说不通了… |
4
acoldfox OP @lukeluke 感谢解答,第三条不是用户主动粘贴的,只要在其他苹果设备上复制了文字就会触发。即使我把“从其他 App 粘贴”设为“拒绝”了,还是会自动读取,而且不会有任何提示,如果我没有关欧路词典,我在其他设备上复制的所有文字,欧路词典都能知道
|
5
zktsin 147 天前
@acoldfox 第三点,如果只是有反应,可以监听系统发的 UIPasteboardChangedNotification 通知来实现,但不授权还是获取不到剪贴板的内容。
|
6
noahhhh 147 天前 via Android
其他设备上装欧路词典了吗,欧路词典是支持 macOS 和 iOS 的“接力”功能的,dock 栏会和 Safari 一样弹出图标,macOS 应该没剪切板权限的。
|
7
dingwen07 147 天前
没有手动允许或者在设置里始终允许的话,App 应该是读不到的
|
8
acoldfox OP @noahhhh 我刚刚也怀疑是接力功能,所以我把其他设备上的欧路词典都退出了,也确保后台没有欧路词典在运行,只保留 iPad 的欧路词典打开,但是依然能读取到我在其他设备上复制的内容
|
9
acoldfox OP @zktsin UIPasteboardChangedNotification 这个好像只能对应用内的剪贴板内容变化进行通知吧,应用外的对剪贴板的改变应该是收不到通知的
|
12
DogeFlyKite 146 天前
iOS 的剪贴板有个 hasStrings 属性,可以用来判断剪贴板里是否有文本内容,调用这个 hasStrings 不会弹框询问用户是否允许。
另外,苹果从 iOS 14 开始提供了一些新的 API ,可以用来判断剪贴板内是否有符合条件的内容。 所以我有个猜测: 首先就是对于 iOS 14 以下的设备就无所谓了,直接读剪贴板,反正也没有弹框询问。 对于 iOS 14 以上的设备,会先判断是否有文本内容,如果有的话再取剪贴板内容(此时 iOS 会弹框询问),如果取到了,就把这个内容记下来,然后切到其他 app 再切回来的时候,还是先判断是否有文本内容,如果有文本内容,就调用 detectPatterns 去判断当前剪贴板的内容跟 app 内记录的内容是否一致,如果一致就不做任何操作,不一致则取剪贴板的内容(此时 iOS 会弹框询问)。 |
13
acoldfox OP @DogeFlyKite 感谢回复,现在主要是第三条不知道欧路词典怎么做到,我在其他苹果设备上复制的内容可以实时获取到,并且没有任何弹窗提示,即使我把欧路词典的“从其他 app 读取粘贴”的权限关闭之后依然不受影响。(所有苹果设备的系统版本都是当前最新的)
|
14
noahhhh 146 天前
我试了下没复现,系统版本都是最新开发者
|
15
DogeFlyKite 143 天前 1
@acoldfox 第三条我也试了一下,复现了,但是 kill 掉欧路词典重新进入之后就没有复现了,猜测这个应该算是苹果的 bug ,楼上说系统版本都是最新开发者(应该是开发者预览版)没有复现,可能在 iOS 18 上修复了
|