【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,以便应用能够继续正常运行。

相关推荐
淹没13 分钟前
🚀 告别复杂的HTTP模拟!HttpHook让Dart应用测试变得超简单
android·flutter·dart
归辞...24 分钟前
「iOS」——内存五大分区
macos·ios·cocoa
HX4361 小时前
MP - List (not just list)
android·ios·全栈
吴Wu涛涛涛涛涛Tao5 小时前
Flutter 个人主页实践笔记
flutter
忆江南5 小时前
NSProxy是啥,用来干嘛的
ios
忆江南5 小时前
dyld
ios
愿天深海5 小时前
Flutter 提取图像主色调 ColorScheme.fromImageProvider
android·前端·flutter
归辞...16 小时前
「iOS」——GCD其他方法详解
macos·ios·cocoa
游戏开发爱好者81 天前
没有 Mac,如何上架 iOS App?多项目复用与流程标准化实战分享
android·ios·小程序·https·uni-app·iphone·webview