3. iPhone開発

今回は、iPhoneアプリ開発にPOCOを使う方法を詳解します。
まずiPhone SDKがインストールされていて、以下のチュートリアルを実行してHello Worldプロジェクトができていることをスタート地点とします。
http://knol.google.com/k/iphone-sdk-helloworld#

POCOをXcodeで使うには、以下の3点が必要です。
・POCOをiPhone用にビルド&デプロイする。
・Xcodeプロジェクト設定をPOCO用に変更する。
・Object-C++で、POCOを使う。

それでは、ボタンを押したときにPOCOサンプルのTimeServerから現在時刻を取得してラベルに表示するようにHello Worldプロジェクトを改造してみましょう。

1. 以下の手順で、POCOをiPhone用にビルド&デプロイします。

Shell
1
2
3
$ ./configure --config=iPhone --omit=Crypto,NetSSL_OpenSSL,Data/ODBC,Data/MySQL
$ make -s
$ sudo make -s install

2. Xcodeプロジェクト設定画面を開いて(Project->Edit Project Settings)、Buildタブの設定を変更/追加します。

Shell
1
2
3
4
5
Other Linker Flags =    -l PocoFoundationd -l PocoNetd
Header Search Paths    = /usr/local/include
Library Search Paths    = /usr/local/lib
GCC_ENABLE_CPP_EXCEPTIONS = YES (追加)
GCC_ENABLE_CPP_RTTI = YES(追加)

3. Object-C++からはFacadeを経由してPOCOを使うものとしてHello Worldプロジェクトを改造します。

まず、MainView.mファイルをMainView.mmへ名前変更して、Object-C++用にします。
ラベルの文字列セットをFacadeメソッド呼び出しで行うように改造します。改造後のソースは以下のようになります。

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#import "MainView.h"
#import "PocoFacade.h"
@implementation MainView
@synthesize mainText;
- (IBAction)showText {
// mainText.text = @"Hello World";
    
    PocoFacade* facade = [[PocoFacade alloc] init];
mainText.text = [facade getCurrentDate];
    [facade release];
}
@end

次にFacadeクラスのヘッダファイルと実装ファイルを追加します。追加したヘッダファイルと実装ファイルはそれぞれ以下のようになります。

ヘッダファイル;

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#import <Foundation/Foundation.h>
class PocoFacadeImpl {
    
public:
    PocoFacadeImpl();
    void setCurrentDate(char* buffer);
    
};
@interface PocoFacade : NSObject {
    
@private
    PocoFacadeImpl *poco;
    
}
- (id)init;
- (void)dealloc;
- (NSString*)getCurrentDate;
@end

実装ファイル:

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#import "PocoFacade.h"
#import <string>
#include "Poco/Net/DialogSocket.h"
#include "Poco/Net/SocketAddress.h"
using Poco::Net::DialogSocket;
using Poco::Net::SocketAddress;
PocoFacadeImpl::PocoFacadeImpl(){}
void PocoFacadeImpl::setCurrentDate(char* buffer) {
    DialogSocket ds;
    ds.connect(SocketAddress("localhost", 9911));
    std::string now;
    ds.receiveMessage(now);
    strncpy(buffer, now.c_str(), now.length());
}
@implementation PocoFacade
- (id)init {
if (self = [super init]) {
poco = new PocoFacadeImpl();
}
    
return self;
}
- (void)dealloc {
delete poco;
[super dealloc];
}
- (NSString*)getCurrentDate {
    char buffer[128];
    poco->setCurrentDate(buffer);
    return [NSString stringWithUTF8String:buffer];
}
@end

Comments are closed.