【Flutter】iOS上使用 UIPasteboard.detectPatterns 优化剪切板权限弹窗逻辑

使用 UIPasteboard.detectPatterns 优化剪切板权限弹窗逻辑

在上篇文章中,我们探讨了如何通过优化剪切板权限弹窗的触发逻辑,来减少用户体验中的误操作。本文将进一步深入,介绍如何通过预先检测剪切板内容,确保只有符合特定规则的数据才会触发授权弹窗。这样不仅能够提升用户体验,还可以避免不必要的授权请求,尤其是与深度链接和从剪切板获取内容相关的场景。

优化用户体验的关键:提前检测剪切板内容

通常情况下,用户从剪切板中复制的内容无非是文字或链接。然而,为了减少不必要的弹窗提示,我们可以通过检测剪切板内容是否符合特定格式规则,来确定是否触发授权。例如,在涉及深度链接(deeplink)或打开指定页面时,检测到的内容应包含如下格式:

  • 数字 + 空格 + URL 地址 + 空格 + 其他信息

例如,剪切板内容可能是这样的:

复制代码
1 https://www.baidu.com aaaaaa

通过提前检测是否同时包含数字和 URL,我们可以减少不必要的授权提示。为此,我们可以使用 UIPasteboard.general.detectPatterns API 来检测剪切板内容中的模式。

使用 detectPatterns API

自 iOS 14 起,苹果为剪切板提供了 detectPatterns API,这使得我们可以在访问剪切板之前检测其中的内容是否包含符合规则的模式。举个例子,我们可以检测剪切板是否包含 URL 和数字。下面是关键代码示例:

swift 复制代码
// 使用 detectPatterns 检测是否有 URL 和 Number
let somePatterns: Set<UIPasteboard.DetectionPattern> = [
    .probableWebURL,
    .number
]

这个 API 对于提升深度链接处理场景中的用户体验非常有用,因为我们可以确保只有满足指定格式的内容才会触发授权弹窗。

实现思路与代码示例

为了将这一检测逻辑集成到实际应用中,我们可以将其添加到现有的插件或项目中。接下来,我们通过一个实际代码示例来展示如何在插件中实现这个功能。

插件实现代码

下面是一个使用 Flutter 和 iOS 平台的示例插件代码,展示了如何通过 UIPasteboard.detectPatterns API 实现剪切板内容的检测:

swift 复制代码
import Flutter
import UIKit

@available(iOS 16.0, *)
public class SafeClipboardPlugin: NSObject, FlutterPlugin {
    public static func register(with registrar: FlutterPluginRegistrar) {
        let channel = FlutterMethodChannel(name: "safe_clipboard", binaryMessenger: registrar.messenger())
        let instance = SafeClipboardPlugin()
        registrar.addMethodCallDelegate(instance, channel: channel)
        let factory = ClipboardViewFactory(methodChannl: channel)
        registrar.register(factory, withId: "clipboard")
    }
    
    public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
        switch call.method {
        case "getPlatformVersion":
            result("iOS " + UIDevice.current.systemVersion)
        case "clearClipboard":
            UIPasteboard.general.string = nil
            result(nil)
        case "checkPasteboardHasUrl":
            checkPasteboardHasUrl(result: result)
        default:
            result(FlutterMethodNotImplemented)
        }
    }
    
    func checkPasteboardHasUrl(result: @escaping FlutterResult) {
        if #available(iOS 14.0, *) {
            // 使用 detectPatterns 检测是否有 URL 和 Number
            let somePatterns: Set<UIPasteboard.DetectionPattern> = [
                .probableWebURL,
                .number
            ]

            UIPasteboard.general.detectPatterns(for: somePatterns) { patternsResult in
                switch patternsResult {
                case .success(let detectedPatterns):
                    var hasNumber = false
                    var hasURL = false

                    // 检测到是否有 URL
                    if detectedPatterns.contains(.probableWebURL) {
                        hasURL = true
                    }

                    // 检测到是否有 Number
                    if detectedPatterns.contains(.number) {
                        hasNumber = true
                    }

                    // 返回是否同时检测到 URL 和 Number
                    result(hasURL && hasNumber)

                case .failure(let error):
                    // 处理检测失败的情况
                    print("Failed to detect patterns: \(error.localizedDescription)")
                    result(false)
                }
            }
        } else {
            // 如果是 iOS 14 以下的版本,直接返回 false,因为无法使用 detectPatterns API
            result(true)
        }
    }
}

代码分析

在这个插件中,我们添加了一个 checkPasteboardHasUrl 方法,负责检测剪切板内容是否同时包含 URL 和数字。这些步骤包括:

复制代码
1.	创建检测模式:通过 UIPasteboard.DetectionPattern 定义我们关心的检测模式,这里是 URL 和数字。
2.	调用 detectPatterns 方法:检查剪切板中是否包含符合我们检测模式的内容。
3.	返回检测结果:如果剪切板中同时包含 URL 和数字,则返回 true,否则返回 false。
API 版本兼容性

注意,这个功能只能在 iOS 14 及以上版本中使用。如果检测到设备运行的系统版本低于 iOS 14,则我们默认返回 true,以便应用能够继续正常运行。

相关推荐
天桥吴彦祖2 天前
判断iOS如何监听手机屏幕是否锁屏
ios
恋猫de小郭2 天前
Amper 正式转正 Kotlin Toolchain ,Gradle 未来何去何从
android·前端·flutter
张风捷特烈2 天前
Flutter 类库大揭秘#02 | path_provider 各平台实现
前端·flutter
敲代码的鱼2 天前
PDF 预览与签名批注写回 支持安卓 iOS 鸿蒙 UTS插件
android·前端·ios
时光足迹3 天前
uni-app 视频通话实战:康复师与患者视频问诊的 6 个致命 Bug 与解决方案
android·ios·uni-app
时光足迹3 天前
JPush UniApp UTS 插件完全参考手册:API、事件与厂商通道一网打尽
vue.js·ios·uni-app
时光足迹3 天前
极光推送全攻略(下):uni-app 代码实现与 iOS 排查实战
vue.js·ios·uni-app
时光足迹3 天前
极光推送全攻略(上):被iOS证书折磨了三天,我写了一份前端也能看懂的避坑指南
前端·ios·uni-app
TT_Close3 天前
别劝退了!5秒搞定 Flutter 鸿蒙 FVM 起跑线
flutter·harmonyos·visual studio code
你听得到113 天前
用户说 App 卡,但说不清在哪?我把 Flutter 监控 SDK 升级成了链路观测工作台
前端·flutter·性能优化