跳过主要内容
@capgo/capacitor-textinteraction UI & 系统 开源

文本交互 Capacitor 插件

Turn text selection and the iOS magnifier lens off in the Capacitor WebView when your app should feel native, then turn it back on before the user needs to type.

  • iOS · 支持 (iOS 14.5+)
  • Android · 不支持 (resolves success: false)
  • Web · 不支持 (throws unimplemented)

安装

bun add @capgo/capacitor-textinteraction bunx cap sync
npm, pnpm 或 yarn
  • npm install @capgo/capacitor-textinteraction
  • pnpm add @capgo/capacitor-textinteraction
  • yarn add @capgo/capacitor-textinteraction

指南

如何在Capacitor中使用文本交互

在设备上测试

下载Capgo应用程序,然后扫描QRcode。

文本交互插件预览QRcode

Disable text selection and the magnifier lens in Capacitor iOS apps

@capgo/capacitor-textinteraction 让您只需一次调用即可在 iOS 中的 Capacitor WebView 上开启或关闭文本交互。当它关闭时,长按文本不会再选择它,显示复制弹出窗口或唤起 iOS 15 重新引入的放大镜镜头。您的 Web 应用将不再像一个 Web 页面一样在原生壳中运行。

在背后,该插件设置 WKPreferences.isTextInteractionEnabled 将属性设置为 WKWebView。它不会改变任何其他内容。

何时使用它

  • 游戏、自助机和绘图应用 不应选择文本的长按和拖拽手势
  • 自定义长按菜单 与原生选择手柄和弹出窗口冲突
  • 媒体播放器、地图和幻灯片 慢速滑动意外触发放大镜镜头
  • 品牌化的、类似应用的界面 可选择的标签和按钮会破坏原生感

在屏幕上保留文本交互功能,用户可能需要复制长内容或填写表单

安装

bun add @capgo/capacitor-textinteraction
bunx cap sync

否 Info.plist 不需要任何密钥、权限或 capacitor.config.ts 条目

插件版本 Capacitor版本 维护
v8.x v8.x 是
v7.x v7.x 按需
v6.x及更早版本 v6.x及更早版本 否

在应用启动时禁用文本交互

import { Capacitor } from '@capacitor/core';
import { TextInteraction } from '@capgo/capacitor-textinteraction';

if (Capacitor.getPlatform() === 'ios') {
  const { success } = await TextInteraction.toggle({ enabled: false });
  if (!success) console.warn('Text interaction could not be changed on this device');
}

始终传递。 原生侧会将缺失的值视为 enabled 重新启用它在用户输入之前 false.

在文本交互关闭时,

在文本交互关闭时, <input>, <textarea> 和 contenteditable 元素不再接收输入。为任何包含表单的屏幕打开,然后在用户离开时关闭。

import { Capacitor } from '@capacitor/core';
import { TextInteraction } from '@capgo/capacitor-textinteraction';

const isIos = Capacitor.getPlatform() === 'ios';

export async function setTextInteraction(enabled: boolean) {
  if (!isIos) return false;
  const { success } = await TextInteraction.toggle({ enabled });
  return success;
}

// Entering a login, search or checkout screen
await setTextInteraction(true);

// Leaving it
await setTextInteraction(false);

使用路由器时,调用 setTextInteraction(true) 在包含输入的路由中(例如 Vue Router beforeEnter,一个 React useEffect,或 Angular ionViewWillEnter)和 setTextInteraction(false) 离开它们时。

插件与 CSS

您可以使用 CSS 隐藏大部分选择:

body {
  -webkit-user-select: none;
  user-select: none;
  -webkit-touch-callout: none;
}

input,
textarea,
[contenteditable] {
  -webkit-user-select: text;
  user-select: text;
}

CSS 是基于元素的,因此您忘记的任何内容仍然可选择,且不会影响 WebView 本身处理长按的方式。该插件在 WebView 级别工作:一次调用可以覆盖所有屏幕,包括放大镜镜头。许多应用程序都使用两者:插件用于类似应用程序的屏幕,CSS 用于在文本交互保持在屏幕内部时进行精细控制的屏幕。

API参考

toggle(options)

toggle(options: { enabled: boolean }): Promise<{ success: boolean }>

启用或禁用Capacitor WebView的文本交互功能。

  • enabled: true 恢复选择、弹出提示和放大镜镜头。 false 禁用它们。
  • success: true 当更改被应用于iOS 14.5+时(有WebView可用)。 false 在Android上和没有WebView可用时。

getPluginVersion()

getPluginVersion(): Promise<{ version: string }>

返回原生插件版本。返回 web 浏览器中的

平台行为

