クックパッド開発者ブログスマートフォン用の表示で見るクックパッド開発者ブログ2014-09-18iOSシミュレータをカスタマイズして、オリジナルの機能を追加しようモバイルファースト室でiOSアプリケーションの開発を行っている@yuseinishiyamaです。クックパッドでは日々の業務を効率よく行うためのツールを作り、公開するということが積極的に行われています。社内のリポジトリや掲示板を探せば、便利なツールをたくさん見つけることができるような環境です。した文化のお陰で、作業時間の短縮、自動化が容易となり、結果として「ユーザーの方々に価値を届ける」という本質的な作業に費やす時間を増やすことができます。私も先日、iOSシミュレータをカスタマイズして作業効率を上げる機能を実装してみたので、その方法を紹介いたします。以下の環境で動作確認済みです。他の多くの環境でも動くと思われますが、保証できません。Bundleを作成します。Bundleは通常のアプリケーションと同じ構造を持っています。実行可能なファイルやリソースファイルを含むディレクトリです。通常のアプリケーションとは異なり、main関数を持っていません。Bundleのロードは、それを利用するアプリケーション側の責任となっています。Bundleには以下のような用途があります。コンポーネントの遅延ロードを行う。使用されていないコードがメモリ上に展開されないので、メモリの節約になります。一部のソースコードを個別にコンパイル可能なコードに分ける。アプリケーションにプラグイン機能を設ける。詳しくは下記のリンクを参照してください。Bundleをロードすることができます。(void)loadなどをエントリーポイントとして、既存のアプリケーションを拡張することができます。installの項を参考にしてください。Library内のBundleを選択します。任意の情報を入力してください。Extensionを変更する必要はありません。プロジェクトが作成されたら、ターゲットのInfo.plistを編集します。Info.plistにSIMBLTargetApplicationsというキーを追加します。それぞれ、拡張したいアプリケーションのバンドルID、拡張が実行可能なバージョンの最大値、最小値を記載します。特定のバージョンでしか拡張したくないという場合は、適宜バージョンの値を修正してください。事前準備は以上で終了です。この状態のバンドルを組み込んでも何も起こらないので試しにログを出力できるようにしてみましょう。ログを出力する自前のクラスを作成し、ロード時にログを出力するように実装します。Succeed!");}@endビルドし、SIMBLのプラグインディレクトリに配置します。Support/SIMBL/Plugins内に移動させます。iOSシミュレータを起動し、ログを確認します(起動中の場合は再起動してください)。これで、自前のクラスがロードされたことが確認できました。これだけではつまらないですね。拡張内容に不備があったりすると、当然アプリケーションがクラッシュしてしまいます。SIMBLのところにあるチェックボックスをオフにしてください。先ほど作成したクラスのロード時にメニューバーのアイテムを追加するコードを実行します。<Cocoa/Cocoa.h>をインポートするのを忘れないようにしてください。Succeed!");}@endこの状態で、再度ビルドしたバンドルをプラグインのディレクトリに追加し、シミュレータを再起動してみましょう。すると、下記のようになります。メニューが追加されていることが確認できます。この状態で、メニューを選択したり、ショートカットコマンドを入力したりするとログが出力されるはずです。さらなる拡張、しかし...さて、ここまでできれば、拡張したクラス内でシェルコマンドを実行したりするなど色々な活用方法が見えてきます。これだけでは不十分です。場合によっては、iOSシミュレータ既存のコードを呼び出したり、iOSシミュレータのコードを書き換えたりする必要がでてくるかもしれません。詳細は割愛しますが、Objective-Cでは実行時に既存のメソッドを別のものに置き換えたりすることは容易に実現できます。置き換える対象のメソッドシグネチャが分からなければ、どうすることもできません...class-dumpのインストールそこで、バイナリファイルからiOSシミュレータのクラス情報をダンプしてみましょう。class-dumpを使用します。class-dumpはMach-O形式のバイナリファイル内に格納されている実行時情報を出力するためのツールです。標準で提供されているotoolでも同様のことが可能ですが、class-dumpではObjective-Cスタイルの宣言方法に置き換えて出力してくれるため、簡単に読むことができます。class-dumpのインストール方法は色々ありますが、下記のものが簡単です。class-dumpするダウンロードできたら、下記のコマンドを実行してください。Simulator大量の変数名やメソッドプロトタイプが出力されたはずです。そこから、拡張に利用できそうな変数やメソッドを推測することができます。iOSシミュレータ既存の機能でさえも、自分の拡張から呼び出したり、挙動を変更したりすることが可能になります。終わりにいかがでしたでしょうか?アイデアさえあれば比較的簡単に既存のアプリケーションを拡張できることがお分かりいただけたかと思います。この記事を参考にして、皆様もご自身で便利な機能を追加して開発効率をあげていっていただければ幸いです。11:00iOSシミュレータをカスタマイズして、オリジナルの機能を追加しようTweet関連記事2019-07-05Firebaseで運用するKomercoの管理用アプリケーションの開発こんにちは。アプリケーションをなんとかしよう。計測と可視化からはじめよう。