🐰

_NS_4445425547 で隠されたデバッグ用UIを呼び出す(macOS)

2024/04/11に公開

近頃英語圏のmacOS dev界隈で話題になっていたネタを紹介します。

macOS app(ネイティブ)を開発する際に、実行引数に次のキーと値を与えると、システムに隠されたデバッグ用UIを呼び出すバグメニューが有効になり、メニューバーから使用可能になります。

_NS_4445425547 : true
または
NS🐞 : true

具合的には、UserDefaultsまたはXcodeの「Arguments Passsed on Launch」の仕組みを使います。


macOS appでバグメニューを有効にした様子

ちなみに4445425547は、Unicode表の16進数アドレスに置き換えると“DEBUG”に相当します。

UserDefaultsの場合

コードからランタイムで書き込む方法と、defaultsコマンドで外から書き込む方法があります。

  • _NS_4445425547true
  • defaults write BUNDLE_IDENTIFIER _NS_4445425547 -bool true
// Swiftの場合
UserDefaults.standard.set(true, forKey: "_NS_4445425547")
## defaultsコマンドの場合(指定したBUNDLE_IDENTIFIERのアプリ限定)
% defaults write BUNDLE_IDENTIFIER _NS_4445425547 -bool true

## defaultsコマンドの場合(すべてのアプリを対象)
% defaults write -g _NS_4445425547 -bool true

## 設定を削除
% defaults delete BUNDLE_IDENTIFIER _NS_4445425547
% defaults delete -g _NS_4445425547

defaultsコマンドでは、-gまたはNSGlobalDomainを対象にすると、ほぼ全てのアプリで有効にすることができるようです。ただし、Adobe系など一部のソフトウェアではうまく機能しないなどの情報も耳にしました。

Xcodeの場合

Scheme編集パネルで「Arguments Passsed on Launch」に値を書き込みます。頭にハイフン-をつけて、スペースを開けてYESにします。以下どちらか好きな方一つを使えます。

  • -_NS_4445425547 true
  • -NS🐞 true

参考情報

https://gist.github.com/usagimaru/e085500dfbf4b479304e86cb91b1b079
https://mjtsai.com/blog/2024/03/22/_eventfirstresponderchaindescription/
https://twitter.com/hrumarek/status/1190942518080397317
https://twitter.com/catlan/status/1771439311159713951

Discussion