要想成功编译MailCore框架不是一件容易的事情。当你从 https://github.com/mronge/MailCore.git下载MailCore,并打开MailCore.xcodeproj,总是会在编译时遇到各种错误。如果你想简单一点,那么可以使用Google的reMail。reMail使用了MailCore框架,它已经实现了一个可以在iPhone客户端快速查找指定邮件的Mail程序。经过简单修改,你可以把reMail使用在你的项目中。甚至你可以直接使用reMail中附带的MailCore框架——请参考另一篇文章《从reMail中获取MailCore框架》。
但是,reMail中的MailCore已经过时了——它并不是最新的MailCore源代码。如果你要更新至MailCore1.0以后版本,那么你必须直接从github获得MailCore的最新版本。
这个工作并不简单,你需要参考一系列复杂步骤,正如本文所述。
一、下载MailCore最新版本
执行下列脚本,你可以在本地硬盘是获得一份MailCore的最新代码:
git clone https://github.com/mronge/MailCore.git
cd MailCore/
git submodule update --init
二、把MailCore加入到项目
从Finder中将下载到的MailCore.xcodeproj拖到你的Xcode项目中。这会将MailCore.xcodeproj作为子项目添加到你的项目中。在Xcode的ProjectNaviagtor窗口,可以看到如下图所示的项目结构:
这些项目存在相互依赖的关系。其中,TestApp依赖于MailCore.xcodeproj项目(的libmailcore.a),MailCore.xcodeproj依赖于libetpan.xcdoeproj(的libeptan_mac.a),libetpan.xcodeproj依赖于Cyrus SASL.xcodeproj(的libsasl2.a),Cyrus SASL.xcodeproj依赖于openssl.xcodeproj(的libssl.a和libcrypto.a)。
首先,我们来编译libetpan。
从Scheme中选择static libetpan iOS->iPhone Simulator5.1,编译,OK。
接下来编译MailCore。
从Scheme中选择MailCore iOS --> iPhone Simulator5.1,编译,出现编译错误:
错误很多,主要是CTCoreFolder.m和CTCoreMessage.m中的方法前置声明的问题。
首先打开CTCoreFolder.h,增加如下方法声明:
- (const char*)getUTF7String:(char *)buffer fromString:(NSString *)str;
再打开CTCoreMessage.h,增加如下方法声明:
- (void)_buildUpBodyText:(CTMIME*)mime result:(NSMutableString *)result;
- (void)_buildUpHtmlBodyText:(CTMIME *)mime result:(NSMutableString*)result;
- (NSSet*)_addressListFromMailboxList:(struct mailimf_mailbox_list *)mailboxList;
- (structmailimf_mailbox_list*)_mailboxListFromAddressList:(NSSet*)addresses;
- (CTCoreAddress*)_addressFromMailbox:(struct mailimf_mailbox *)mailbox;
- (struct mailimf_address_list*)_IMFAddressListFromAddresssList:(NSSet*)addresses;
- (NSArray *)_stringArrayFromClist:(clist *)list ;
- (clist *)_clistFromStringArray:(NSArray *)strings ;
- (NSSet*)_addressListFromIMFAddressList:(struct mailimf_address_list *)imfList;
- (void)_releaseMailimfSingleFields:(struct mailimf_single_fields*)fields ;
再次编译,OK。
打开TestApp的Target“TestApp”,在Build Phases的Target Dependencies中增加项目依赖MaiCoreiOS。
在Link Binary With Libraries中增加如下框架和库:
libmailcore.a libssl.a libsasl2.a libcrypto.a libiconv.dylib CFNetwork.framework
切换到Build Settings,在Header Search Paths中增加两个路径:
../../mailcore/libetpan/build-mac/include
../../mailcore/Source
分别是MailCore和Libetpan的头文件搜索路径。这个路径是相对于项目目录而言的,请根据你的实际情况进行修改。
现在,可以在你的项目中import "CTCoreAccount.h"了。