前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >iOS开发之仿支付宝后台隐藏信息

iOS开发之仿支付宝后台隐藏信息

原创
作者头像
YungFan
发布2024-12-11 09:43:40
发布2024-12-11 09:43:40
830
举报
文章被收录于专栏:学海无涯学海无涯

介绍

支付宝有一个功能:当进入后台时,用户会看到一个毛玻璃效果的保护界面覆盖在应用之上,防止泄露敏感信息。当回到前台时,保护界面自动消失,用户看到正常的应用界面。本文将研究与实现该效果。

实现

思路

  1. 实现效果:在退到后台时,在界面再添加一层“毛玻璃界面”,在回到前台时移除该“毛玻璃界面”。
  2. 利用了 iOS 中退到后台与回到前台 2 个生命周期函数。
  3. 毛玻璃效果可以通过UIVisualEffectView实现。
  4. 毛玻璃界面需要能够覆载在最上面,可以通过UIWindow实现。

代码

  • 主界面。
代码语言:swift
复制
import UIKit

class ViewController: UIViewController {
    lazy var label: UILabel = {
        let label = UILabel(frame: CGRect(x: 0, y: 0, width: 300, height: 50))
        label.center = view.center
        label.text = "敏感信息,后台不可查看"
        label.font = .monospacedSystemFont(ofSize: 25, weight: .bold)
        label.textAlignment = .center
        return label
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.addSubview(label)
    }
}
  • 毛玻璃界面。
代码语言:swift
复制
import UIKit

class PrivacyViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .light))
        visualEffectView.frame = view.bounds
        view.addSubview(visualEffectView)
    }
}
  • SceneDelegate 处理生命周期与 UIWindow。
代码语言:swift
复制
import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?
    // 增加一个新的隐私UIWindow
    private var privacyWindow: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let _ = (scene as? UIWindowScene) else { return }
    }

    func sceneWillEnterForeground(_ scene: UIScene) {
        // 隐藏
        hidePrivacyWindow()
    }

    func sceneDidEnterBackground(_ scene: UIScene) {
        // 显示
        showPrivacyWindow()
    }

    // MARK: 创建并显示隐私UIWindow
    private func showPrivacyWindow() {
        guard let windowScene = window?.windowScene else {
            return
        }

        privacyWindow = UIWindow(windowScene: windowScene)
        // 切换rootViewController为隐藏敏感信息的UIViewController
        privacyWindow?.rootViewController = PrivacyViewController()
        // 将保护窗口置于最顶层
        privacyWindow?.windowLevel = .alert + 1
        privacyWindow?.makeKeyAndVisible()
    }

    // MARK: 隐藏隐私UIWindow
    private func hidePrivacyWindow() {
        privacyWindow?.isHidden = true
        privacyWindow = nil
    }
}

效果

后台隐藏信息
后台隐藏信息

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 实现
    • 思路
    • 代码
    • 效果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档