当前位置: 首页 > article >正文

【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 和数字。下面是关键代码示例:

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

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

实现思路与代码示例

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

插件实现代码

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

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


http://www.kler.cn/news/360728.html

相关文章:

  • centos 安装达梦数据库
  • Oracle分区表改造(三):通过分区交换和分裂改造为分区表
  • 苦寻多时,终于找到!这款免费GIS工具助你轻松搞定地形切片
  • [Luogu 4630] APIO2018 铁人两项(广义圆方树)
  • 【含文档】基于Springboot+Vue的旅游信息管理系统(含源码+数据库+lw)
  • 如何理解 PHP 中的注释
  • C++和OpenGL实现3D游戏编程【连载16】——详解三维坐标转二维屏幕坐标(向量和矩阵操作实战)
  • 同程旅行面经
  • 基于Springboot+Vue的人事档案管理系统的设计与实现 (含源码数据库)
  • 1、opencv图像基本处理方法
  • [Unity Demo]从零开始制作空洞骑士Hollow Knight第十五集:制作更多地图,更多敌人,更多可交互对象
  • 如何将两个同样大小的List组装成一个Map?
  • 【学习笔记】网络设备(华为交换机)基础知识 9 —— 堆叠配置
  • 【原创】java+ssm+mysql校园在线答疑管理系统设计与实现
  • 【K8S系列】Kubernetes node节点NotReady问题及解决方案详解【已解决】
  • Spring 事务支持
  • 路由器原理和静态路由配置
  • Vue 3 项目里通过自定义指令实现图片懒加载
  • 02_MVCC-版本链管理
  • json路径 [‘a‘].b.c[0].d[‘1‘].f,具体代表什么意思