こんばんは、急に奥さんが熊本に出張になってしまい、数日父子家庭だった@kjunichiです。次男はホントに要領がよく、いたづらばかりしてますが、就寝と起床はホントに手間いらず、長男がそういったポイントだけ、頑張りましょう!っといった感じで過ごしました。
はじめに
XCode6ではGCのサポートが終了したLLVM 6.0の為、MacRuby.frameworkはメモリ管理がGC方式に対応されているので、単純にCocoaアプリをXCodeで作成して、そのなかでMacRubyを呼び出すような作りにすると、ビルドで「GC対応は終了しました。」のエラーとなる。
発想の転換
それでもNode.jsをMacアプリ化するをやるの記事で、任意のスクリプトをCocoaアプリ化できた。MacRubyのスクリプトもこの方法でCocoaアプリ化出来る。
ところで、なんでCocoaアプリ化にこだわっているのか
実は、
をCocoaアプリ化すれば、「システム環境設定」→「セキュリティとプライバシー」→「アクセシビリティ」の設定を個別に設定可能となり、ターミナルを一時的に許可して使うというリスクのある運用を回避できるから、Cocoaアプリ化を目指していた。
どうもミニマムのCocoaアプリ化だと問題が
ミニマムのCocoaアプリ化だとこのアクセシビリティの許可を覚えてくれない。
対応策
動いた
コード例
実行バイナリと差し替えるシェルスクリプト
#!/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_をクリア出来なかった。