ひとりぶろぐ

価値ある情報をユーザー視点で発信するブログ

iPhone SDK不要でSBSettingsトグル開発ができるSBSettings Scripty

      2016/03/16

BossPrefsのことを覚えている人は、きちんとした開発環境を用意しないとトグルが作れない、SBSettingsのことを恨めしく思うこともあるでしょう。

BossPrefsはシェルスクリプトを書きさえすれば、機能を追加できたのに、と。

そして、待てど暮らせど開発環境無しでSBSettingsトグル(以下トグルと略記)が作れるようにならないことに対し、半ば諦めの気持ちでいたはずです。

しかし、そんな日々も今日でおしまいです。

今回作ったSBSettings Scriptyは、C言語、Objective-Cに足を踏み入れること無しに、シェルスクリプトベースでトグルを作ることができる、ツールキットのようなものです。

Scriptyを使ってトグルを作るのは簡単です。
シェルスクリプト、plistを書き、ファイルを所定の位置に設置するだけです。それだけで、自分だけのトグルが完成します(本当はもう少し手順あり。後述)。

もちろん、できることはシェルスクリプトでできる範囲に限ります。

しかし、シェルスクリプトの代わりにRuby、Pythonなどを使うこともできますし、工夫次第では可能性は小さくないでしょう。ぜひ、SBSettings Scriptyで自分だけのトグルを作ってみてください。(続きは[MORE]から)

とりあえず動かしてみる

New野良リポジトリからSBSettings Scriptyをインストールしてください。

「SBSettings Scripty」で検索してください。無保証です。

いっしょに、動作に必要なscriptydがインストールされます。

インストールが済むと、SBSettings上に、Scripty01、Scripty02というトグルが現れるはずです。

これがScriptyを使って作られたトグルです。

Scripty01、Scripty02をタップしてみると、タップするやいなやSBSettingsのウインドウが格納され、次にSBSettingsを起動してみると、色が赤から緑に変わっているはずです。
Scripty01、Scripty02をどんどんタップしていくと、色が緑、赤、緑、赤と交互に切り替わることが分かると思います。

また、「/var/mobile/scripty.txt」というテキストファイルが出来ており、中を見ると次のようなテキストがScripty01、Scripty02を起動するごとに追記されていることが分かります。

com.hitoriblog.Scripty01-launch-when-toggle-is-on
com.hitoriblog.Scripty02-launch-when-toggle-is-on
com.hitoriblog.Scripty01-launch-when-toggle-is-off
com.hitoriblog.Scripty02-launch-when-toggle-is-off
com.hitoriblog.Scripty01-launch-when-toggle-is-off
com.hitoriblog.Scripty02-launch-when-toggle-is-off
com.hitoriblog.Scripty01-launch-when-toggle-is-on

つまり、Scripty01、Scripty02は交互に状態を切り替え、さらにテキストにログを書き出しているわけです。

構成ファイルを確認

Scriptyベースのトグルは、どんなファイルから成り立っているのか? それを見ていきます。

管理ファイルは省略しましたが、SBSettings Scriptyには以下のファイルが入っています。
一つのパッケージにScripty01、Scripty02の二つが入っていますので、それぞれに分けてリストアップします。

*Scripty01

/var/mobile/Library/SBSettings/Toggles/Scripty01/Info.plist
/var/mobile/Library/SBSettings/Toggles/Scripty01/Toggle.dylib
/var/mobile/Library/SBSettings/Themes/Default/Scripty01
/var/mobile/Library/SBSettings/Commands/com.hitoriblog.Scripty01-launch-when-decision-state
/var/mobile/Library/SBSettings/Commands/com.hitoriblog.Scripty01-launch-when-toggle-is-off
/var/mobile/Library/SBSettings/Commands/com.hitoriblog.Scripty01-launch-when-toggle-is-on

*Scripty02

/var/mobile/Library/SBSettings/Toggles/Scripty02/Info.plist
/var/mobile/Library/SBSettings/Toggles/Scripty02/Toggle.dylib
/var/mobile/Library/SBSettings/Themes/Default/Scripty02
/var/mobile/Library/SBSettings/Commands/com.hitoriblog.Scripty02-launch-when-decision-state
/var/mobile/Library/SBSettings/Commands/com.hitoriblog.Scripty02-launch-when-toggle-is-off
/var/mobile/Library/SBSettings/Commands/com.hitoriblog.Scripty02-launch-when-toggle-is-on

