バナー「互換性のないディスク」を表示しない、またはそもそも出ないようにしたい.あるいは……

こちらで既に質問があったようですが、返信の期限が切れてしまったようなので再質問です.

https://discussionsjapan.apple.com/thread/252929231

【稼働環境】Mac mini 2018 / macOS 10.14.6 Mojave (外部SATA-SSDからの起動)


普段は外部SSDに入れた Mojave で運用していますが、新しい OS での運用試験のため「内蔵SSD」 に Monterey をインストールしました.その後 OS を Mojave に戻し起動すると上記画像のようなバナーが出ます.そのバナーが出ること自体は特に気にしないのですが、起動の度に手動でバナーを閉じなければならない点は気に入りません.せめて一定時間が経過すると消える仕様だと良いのですが…….重要な告知なので「自動でバナーが消えない」仕様とすることもわかるのですが、はっきり言って、見た目のうえでも機能のうえでもとても邪魔です.何とか「手間なく=自動で」消す、もしくはそもそも表示させない方法はないでしょうか.


今のところ考えられる対策は「内蔵 SSD でなく外部 SSD に Monterey を入れ、必要な時だけそのディスクから起動する」ことですが、うちの環境が悪いのか(ディスプレイ3枚)、内蔵 SSD のスピードをもってしても何やら動作が緩慢というのか動きがもっさりするので、それよりも低速なディスク(SATA-SSD)を起動・稼働に用いるのは少し心許ない気もしています(まだ試していませんが).


まず試したことと言えば、ログイン項目に Monterey の入っているディスク(うちの環境では「XXX-Data」と「Update」となっています)をアンマウントするアプリケーション(AppleScript)を登録して起動後に実行させることでした(アンマウント自体は成功しています).けれどこれは、システムが既にディスクを「互換性のないディスク」と認識してバナーを出した後に作動するようで意味がありませんでした.だとすると、たとえばシステム終了または再起動をフックする時に使う Objective-C の NSWorkspaceWillPowerOffNotification のように、起動をフックする似たような何かの機能があったとしても(調べた限り見つかりませんでしたが)同じ結果になりそうな気はします.


もうひとつ試したことは、バナーが表示された後(正確には「既にバナーが出された後」)に「通知センター.app」を終了させたことです.終了直後はたしかにバナーも消えるのですが、すぐに同アプリケーションが自動で起動し、また表示されてしまいます.結局この方法もダメでした.


……いやはやなかなかお手上げです.どうにかならないものでしょうか.


(付記) ターミナルからコマンドを入力して「そもそもバナーを出さない仕様」に変えることもできるようですが、敷居が高いというよりできればそういう手段は採りたくないため他の方法を探しています.

* 一部編集いたしました。 Apple Inc.

Mac mini, macOS 12.1

投稿日 2022/02/04 01:43

返信
スレッドに付いたマーク ⚠️ ランキングトップの返信

投稿日 2022/02/04 10:59

light289 さんによる書き込み:

何とか「手間なく=自動で」消す、もしくはそもそも表示させない方法はないでしょうか.


雑な方法ですが Automator の「記録」でなんとかなります。私の環境では。

MacのAutomatorでワークフローを作成する - Apple サポート (日本)


ちなみに内蔵ディスクは Big Sur、外付け SSD は Catalina、Mojave ですが Catalina では「互換性のないディスク」は表示されないのでそういうものなんだろうと。

類似の質問

返信: 22
並べ替え順: 
スレッドに付いたマーク ⚠️ ランキングトップの返信

2022/02/04 10:59 light289 への返信

light289 さんによる書き込み:

何とか「手間なく=自動で」消す、もしくはそもそも表示させない方法はないでしょうか.


雑な方法ですが Automator の「記録」でなんとかなります。私の環境では。

MacのAutomatorでワークフローを作成する - Apple サポート (日本)


ちなみに内蔵ディスクは Big Sur、外付け SSD は Catalina、Mojave ですが Catalina では「互換性のないディスク」は表示されないのでそういうものなんだろうと。

返信

2022/02/05 20:25 Rondo_1 への返信

連投申し訳ありません。自明だと思いますが念のため手順を記すと(再)ログインして「互換性のないディスク」を表示して「閉じる」の任意の場所にポインタを移動して Automator を開いて(必要に応じて command + N とかシステム環境設定のセキュリティとプライバシーとかをごにょごにょして)option + command + R として「閉じる」をクリックして中止ボタンをクリックします。

MacのAutomatorでワークフローを作成する - Apple サポート (日本)


というか質問に「Objective-C の NSWorkspaceWillPowerOffNotification」とか書いてる人に一定の水準を期待するのは法外ではないと思うのですが(なので上級者にとってはエレガントではないだろうなあと思ったのです)。一から十まで説明とか流石に勘弁してくださいというか。

返信

2022/02/04 12:39 Rondo_1 への返信

