non vorrei lavorare

昔はおもにプログラミングやガジェット系、今は?

MacRubyのスクリプトをCocoaアプリ化出来た

こんばんは、急に奥さんが熊本に出張になってしまい、数日父子家庭だった@kjunichiです。次男はホントに要領がよく、いたづらばかりしてますが、就寝と起床はホントに手間いらず、長男がそういったポイントだけ、頑張りましょう!っといった感じで過ごしました。

 

はじめに

XCode6ではGCのサポートが終了したLLVM 6.0の為、MacRuby.frameworkはメモリ管理がGC方式に対応されているので、単純にCocoaアプリをXCodeで作成して、そのなかでMacRubyを呼び出すような作りにすると、ビルドで「GC対応は終了しました。」のエラーとなる。

発想の転換

それでもNode.jsをMacアプリ化するをやるの記事で、任意のスクリプトCocoaアプリ化できた。MacRubyスクリプトもこの方法でCocoaアプリ化出来る。

ところで、なんでCocoaアプリ化にこだわっているのか

実は、

Cocoaアプリ化すれば、「システム環境設定」→「セキュリティとプライバシー」→「アクセシビリティ」の設定を個別に設定可能となり、ターミナルを一時的に許可して使うというリスクのある運用を回避できるから、Cocoaアプリ化を目指していた。

どうもミニマムのCocoaアプリ化だと問題が

ミニマムのCocoaアプリ化だとこのアクセシビリティの許可を覚えてくれない。

対応策

動いた

f:id:kjw_junichi:20181010201110p:plain

 

f:id:kjw_junichi:20181010201140p:plain

f:id:kjw_junichi:20181010201207j:plain

コード例

実行バイナリと差し替えるシェルスクリプト

#!/bin/sh
cwd=`dirname "${0}"`

# ${0} が 相対パスの場合は cd して pwd を取得
expr "${0}" : "/.*" > /dev/null || cwd=`(cd "${cwd}" && pwd)`

rbPath="$cwd/../Resources/main.rb"
/usr/local/bin/macruby $rbPath

Ruby2.0に対応したRubyCocoa1.2.0じゃダメなの

RubyCocoaのメモリ管理はGC方式では無いので、XCode6でもフレームワークをリンク出来た。俺の現在の技術力では、APIでブロック構文が使われているNSEvent.addGlobalMonitorForEventsMatchingMask_handler_をクリア出来なかった。

Link

関連記事

6年前の記事

5年前の記事

2年前の記事