一つのトグルにつき、一つのToggle.dylib、一つのInfo.plist、そして三つのシェルスクリプトから構成されています。
Toggle.dylibは全くサイズが同じで、同じものを共用していることが分かると思います。

基本設定はInfo.plistで

Scriptyベースのトグルは、Toggle.dylibと同ディレクトリに置くInfo.plistで、その基本的な設定をします。
中身は以下のようなものです(Scripy01のInfo.plist)。

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”>
<plist version=”1.0″>
<dict>
<key>ScriptyId</key>
<string>com.hitoriblog.Scripty01</string>
<key>ShouldTransitionOut</key>
<true/>
<key>HasStatus</key>
<true/>
<key>DelayTime</key>
<integer>0</integer>
<key>AllowInCall</key>
<true/>
</dict>
</plist>

要素の解説をします。

  • ScriptyId:トグルの識別子です。Scripty01では、「com.hitoriblog.Scripty01」にしています。これは、実行するスクリプト名の接頭辞にもなります
  • ShouldTransitionOut:トグルをタップした後、SBSettingsのウインドウを片付けるかどうかを決めます。値は「true」か「false」かの二者択一。「true」だとウインドウは片付き、「false」はその場にとどまります
  • HasStatus:OnとOffの状態を持つか、SBSettingsの黒アイコンのように状態を持たないかを決めます。値は「true」か「false」かの二者択一。falseの場合は常にOn状態となります
  • DelayTime:トグルを処理中にする時間を設定します。うまく反映されてない?ShouldTransitionOutを「true」にしてあると問答無用でウインドウが片付けられてしまいます
  • AllowInCall:電話をかけている間に有効にするかどうかを決定します。値は「true」か「false」かの二者択一

動作にかかわる三つのスクリプト

Info.plistのScriptyIdの後ろに「-launch-when-decision-state」、「-launch-when-toggle-is-on」、「-launch-when-toggle-is-off」を付けた、/var/mobile/Library/SBSettings/Commands/に置かれたスクリプトが当該トグルから実行されます。仮にScriptyIdが「hoge」だった場合は「hoge-launch-when-decision-state」といった具合です。
それぞれどんな役割を果たすか解説します。

  • [ScriptyId]-launch-when-decision-state:SBSettingsウインドウ表示時に実行されます。このスクリプトは、終了コード0もしくは1を返すことが期待されます。終了コードが1だった場合はトグルはOn(緑)状態となります。終了コードが0だった場合はトグルはOff状態(赤)となります。1以外の終了コードも0扱い、トグルはOff(赤)状態となります。(終了コード0をOn状態とするのが作法的に正しいことは承知してますが、あえて逆としました)
  • [ScriptyId]-launch-when-toggle-is-on:トグルがOn(緑)状態のときにトグルのアイコンをタップすると実行されるスクリプトです
  • [ScriptyId]-launch-when-toggle-is-off:トグルがOff(赤)状態のときにトグルのアイコンをタップすると実行されるスクリプトです


サンプルScript01の動作を読み解く

Scripty01のスクリプトの内容は以下のようなものです。

com.hitoriblog.Scripty01-launch-when-decision-state

フラグファイルが存在するかどうかを判定し、存在すれば終了コード1を返し、存在しなければ終了コード0を返します。
終了コード1の場合は、トグルがOn(緑)状態、終了コードが0の場合はトグルがOff(赤)状態となります。

#!/bin/sh

flagfile=/var/mobile/Library/Preferences/com.hitoriblog.Scripty01.flagfile

if [ -f $flagfile ]; then
# Toggle State -> ON
exit 1
else
# Toggle State -> OFF
exit 0
fi

com.hitoriblog.Scripty01-launch-when-toggle-is-off

トグルがOff状態のときに実行されます。Off状態ということはフラグファイルが存在しないということなので、touchコマンドでフラグファイルを生成しています。
また、このスクリプトが実行されたことを/var/mobile/scripty.txtにログとして記録しています。

#!/bin/sh

touch /var/mobile/Library/Preferences/com.hitoriblog.Scripty01.flagfile

