常用操作 | Swift

本文最后更新于:2020年11月8日

发送本地通知

// 发送通知
func sendNotification(title: String, subtitle: String = "", informativeText: String = "") {
    let userNotification = NSUserNotification()
    userNotification.title = title
    userNotification.subtitle = subtitle
    userNotification.informativeText = informativeText

    let userNotificationCenter = NSUserNotificationCenter.default
    userNotificationCenter.delegate = self
    userNotificationCenter.scheduleNotification(userNotification)
}

// 当 App 在前台时是否弹出通知
func userNotificationCenter(_ center: NSUserNotificationCenter, shouldPresent notification: NSUserNotification) -> Bool {
    return true
}

// 推送消息后的回调
func userNotificationCenter(_ center: NSUserNotificationCenter, didDeliver notification: NSUserNotification) {
    print("\(Date(timeIntervalSinceNow: 0)) -> 消息已经推送")
}

// 用户点击了通知后的回调
func userNotificationCenter(_ center: NSUserNotificationCenter, didActivate notification: NSUserNotification) {
    switch notification.activationType {
    case .actionButtonClicked:
        let method = notification.userInfo!["method"] as! String
        print("methods -> \(method)")
    case .contentsClicked:
        print("clicked")
    case .replied:
        print("replied")
    case .additionalActionClicked:
        print("additional action")
    default:
        print("action")
    }
}

固定间隔循环执行

let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { _ in
    print("\(Date(timeIntervalSinceNow: 0))")
})
RunLoop.main.add(timer, forMode: .common)

这个操作是只有一个线程在做,必须这一次执行完后下一次才能开始。

请求相机权限

let status = AVCaptureDevice.authorizationStatus(for: .video)

if status == .authorized {
    // connect to video device
}

if status == .denied {
  // show error
}

// 如果需要,使用 requestAccess(for:completionHandler:) 请求权限
AVCaptureDevice.requestAccess(for: .video) { (accessGranted) in
  // handle result
}

请求辅助功能权限

let key = kAXTrustedCheckOptionPrompt.takeRetainedValue() as String
if (!AXIsProcessTrustedWithOptions([key: true] as CFDictionary)) {
    // Sometimes Prompt option above doesn't work, actually trying to send key may open that dialog.
    let src = CGEventSource(stateID: .hidSystemState)
    // "Fn" key down and up
    CGEvent(keyboardEventSource: src, virtualKey: 63, keyDown: true)?.post(tap: .cghidEventTap)
    CGEvent(keyboardEventSource: src, virtualKey: 63, keyDown: false)?.post(tap: .cghidEventTap)
}

延迟执行

// 阻塞当前线程
sleep(5) 

// 新建一个线程
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 5) {
    // do something
}

评论系统采用 utterances ,加载有延迟,请稍等片刻。