平台 行为
iOS 14.5+ 设置 isTextInteractionEnabled 在 Android 上 WKWebView. 适用于所有页面,直到再次切换。
Android 无效。解决 { success: false }. 如果您需要限制选择,请使用 CSS。
Web toggle 抛出未实现的错误。使用 Capacitor.getPlatform().

故障排除

  • 上下文:支持/高级支持页面或底部支持部分。角色:部分或页面标题。见:页面 support-policy.astro。消息键 `support_policy_troubleshooting_title` (支持政策故障排除标题)。 输入停止工作。 toggle({ enabled: true }) 文本交互仍然被禁用。请在表单显示之前调用
  • Android 上没有任何变化。 预期结果。该插件仅支持iOS。
  • TextInteraction.toggle is not available on web. 该调用在浏览器中或桌面浏览器中运行。将其包装在平台检查中。
  • 选择在重启应用后恢复。 每次启动都创建一个新的WebView,文本交互功能启用。请在 toggle({ enabled: false }) 启动时调用。

无需 App Store 审核即可发布更新

切换文本交互是使用 JavaScript。 一旦插件添加到您的原生构建中,您就可以使用 Capgo live update 而不是等待 App Store 审核。

完整参考

常见问题

文本交互插件常见问题

How do I disable text selection in a Capacitor iOS app?

安装 @capgo/capacitor-textinteraction,运行 bunx cap sync,然后调用 TextInteraction.toggle({ enabled: false }). 插件将 isTextInteractionEnabled 设置为 false,WKWebView 上的文本选择和放大镜功能都将被关闭。

为什么 CSS user-select: none 在 iOS 上不够用?

user-select 和 -webkit-touch-callout 可以阻止大部分页面内容的选择,但 WKWebView 可以仍然显示放大镜和选择行为,长按时也会显示。忘记样式化的元素仍然可以被选择。插件在 WebView 级别切换文本交互,一个调用就可以覆盖所有屏幕。

禁用文本交互时,用户是否仍然可以在输入框中输入?

不。禁用文本交互时,文本输入框、文本区域和可编辑元素都将失效。显示表单或搜索字段之前,请先调用 TextInteraction.toggle({ enabled: true }), 禁用它时用户离开屏幕。

插件是否支持 Android 或 web?

No. iOS 文本交互功能仅在 iOS 设备上可用。 在 Android 设备上,调用将以 success 为 false 返回,并且不会产生任何变化。 在 Web 上,调用将抛出未实现的错误,因此请使用 Capacitor.getPlatform() === &quot;ios&quot; 来保护它。

哪些 iOS 和 Capacitor 版本受支持?

native API 需要 iOS 14.5 或更高版本。 插件的主要版本遵循 Capacitor: 使用插件 v8 与 Capacitor 8 和插件 v7 与 Capacitor 7 一起使用。

设置是否在应用程序重启后持续有效?

设置存储在 WebView 配置中,因此在页面导航期间一直有效,直到您再次调用 toggle。 一次新应用程序启动创建一个新的 WebView,文本交互功能启用,因此在启动时再次调用 toggle 以使其在默认情况下关闭。

如何在 Capacitor 应用程序中安装文本交互插件?

运行 &quot;bun add @capgo/capacitor-textinteraction&quot; (或 &quot;npm install @capgo/capacitor-textinteraction&quot;),然后运行 &quot;bunx cap sync&quot; 以便 iOS 和 Android 项目捕获 native code。 从 &quot;@capgo/capacitor-textinteraction&quot; 导入您的应用程序 code。

@capgo/capacitor-textinteraction 与 React、Vue 和 Angular 是否兼容?

是。 文本交互是 Capacitor 包,因此它与任何在 Capacitor 内部运行的 Web 框架兼容,包括 Ionic、React、Vue、Angular、Svelte 和普通 JavaScript。

哪些 Capacitor 版本受 @capgo/capacitor-textinteraction 支持?

Capgo 插件遵循 Capacitor 的主要版本:使用与 Capacitor 主要版本匹配的插件版本(例如插件 v8 与 Capacitor 8)。在 GitHub README 中的兼容性表格中列出了维护的版本。

是否 @capgo/capacitor-textinteraction 免费且开源?

是。code 的源代码在 GitHub 上公开,https://github.com/Cap-go/capacitor-textinteraction/,并且可以从 npm 免费安装。欢迎bug报告和pull请求。

是否可以在不经过 App Store 审核的情况下更新使用 Text Interaction 的 code?

安装或升级插件会更改本机 code,因此需要新建一个商店构建。之后,JavaScript、HTML 和 CSS 调用插件的更改可以立即通过 Capgo 实时更新发布。

不必等待应用审核即可将 Text Interaction 变更部署

一旦插件添加到您的商店构建中,Capgo即刻推送您的 JavaScript、HTML 和 CSS 变更到用户中。

开始使用 Capgo