UIDebuggingInformationOverlayについて

UIDebuggingInformationOverlayについて

作成日
Jun 2, 2021 6:53 PM

ランタイムのデバッグについて調べていたら、「そういえばUIDebuggingInformationOverlay」ってあったよね。という話があってそういえばiOS14.5でも動くのかなと思って調べた。

結論から言うと以下のコードで出せました。

import UIKit
import ObjectiveC

public class DebuggingInformationOverlay {
    static var UIDebuggingInformationOverlay: UIWindow.Type? {
        NSClassFromString("UIDebuggingInformationOverlay") as? UIWindow.Type
    }
    
    public static let shared: DebuggingInformationOverlay = .init()
    
    init() {
        guard let initMethod = class_getInstanceMethod(Self.UIDebuggingInformationOverlay, Selector("init")) else { return }
        guard let originalMethod = class_getInstanceMethod(UIWindow.self, Selector("init")) else { return }
        let newInit = method_getImplementation(originalMethod)
        method_setImplementation(initMethod, newInit)
    }
    
    public static func prepareDebuggingOverlay() {
        Self.UIDebuggingInformationOverlay?.perform(NSSelectorFromString("prepareDebuggingOverlay"))
    }
    
    public func activate() {
        let tapGesture = UITapGestureRecognizer()
        tapGesture.state = .ended
        
        let handlerCls = NSClassFromString("UIDebuggingInformationOverlayInvokeGestureHandler") as! NSObject.Type
        let handler = handlerCls.perform(NSSelectorFromString("mainHandler")).takeUnretainedValue()
        handler.perform(NSSelectorFromString("_handleActivationGesture:"), with: tapGesture)
    }
}

DebuggingInformationOverlay.prepareDebuggingOverlay()
DebuggingInformationOverlay.shared.activate()

iOS14.5ではinitの差し替えが必要(12〜15lineの箇所)で、以前はなくても動いていたっぽいのでちょっとハマった。

あとSwiftUIでは出せない(多分UISceneでも出せない気がする)のもハマりどころ。ずっとこれあるけどどれくらいAppleで使われてるんですかね。そもそもSwiftUIのアプリあんまりないのか。