CocoaHTTPServer を利用して iOS アプリにブラウザからアクセスする

2014.05.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

iOS アプリに CocoaHTTPServer の機能を組み込むOSS「CocoaHTTPServer」

ひょんなことから CococaHTTPServer を使うこと機会があったのでメモ。

CococaHTTPServer を利用すると、iOS アプリを HTTP サーバーとして利用することができます。

HTTP サーバーのようにドキュメントルートとなるディレクトリを用意して HTML ファイルなどを置けば、同一ネットワーク上であれば普通にブラウザからアクセスできます。

また、CococaHTTPServerのREADMEを見ると、

  • bonjourブロードキャストのサポート
  • IPv4/IPv6のサポート
  • GCDと標準のソケットを使用した非同期ネットワーク処理
  • パスワード保護をサポート
  • SSL/TLS暗号化のサポート
  • WebSocketのサポート
  • WebDAVのサポート

と書かれており、他にも

  • 高速でメモリ効率が良いよ
  • 拡張性が高いよ
  • しかも簡単に拡張可能だよ
  • たくさんコメント書いてるよ

といった特徴があるらしいです。 ライセンスは New BSD License とのこと。

ということで、今回はとりあえず 「iOSアプリ内にある静的なHTMLページにブラウザからアクセスする」ところまで解説します。

サンプルプロジェクトを作る

さて、いつも通りテキトーにプロジェクトを作りましょう。

ここでは Single View ApplicationCocoaHTTPServerSample という名前でプロジェクトを作成しました。

CocoaPods で CocoaHTTPServer をインストールする

最近ほとんどの OSS が CocoaPods でインストールできるようになりましたね。楽ちんです。

Podfile を作成して、以下のように記述しましょう。

pod 'CocoaHTTPServer'

CocoaHTTPServer は、

  • CocoaAsyncSocket
  • CocoaLumberjack

に依存するらしいので、pod install を実行すると、勝手にこいつらもインストールされます。

ドキュメントルートを用意する

MAMP や XAMPP でいうところの htdocs ですね。web とか public_html って名前だったりもしますね。

この辺の名称は設定次第ですので、とりあえず今回は htdocs で行きましょう。

プロジェクトディレクトリ配下に htdocs という名前の空のディレクトリを作成します。

ios-cocoahttpserver-1-1

htdocs に以下のような簡単な HTML ファイルを作成しましょう。名前は index.html にしておきます。

index.html

<!DOCTYPE HTML>
<html lang="ja">
<head>
    <meta charset="utf-8" />
    <title>CocoaHTTPServer を利用して iOS アプリにブラウザからアクセスする</title>
</head>
<body>
    <strong>こんにちは、みなさーーん!</strong>
</body>
</html>

作成した htdocs を Xcode プロジェクトに追加します。

ios-cocoahttpserver-1-2

このとき、Folders のオプションで 「Create folder references for any added folders」を選択する必要があるので、忘れずにチェックして下さい!

ios-cocoahttpserver-1-3

以下のように表示されていれば、ドキュメントルートの準備は完了です。

ios-cocoahttpserver-1-4

サンプルコードを実装する

さて、今回は「iOSアプリ内にある静的なHTMLページにブラウザからアクセスする」ことが目的です。

具体的には、Safariなどのブラウザで先ほど作成したHTMLを表示します。

AppDelegate.m を以下のように実装しましょう。

AppDelegate.m

#import "AppDelegate.h"

#import <CocoaHTTPServer/HTTPServer.h>

@interface AppDelegate ()

/**
 HTTPサーバーインスタンス
 */
@property (strong, nonatomic) HTTPServer *httpServer;

@end

@implementation AppDelegate

#pragma mark - AppDelegate lifecycles

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // HTTPサーバーインスタンスを生成する
    self.httpServer = [HTTPServer new];

    // ポート未指定の場合ランダムで設定されるので、適当なポート番号を指定する
    self.httpServer.port = 50000;

    // ドキュメントルートに「htdocs」を指定する
    self.httpServer.documentRoot = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"htdocs"];

    // HTTPサーバーを起動する
    [self startServer];

    return YES;
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // HTTPサーバーを停止する
    [self stopServer];
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    // HTTPサーバーを起動する
    [self startServer];
}

#pragma mark - Private mehtods

/**
 HTTPサーバーを起動する
 */

- (void)startServer
{
    NSError *error;

    if (![self.httpServer start:&error]) {
        NSLog(@"Error starting HTTP Server: %@", error);
    }
}

/**
 HTTPサーバーを停止する
 */
- (void)stopServer
{
    [self.httpServer stop];
}

@end

簡単に説明しますと、アプリ起動時に HTTPServer クラスのインスタンスを生成し、ポート番号に 50000、ドキュメントルートに先ほど作成した htdocs を指定して、HTTPサーバーを開始します。

アプリがバックグラウンド/フォアグラウンドに切り替わるときにそれぞれのタイミングで HTTP サーバーが停止/起動します。

サンプルアプリを実行してみよう

それでは、サンプルアプリを実行してみましょう。

iOS シミュレータで確認する

まずは、iOS シミュレータでデバッグ実行してみましょう。iOS アプリが真っ白な画面で表示されるはずです。

PC にインストールされているブラウザを起動して、http://127.0.0.1:500000 にアクセスしてみましょう。または、http://[PCマシン名].local:50000 でもアクセスできます。

アクセスしてみると、用意した HTML が表示されていることが確認できます。

ios-cocoahttpserver-1-5

実機で確認する

実機で確認する場合は、実機をブラウザを起動する PC と同じネットワークに接続する必要があります。

同じネットワークに接続したら割り振られた IP アドレスを確認して、デバッグ実行します。

実行したら、ブラウザより http://[割り振られた IP アドレス]:50000 にアクセスしてみましょう。

シミュレータと同様、用意した HTML が表示されるはずです。

まとめ

CocoaHTTPServer 使えば、簡単に iOS アプリを HTTP サーバーとして利用することが可能です。

とりあえず最終的には、カメラロールにブラウザからアクセスするサンプルアプリぐらいは作りたいと思います。

次回は、動的な HTML を返す場合のサンプルを解説したいと思います。