Як активувати DND автоматично?


2

Я використовую MacBook Pro на роботі, яка більшу частину часу підключена до док-станції за допомогою блискавичного кабелю на моєму столі. Там я зазвичай вимикаю режим не турбувати (DND) і активувати заставку / блокування екрана через 2 хвилини. Коли я перебуваю на засіданнях, трапляється регулярно, що я хочу щось представити, але тоді це прикро, якщо відображаються сповіщення або заставка включається через 2 хвилини. Як я можу автоматично увімкнути режим DND і автоматично відключити заставку, коли мій MacBook не підключений до живлення (док-станція)?

Відповіді:


1

Єдиний спосіб, коли я міг би це зробити, це створити невелику програму командного рядка Swift. Він працює досить добре, з двома основними застереженнями:

  1. У вас не може бути заплановано вмикати та вимикати функцію "Не турбувати" у певний час (перевірте Налаштування системи)
  2. Елемент рядка меню завжди виглядає так, ніби ввімкнено функцію "Не турбувати", навіть якщо її немає

Однак якщо ці застереження не є величезною справою, додаток робить все, що вам потрібно: він запобігає сплячому дисплею і дозволяє не турбувати, коли працює від акумулятора, і скасовує ці налаштування під час підключення до мережі змінного струму. Ось (дещо залучений) процес створення цього додатка:

  • Встановіть Xcode з магазину додатків Mac, якщо ви цього ще не зробили
  • Відкрийте Xcode та встановіть всі необхідні компоненти, як буде запропоновано
  • У вікні "Ласкаво просимо до Xcode" виберіть Create a New Xcode Project Ласкаво просимо на панель Xcode
  • Виберіть macOSу верхній частині випадаючого меню, а потім виберіть Command Line Toolпід Applicationзаголовком і натиснітьNext Новий селектор типу проекту
  • Введіть щось для назви вашого продукту - це ім’я, яке з’явиться у вашій програмі (я буду використовувати BatteryDetector) - і заповніть інші поля (вони насправді не мають значення); переконайтесь, що мова встановлена Swift! Панель параметрів проекту
  • Виберіть десь на комп’ютері, щоб зберегти проект (куди ви хочете), зніміть прапорець для створення сховища Git та натисніть Create Параметри управління джерелами та групи
  • Після того, як ваш проект буде створений ( в новому вікні відкриється), виберіть File> New> File…або натисніть , ⌘Nщоб відкрити діалогове вікно New File
  • Виберіть Header Fileяк тип файлу та натиснітьNext Вибір типу файлу заголовка
  • Назвіть свій файл [your project name]-Bridging-Header.h, замінивши фактичне ім'я проекту [your-project-name]. У моєму прикладі назва була б BatteryDetector-Bridging-Header.h.
  • Переконайтеся, що Groupв нижній частині діалогового вікна поруч є жовта піктограма папки та вказується назва вашого проекту. Якщо у нього синій значок чи щось інше, змініть його на параметр, який містить жовту піктограму папки та назву вашого проекту. Дивіться скріншот нижче для правильної конфігурації. Коли все правильно, натисніть Create. Діалогове вікно групи файлів та місцезнаходження
  • Після створення файлу він повинен автоматично відкриватися. Як тільки це буде, стерти весь автоматично створений вміст і вставити в наступний код. Код нижче повинен бути єдиним кодом у файлі:

    #import <IOKit/ps/IOPowerSources.h>
    
  • Далі виберіть проект у верхній частині ієрархії у верхньому лівому куті вікна, потім виберіть ціль у Targetsсписку, виберіть Build Settingsу верхній частині головної панелі та переконайтесь All, що вибрано під цим (див. Знімок екрана нижче) Створити екран налаштувань

  • Для пошуку використовуйте поле пошуку у верхньому правому куті екрана "Налаштування збірки" objective-c bridging header. Ви повинні побачити налаштування, яке називається Objective-C Bridging Headerвгорі списку.
  • Двічі клацніть праворуч від Objective-C Bridging Headerмітки, щоб з'явилося текстове поле, і введіть [your-project-name]/[your-project-name]-Bridging-Header.hу це текстове поле, замінивши [your-project-name]фактичне ім'я вашого проекту. У своєму прикладі я б увійшов BatteryDetector/BatteryDetector-Bridging-Header.h. Потім натисніть return. Налаштування збірки об'єднаного заголовка Objective-C
  • Далі натисніть на main.swiftфайл у дереві файлів зліва. Видаліть увесь код, який він містить, і вставте код нижче. Наступний код повинен бути єдиним кодом у main.swift:

    import Cocoa
    
    var context = 0
    var proc: Process!
    
    func enableDND() {
            CFPreferencesSetValue("doNotDisturb" as CFString, true as CFPropertyList, "com.apple.notificationcenterui" as CFString, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost)
            CFPreferencesSetValue("doNotDisturbDate" as CFString, Date() as CFPropertyList, "com.apple.notificationcenterui" as CFString, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost)
            commitDNDChanges()
    }
    
    func disableDND() {
            CFPreferencesSetValue("doNotDisturb" as CFString, false as CFPropertyList, "com.apple.notificationcenterui" as CFString, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost)
            CFPreferencesSetValue("doNotDisturbDate" as CFString, nil, "com.apple.notificationcenterui" as CFString, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost)
            commitDNDChanges()
    }
    
    func commitDNDChanges() {
            CFPreferencesSynchronize("com.apple.notificationcenterui" as CFString, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost)
            DistributedNotificationCenter.default().postNotificationName(NSNotification.Name(rawValue: "com.apple.notificationcenterui.dndprefs_changed"), object: nil, userInfo: nil, deliverImmediately: true)
            NSRunningApplication.runningApplications(withBundleIdentifier: "com.apple.notificationcenterui").first?.terminate()
    }
    
    func startCaffeinate() {
            proc = Process()
            proc.launchPath = "/usr/bin/caffeinate"
            proc.arguments = ["-d", "-i"]
            proc.launch()
    }
    
    func stopCaffeinate() {
            proc.terminate()
    }
    
    let loop = IOPSNotificationCreateRunLoopSource({(context: UnsafeMutableRawPointer?) in
            let snap = IOPSCopyPowerSourcesInfo().takeRetainedValue() as CFTypeRef
            let source = IOPSGetProvidingPowerSourceType(snap).takeRetainedValue() as String
            if source == "Battery Power" {
                    enableDND()
                    startCaffeinate()
            } else {
                    disableDND()
                    stopCaffeinate()
            }
    }, &context).takeRetainedValue() as CFRunLoopSource
    
    CFRunLoopAddSource(CFRunLoopGetCurrent(), loop, .defaultMode)
    
    RunLoop.main.run()
    
  • Далі експортуйте програму, вибравши Product> Archiveу рядку меню. Після закінчення архіву з'явиться вікно з Exportкнопкою. Клацніть Export, виберіть Built Productsі клацніть Next. Екран архіву

  • Виберіть місце, де ви збережете експортований виконуваний файл на своєму диску, а потім натисніть кнопку Export.
  • Тепер перейдіть в папку , яку ви тільки що зберегли на диск (називається [your-project-name] [today's-date]) і переміщатися по всіх вкладених папок (ймовірно usr, local, bin) до тих пір , поки не знайдете виконуваний файл з ім'ям BatteryDetector(або все , що ви назвали ваш проект). Ви можете зберігати цей виконуваний файл на будь-якому місці диска, але він повинен знаходитись у стабільному місці (тобто в тому місці, з якого ви не плануєте його переміщувати), або ваш комп'ютер не зможе його знайти.
  • Далі скопіюйте наступний текст і вставте його в програму редагування тексту на кшталт TextEditабо редактор коду (переконайтеся, що він не перетворить лапки в "розумні лапки"). Замініть текст [your-executable-location]повним шляхом до місця, де ваш виконавчий файл зберігається на диску (наприклад, /Applications/BatteryDetector).

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
      <dict>
            <key>Label</key>
            <string>com.launchagent.batterydetector</string>
            <key>Program</key>
            <string>[your-executable-location]</string>
            <key>RunAtLoad</key>
            <true/>
      </dict>
    </plist>
    
  • Після того, як ви ввели правильний шлях, скопіюйте щойно змінений текст (тобто, виправлений шлях) у буфер обміну.

  • Далі відкрийте термінал (розташований за адресою /Applications/Utilities/Terminal.app).
  • Введіть наступне в Terminal точно так, як написано тут, а потім натисніть return. Ви НЕ копіювати і вставити його, команда буде працювати , тільки якщо текст , який ви тільки модифіковані в даний час в буфері обміну:test -e ~/Library/LaunchAgents || mkdir ~/Library/LaunchAgents; pbpaste > ~/Library/LaunchAgents/com.launchagent.batterydetector
  • Нарешті, вийдіть із системи та знову поверніться, щоб розпочати роботу програми. Він продовжуватиме працювати у фоновому режимі і автоматично запускатиметься кожного разу при вході в систему. Якщо вам потрібно буде закрити його з якихось причин, скористайтеся Монітором активності та знайдіть ім'я виконуваного файлу (наприклад, BatteryDetector).

Ось деякі джерела з додатковою інформацією про якийсь код, який я використовую:


Нічого, дякую за дуже детальну пропозицію.
Пелеке

0

Не впевнений, що на все це є легка відповідь; проте кілька речей, які можуть допомогти:

Для заставки ви можете активувати гарячий кут, щоб відключити заставку.

Особисто я не користуюся заставкою і, скоріше, звик заблокувати екран вручну, коли встаю на роботу (Ctl + Cmd + Q).

Ви також можете встановити економію енергії для вимкнення дисплея в різний час, залежно від погоди, коли ви живитесь або акумулятор, а також встановити безпеку, щоб вимагати пароль під час пробудження зі сну.

Сповіщення - це біль (у мене більшість із них вимкнено).

Хоча одне можливе рішення в налаштуваннях сповіщень, ви можете ввімкнути налаштування, яке автоматично вмикається Не турбувати "Під час дзеркального відображення до телевізорів чи проекторів", тож якщо ви дзеркально відображаєтесь під час своїх презентацій, це спрацює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.