【Swift】ログイン時に起動する - SMAppService


import Foundation
import ServiceManagement
import os.log

@available(macOS 13.0, *)
public enum LaunchOnLogin {
  public static var isEnabled: Bool {
    get { SMAppService.mainApp.status == .enabled }
    set {
      do {
        if newValue {
          if SMAppService.mainApp.status == .enabled {
            try? SMAppService.mainApp.unregister()
          }
          try SMAppService.mainApp.register()
        } else {
          try SMAppService.mainApp.unregister()
        }
      } catch {
        os_log("Failed to \(newValue ? "enable" : "disable") launch at login: \(error.localizedDescription)")
      }
    }
  }
}

👉 Rectangle/Rectangle/LaunchOnLogin.swift at 277cadc905d9ff92c7948a5c97794141f8d1277c · rxhanson/Rectangle hatena-bookmark


import AppKit
import ServiceManagement

@available(macOS 13.0, *)
class LoginItemManager {
  func loginItemIsEnabled() -> Bool {
    return SMAppService.mainApp.status == .enabled
  }

  func disableLoginItem() {
    try? SMAppService.mainApp.unregister()
  }

  func enableLoginItem() {
    try? SMAppService.mainApp.register()
  }
}

👉 phpmon/phpmon/Common/Helpers/LoginItemManager.swift at 4a3dee3c5023ef252e5dd48de4d2937087eb941b · nicoverbruggen/phpmon hatena-bookmark


import ServiceManagement

public extension SMAppService {
  var isEnabled: Bool {
    status == .enabled
  }

  func toggle() throws {
    isEnabled ? try unregister() : try register()
  }
}

👉 LunarBar/LunarBarMac/Modules/Sources/AppKitExtensions/SMAppService+Extension.swift at e7ae92a8fca7895d739686839afa450fd60663de · LunarBar-app/LunarBar hatena-bookmark

 

■ まとめ

以上を参考に、こう書きました。


@AppStorage("launchAtLogin") private var isOn = false

Toggle("Launch at login", isOn: $isOn)
  .onAppear {
    isOn = SMAppService.mainApp.status == .enabled
  }
  .onChange(of: isOn) {
    let app = SMAppService.mainApp
    try? isOn ? app.register() : app.unregister()
  }

その後、結局、

@AppStorage も @State も持たないようにしました。



登録状態は、


[Settings] - [General] - [Login Items]

でOS側設定画面からも管理できます。

しかし、双方向のバインディングはつらくないですか。

👉 SMAppService | Apple Developer Documentation hatena-bookmark


iOS シュミレータは、聴きながら録画 + 録音できないのですか ?

Audio MIDI 複数出力装置と仮想デバイス BlackHole を使って、QuickTime で聴きながらの音声付き録画。

なぜできないのか。

聴きながらができないんです。

シュミレータにも、Audio Output の設定があるので、

そこで、個別に BlackHole に向けてもダメ。

複数音声出力 から BlackHole 向きを外してもダメ。

シュミレータを音声付き録画するなら聴きながらはできない。

そういうものなの?

できても良さそうなのに。

Loopback など有料アプリならできるのですか ?

👉 SoundFlowerからBlackHoleに移行してOBS接続おさらい hatena-bookmark


「iOS デバイスで位置情報対応の Google アプリを使用して設定を変更してください」とは ?

位置がタイムラインに正確に表示できてない。

設定を見てみると、

👉 Google - マイ アクティビティ hatena-bookmark

iOS デバイスで位置情報対応の Google アプリを使用して設定を変更してください

なんやこれ ?

 

🗺️ Google マップ コミュニティ

Google マップ コミュニティで調べます。

タイムラインがいつのまにか記録されなくなり、調べたら「iOS デバイスで位置情報対応の Google アプリを使用して設定を変更してください」となっていて、使っているデバイスが選択出来なくなっていました。googleマップは今までと同じアカウントで同じアプリを使用してるのですが…どうすれば直るでしょうか?

👉 iOS デバイスで位置情報対応の Google アプリを使用して設定を変更してください - Google マップ コミュニティ hatena-bookmark

iPhone で。


設定

 ↓

プライバシーとセキュリティ

 ↓

位置情報サービス

 ↓

Google Maps

これでも、直らん。

 

🗺️ まとめ

精度 (細かさ) が落ちたんでしょうね。

また、AndroidとiOSでは、この元データのスポットの採取タイミングに違いがあり、Androidに比べてiOSのほうが取得頻度が低いため、類推するための情報が少なくなってしまい、余計に直線になってしまうことがあるような気がしています。

取得頻度は、過去は結構な頻度で取得されていたのですが、いま時点は非常に少ないと思います。

👉 タイムライン表示で、元データはスポットとして残っているのに大部分が経路として参照されず、数点を直線で結んでしまうのはなぜでしょう。 - Google マップ コミュニティ hatena-bookmark

ここでも、また、悲しい感じとなってますね。

「iOS デバイスで位置情報対応の Google アプリを使用して設定を変更してください」 は消すことができませんし。