念の為ですが Automator で「閉じる」ボタンをクリックする操作を「記録」して(「再生速度」などを調整して)アプリケーションとして保存してログイン項目に追加します(「システム環境設定」>「セキュリティとプライバシー」>「プライバシー」>「アクセシビリティ」でそのアプリケーションを「許可」する必要があります)。もっとエレガントな方法があると思いますが(AppleScript とか?)要は何らかの方法で「閉じる」ボタンを自動的にクリックすれば良いと思います。

返信

2022/02/04 22:48 粕谷 明 への返信

基本的に「OSのダウングレード」という話ではないので、少し違うのですね.それと Monterey (および Big Sur) のインストールで生成されたディスク(上記の例でいうと 「XXX-Data」と「Update」)を初期化すると Mojave 起動時に「互換性のないディスク」というバナーは出ません.もっとも、そもそもそのディスクが(初期化されていて)無いのですから、出るはずもないのですが.弊害があったすれば「起動音が鳴るという設定は消えなかった」くらいですか.ただそれもターミナルから特定の命令を実行すると消せるので、今となっては問題としていません.

せっかく提示していただいたのに申し訳ないです.

返信

2022/02/04 22:59 はに への返信

ええ、ただ、ですね.まだまだそれは値段が張るので今は手が出せない状態です.検討はしているのですが今の Mac mini 2018 に用いるつもりはなく、いずれ出る(M2?)新しい Mac mini を運用する時にしようかな、と.もちろん今の環境でそれを導入するともっとサクサク動くのでしょうが、買ってから今までずっとこの内蔵 SSD がらみでロクな体験をしていないので(もっとも内蔵 SSD のというより OS 側の制御不全を疑っていますが)、できることなら早く買い換えたいのですよ…….

返信

2022/02/05 08:57 light289 への返信

light289 さんによる書き込み:

OS をCatalina にするという選択肢は絶対にありません.


そういうことではなく Monterey や Big Sur が含まれるマルチブート環境に於いて「互換性のないディスク」通知パネルは Catalina 以降は(今のところ)表示されないだろうということです。つまり


Monterey: 表示されない

Big Sur: 表示されない

Catalina: 表示されない


Mojave: 表示される

High Sierra: 表示される(日本語環境でも Incompatible Disk)

Sierra: 表示される?(APFS は非公式だがマウントできる)


El Capitan: 表示されない(APFS をマウントできないので)


ということです。

返信

2022/02/07 22:46 light289 への返信

次に GUI スクリプティングについて。


下の要領で都度 UI Elements を取得して、その結果から目的の要素を探していきます。Xcode に付属の Accessibility Inspector.app を併用すると若干作業効率が良くなるかもしれません。また、Automator の記録から得られた AppleScript のコードが役に立つ場合もあります。(何れにしてもかなり根気のいる作業です)


tell application "System Events"
    tell application process "NotificationCenter"
        UI Elements # 結果から目的の要素を探す (この場合は window 1)
        tell window 1
            UI Elements # 結果から目的の要素を探す (この場合は button "閉じる")
            click button "閉じる"
        end tell
    end tell
end tell


返信

2022/02/07 22:52 light289 への返信

「通知」の「閉じる」ボタンを押すための最小限のコードはこんな感じでしょうか。(ボタンが2つあるタイプの通知で試したので若干違うかもしれません。ダメな場合は適宜書き換えてください)


tell application "System Events"
    tell application process "NotificationCenter"
        -- set frontmost to true
        tell window 1
            click button "閉じる"
        end tell
    end tell
end tell



いくつかの機能 (通知ウインドウが出現するまで待つなど) を追加するとこんな感じ。


on run
    try
        main()
    on error errs number errn
        tell me
            activate
            display alert "Error!" message errs as critical
        end tell
    end try
end run

on main()
    set notification_title to "互換性のないディスク"
    set close_button to "閉じる"
    --
    tell application "System Events"
        tell application process "NotificationCenter"
            set n to 0
            repeat while true
                if n > 30 then error "timed out"
                set _windows_ to windows whose static text 1's value is notification_title
                if _windows_'s length > 0 then
                    set _window_ to _windows_'s item 1
                    exit repeat
                else
                    delay 1
                    set n to n + 1
                end if
            end repeat

            -- set frontmost to true

            tell _window_
                click button close_button
            end tell
        end tell
    end tell
end main


で、Automator か AppleScript でアプレットを作成し、ログイン項目に登録すると良いと思います。


# システム環境設定の「セキュリティとプライバシー > アクセシビリティ」へ登録後にアプレットを編集すると、不許可となってしまうようです。なので、アプレットを編集した際は登録し直す必要があるみたいです。(めんどくさい...)


返信

2022/02/10 01:21 Hiro__S への返信

素晴らしいの一言に尽きます.いや、本当に、ありがとうございます.

自身の環境は起動時にいくつかのスクリプトを走らせてバナーを出す仕様なため、タイミングによってエラーが発生するので前者の使用は諦めました.なので、後者の「いくつかの機能を追加」したものを改変して使わせていただきます.