echo “com.hitoriblog.Scripty01-launch-when-toggle-is-off” >>/var/mobile/scripty.txt

com.hitoriblog.Scripty01-launch-when-toggle-is-on

トグルがOn状態のときに実行されます。On状態ということはフラグファイルが存在するということなので、rmコマンドでフラグファイルを削除しています。
また、このスクリプトが実行されたことを/var/mobile/scripty.txtにログとして記録しています。

#!/bin/sh

rm /var/mobile/Library/Preferences/com.hitoriblog.Scripty01.flagfile

echo “com.hitoriblog.Scripty01-launch-when-toggle-is-on” >>/var/mobile/scripty.txt

新しいScriptyトグルを作る手順

ここまでの説明で勘のいい人はScriptyトグルを作れると思いますが、新しいScriptyトグルを作る手順を説明します。

  1. ファイルをコピーする:/var/mobile/Library/SBSettings/Toggles/Scripty01ディレクトリを、同階層に別の名前でコピー
  2. アイコンを用意:必要があらば、/var/mobile/Library/SBSettings/Themes/Default/以下に、Toggles以下に作ったディレクトリと同じ名前のディレクトリを作り、そこにon.png、off.pngを置く
  3. Info.plistを編集:コピーしたInfo.plistをテキストエディタなどで編集。少なくとも、ScriptyIdと、HasStatusを設定。iFileのplist Editorはplistを破壊するので使わないこと
  4. Commandsのスクリプトをコピー:/var/mobile/Library/SBSettings/Commands/に三つあるcom.hitoriblog.Scripty01-launch-when-*をコピー。「com.hitoriblog.Scripty01」の部分は、Info.plistに設定したScriptyIdに変更
  5. Respring:コピーしたトグルをSBSettingsに出現させるため、Respring
  6. sbsettingsdをkillall:/var/mobile/Library/SBSettings/Commands/に追加したスクリプトをsbsettingsdに認識してもらう必要があるため、sbsettingsdをroot権限でkillallする。「$ sudo killall sbsettingsd」
  7. コピーしたスクリプトを書き換え:Scripty01と同じ動作をすることを確認した上で、三つのスクリプトを書き換え

一緒に使うと楽しい仲間たち

Cydiaにいる仲間たちをインストールして、できることを増やしましょう。おすすめのコマンドを列記します。

  • sqlite3:iOS内でよく使われるsqliteデータベースを操作するコマンドです。電話の履歴を選択的に削除といったこともできそう
  • Erica Utilities:動かないコマンドもありますが、plistを操作できるplutilは特にトグルから使うのに有用でしょう
  • Ruby1.8.6:言わずと知れたRubyです。SaurikのリポジトリにあるRuby1.9は壊れているので、自分のNew野良リポジトリにある1.8.6を使うのが吉
  • Python:言わずと知れたPythonです

クリップボードにアクセスするにはどうしたらいいですか?

こちらを参照してください PasteboardStackerでiPhone、iPadのテキスト処理を極める

想定質問: 不要なdaemonはすべて殺すのが信条なので、scriptydを殺してもいいですか?

scriptydは、[ScriptyId]-launch-when-decision-stateを実行した結果をSBSettingsにフィードバックし、On/Off状態に反映させるために必要なdaemonなので、Scriptyを使う限りは殺してはなりません。

ただし、使っているScriptyトグルのInfo.plist内HasStatusがすべてfalseであるならば、殺してもOKです。

想定質問: 〜を〜するトグルはどうやって作るのですか?

自分で手段を切り開く人のためのScriptyです。

想定質問: 単刀直入に言って〜を〜するトグルを作ってください

自分で作れ。

既知の不具合

  • nop

動作確認環境

  • iOS 4.2.1 (iPadでは動作未確認)

履歴

  • 0.1-1 2011.04.20 初版
たのしいRuby 第3版
たのしいRuby 第3版

posted with amazlet at 11.04.20
高橋 征義 後藤 裕蔵
ソフトバンククリエイティブ
売り上げランキング: 5410
UNIXシェルスクリプトコマンドブック 第2版
山下 哲典
ソフトバンククリエイティブ
売り上げランキング: 32756
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
ブルース ブリン
ソフトバンククリエイティブ
売り上げランキング: 80095

 - iPad, iPhone, Jailbreak, ガジェット