TwitterをObjective-Cから使う1(MGTwitterEngineにlibxml2を組み込む)

先人の知恵を拝借します。Mattさんのホームページに行き、MGTwitterEngineを利用させていただきます。
http://mattgemmell.com/source
一通りの、Twitter APIをコールするメソッドが用意されており、NSArrays, NSDictionarys, NSStrings, NSDatesの形で結果を返してくれます。
今では、OAuth認証にも対応していますので、これで一通りのことはできそうです。OAuth認証は、OAuth Consumerを使います。
https://github.com/jdg/oauthconsumer


MGTwitterEngineで、何ができるかを知るには

  • MGTwitterEngine.h

を見ればいいと思います。

たとえば、statuses/public_timelineのAPIなら、MGTwitterEngine.hにこんな形で実装されていることがわかります。

- (NSString *)getPublicTimeline; // statuses/public_timeline




それでは、使うための準備を進めましょう。MGTwitterEngineのソースを、自分のプロジェクトに追加します。
Twitter APIでsearch(※1)以外は、Twitterからの戻りがjson, xml形式です。searchを使わないのであれば、パーサーはlibxmlでいいと思います。
そのためlibxml関連(※2)のファイルを、プロジェクトに追加します。

また、libxmlを使うには、MGTwitterEngine.mの#defineを変更しておきます。

#ifndef USE_LIBXML
//  if you wish to use LibXML, add USE_LIBXML=1 to "Precompiler Macros" in Project Info for all targets
#   define USE_LIBXML 1
#endif

libxmlを使うために、ヘッダ検索パス(include/libxml2)の追加を行います。

framework(libxml2.dylib)の追加を行います。

続いて、OAuth Consumerも、ソースに追加します。

"iPhone ready" simply means you just need to add the files to Xcode, and import "OAuthConsumer.h".

If you're rolling with the iPhone:

1) Be sure to add Security.framework.
2) Include libxml2.dylib in your frameworks.  You also need to add a
build property to the project -- "header search paths" needs to 
include "$SDKROOT/usr/include/libxml2" with "Recursive" checked.

Be sure to include sys/types.h.

ということみたいです、libxml関連はさきほど追加しましたので、残りのSecurity.frameworkを追加します。

また、sys/types.hをincludeしてくださいとのことなので、sha1.cを変更します。#include を追加しておきます。

// From http://www.mirrors.wiretapped.net/security/cryptography/hashes/sha1/sha1.c
#include <sys/types.h>

typedef struct {
    u_int32_t state[5];
    u_int32_t count[2];
    u_int8_t buffer[64];
} SHA1_CTX;

extern void SHA1Init(SHA1_CTX* context);
extern void SHA1Update(SHA1_CTX* context, u_int8_t* data, u_int32_t len);
extern void SHA1Final(u_int8_t digest[20], SHA1_CTX* context);

これで、だいたい準備は完了、コンパイルします。コンパイルが通ればおめでとうございます。


OAAttachmentが、下記のような場合は訂正が必要です。
ファイル:OAAtachment.h

#import <Foundation/Foundation.h>


@interface OAAttachment : NSObject {
	NSString *name;
	NSString *fileName;
	NSString *contentType;
	NSData *data;
}

@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *fileName;
@property (nonatomic, copy) NSString *contentType;
@property (nonatomic, copy) NSData *data;

- (id)initWithName:(NSString *)aName filename:(NSString *)aFilename contentType:(NSString *)aContentType data:(NSData *)aData;

@end

ファイル:OAAtachment.m

#import "OAAttachment.h"

@implementation OAAttachment

@synthesize name, filename, contentType, data;

- (id)initWithName:(NSString *)aName filename:(NSString *)aFilename contentType:(NSString *)aContentType data:(NSData *)aData{
	self = [super init];
	if(self){
		self.name = aName;
		self.filename = aFilename;
		self.contentType = aContentType;
		self.data = aData;
	}
	return self;
}

- (void)dealloc{
	[name release];
	[filename release];
	[contentType release];
	[data release];
	[super dealloc];
}

@end

ファイル名が間違えています、ファイル名を変更します。

  • OAAtachment.h -> OAAttachment.h
  • OAAtachment.m -> OAAttachment.m

メンバ変数名が間違えています、OAAttachment.mを訂正します。

  • filenameを、fileNameに訂正します。

これで、コンパイルが通ります。




※1 TwitterでSearchのAPIだけ、Twitter APIからの戻りがjson, atom形式で返されます。MGTwitterEngineでは、json形式のみ対応しています、json形式をパースするのにyajlかTouchJSONのライブラリを使います。

#if YAJL_AVAILABLE || TOUCHJSON_AVAILABLE

// Search method

- (NSString *)getSearchResultsForQuery:(NSString *)query;
- (NSString *)getSearchResultsForQuery:(NSString *)query sinceID:(MGTwitterEngineID)sinceID startingAtPage:(int)pageNum count:(int)count; // search
- (NSString *)getSearchResultsForQuery:(NSString *)query sinceID:(MGTwitterEngineID)sinceID startingAtPage:(int)pageNum count:(int)count geocode:(NSString *)geocode;

// Trends method

- (NSString *)getCurrentTrends; // current trends

#endif



※2 各パーサーごとに利用するファイル

  • LIBXML
MGTwitterLibXMLParser
MGTwitterStatusesLibXMLParser
MGTwitterMessagesLibXMLParser
MGTwitterUsersLibXMLParser
MGTwitterMiscLibXMLParser
MGTwitterSocialGraphLibXMLParser
  • YAJL
MGTwitterStatusesYAJLParser
MGTwitterMessagesYAJLParser
MGTwitterUsersYAJLParser
MGTwitterMiscYAJLParser
MGTwitterSearchYAJLParser
  • TOUCHJSON
MGTwitterTouchJSONParser
  • NSXMLParser
MGTwitterXMLParser
MGTwitterStatusesParser
MGTwitterUsersParser
MGTwitterMessagesParser
MGTwitterMiscParser
MGTwitterSocialGraphParser
MGTwitterUserListsParser