> システム環境設定の「セキュリティとプライバシー > アクセシビリティ」へ登録後にアプレットを編集すると、不許可となってしまうようです。なので、アプレットを編集した際は登録し直す必要があるみたいです。(めんどくさい...)

この仕様はどうにかならなかったのかと今でも思いますが、まあ、そういう仕様なので諦めるしかないですねぇ.


余談ですが、特に whose 語句を使用したこの手の絞り込みは他のサイトで一度目にしただけでそれ以外のサンプルを持ち合わせていなかったので、新しいサンプルが収集できたことは個人的にとても嬉しく思います.


--


本当ならこの段階で「この問題が解決した」としたいところなのですが、個人的に tell 文を使わず解決したいと思っているのでしばらくの間、保留とさせていただきます.今回の件以外でもある程度のことは System Events と application process XXX の組み合わせで解決できていたのですが、セキュリティ認証を回避するため今は(というより以前からずっと) AppleScriptObjC の仕組みで解決する方法を模索しています.糸口は見つかっているのですがすぐに解決できるわけでもないのでまだ少し時間がかかりそうです…….ここへの書き込みができなくなるまで1ヶ月程度あるので、それまでに解決できなければその時に.

返信

2022/03/11 20:23 light289 への返信

自身のメモ兼保守書き込みで申し訳ないですが…….

「Framework の Core Graphics に含まれる関数 CGWindowListCopyWindowInfo を使用すればすべてのウインドウの情報が得られる」という話を聞きつけ実験したのですが、戻り値が BAImmediateData クラスの値となり、具体的な値を取り出せそうにありません.関数 CGWindowListCopyWindowInfo の戻り値が構造体であることまではわかったのですが、それ以上のことはさっぱりで.

#AppleScript
use AppleScript version "2.5" -- macOS 10.10 later
use framework "Cocoa"
use scripting additions
set res to current application's CGWindowListCopyWindowInfo(current application's kCGWindowListOptionOnScreenOnly, current application's kCGNullWindowID)
display dialog res's className() as string --> [Log]BAImmediateData



ところが、JaveScriptを使用すると具体的な値がログを確認する限り、得られています.それはもうたくさんのデータが…….

-- JaveScript
ObjC["import"]('Cocoa');
res = $.CGWindowListCopyWindowInfo($.kCGWindowListOptionOnScreenOnly, $.kCGNullWindowID);
[Log]$([$({"kCGWindowLayer":$(25),"kCGWindowAlpha":$(1),"kCGWindowMemoryUsage":$(1248),"kCGWindowIsOnscreen":$(true),"kCGWindowSharingState":$(0),"kCGWindowOwnerPID":$(478),"kCGWindowNumber":$(196),"kCGWindowOwnerName": 他たくさん.


とはいえ、これらのデータを AppleScript 側へ渡す方法がわからないので、やはりここで詰むようです.まいりました.AppleScript と JaveScript の連携ができれば今回の問題も解決できると思うのですが、その「連携」に関する質問自体はこのスレッドの話題から逸れるので今回は遠慮します.


また何かわかれば書き込みます.




返信

2022/03/11 21:15 light289 への返信

> これらのデータを AppleScript 側へ渡す方法


run script を使ってみるとか。ただ、これもバグがあって、with parameters オプションを付けるとクラッシュします...。同オプションが不要ならこんな感じでしょうか。


on run
    set js to "// JavaScript
'use strict';

ObjC.import('Cocoa');

function run() {
    const res1 = $.CGWindowListCopyWindowInfo(
        $.kCGWindowListOptionOnScreenOnly,
        $.kCGNullWindowID
    );
    const res2 = ObjC.deepUnwrap(res1);
    return res2;
}"

    run script js in "JavaScript"
end run


返信

2022/03/29 22:18 Hiro__S への返信

お返事が遅れまして、すいません.別件で調べ物をしているうちに(といってもかなり近しい内容ではありますが)たまたま再びたどり着き、このページを確認した次第です.ひとまずご提示いただいたサンプルコードを実行してみると、すばらしいですね、正しく結果が得られています.ここからウインドウIDを取り出し、その値を元にウインドウを閉じることができると思っているので、試してみます.もっとも、確証はありませんが……

すいません.あまり時間がないもので、またあらためてお返事を書かせていただきます.

返信

2022/02/07 22:46 light289 への返信

まず、Automator の「記録」について。


Automator で「記録」した結果は下図のようにすると AppleScript のコードを得ることができます。で、その中から必要な部分を抜き出してコードを整えると、簡単に AppleScript を作成できます。



返信

このスレッドはシステム、またはAppleコミュニティチームによってロックされました。 問題解決の参考になる情報であれば、どの投稿にでも投票いただけます。またコミュニティで他の回答を検索することもできます。

バナー「互換性のないディスク」を表示しない、またはそもそも出ないようにしたい.あるいは……

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。