13

我的目标是使用libphonenumber,这是我正在从事的 iPhone 项目的谷歌电话号码处理库。

下载它(和很多小时)后,我编译了库的 C++ 版本,它构建了一些“.a”文件和“.dylib”文件,我认为我必须将它们导入到我的 xCodeProject 中才能访问那些 C++ 函数。

所以我将“libphonenumber.a”导入到我的项目中,根据需要更新了我的目标、构建设置、构建阶段和库搜索路径。

为设备和模拟器通行证构建 xCode 项目,但是给我以下警告:“ld:警告:忽略文件 ../XcodeProjects/libphonenumber/build/libphonenumber.dylib,文件是为不受支持的文件格式构建的,这不是架构链接(armv7)”。(或为模拟器编译时为 i386)

我从中了解到我必须为正确的 i386 和/或 armv7 架构编译 libphonenumber。所以我尝试这样做,但很快意识到这需要我也为 i386/armv7 架构重建 libphonenumber 的 3 个依赖库,以便现在可以正确编译 libphonenumber。最终,我放弃了,它开始在我面前看起来像一团糟。

经过我所有的考验,我只剩下

3个问题:

1) 如何编译 libphonenumber C++ 库以用于 i386/armv6/armv7 架构。

2) 使用 c++ 库时,我的假设是否正确?是否只需导入编译产生的“.a”文件,然后在我的 xCode 项目文件的标题中指向它?在 xCode 中包含和使用 c++ 库以及从 Objective-c 访问它们的函数的具体步骤是什么?

3)我确实找到了 LPNKit,一个用于 libphonenumber 的objective-c 端口,但是它不完整。有没有人听说过它,并且有幸使用它?或者有没有人有一个完整的、工作的、关于如何正确编译和安装它的说明的 libphonenumber 的objective-c 端口?

任何关于如何让这个库在 iOS 上工作的帮助或建议都将不胜感激。

更新:

我最终使用了 javascript 版本的 libphonenumber,将所有文件添加到我的包中,包括所有引用的 javascript 库,并使用 UIWebview 和 stringByEvaluatingJavaScriptFromString 来运行函数。您还可以让 UIWebview 在线引用 javascript 库(我只是希望将所有内容都放在本地,以免依赖于 Internet 连接)。

这是我所做的一个示例:

webView_ = [[UIWebView alloc] init];
[webView_ loadHTMLString:
 @"<script src='base.js'></script>" 
 "<script>"
 "goog.require('goog.dom');"
 "goog.require('goog.json');"
 "goog.require('goog.proto2.ObjectSerializer');"
 "goog.require('goog.string.StringBuffer');"
 "</script>"
 "<script src=\"phonemetadata.pb.js\"></script>"
 "<script src=\"phonenumber.pb.js\"></script>"
 "<script src=\"metadata.js\"></script>"
 "<script src=\"phonenumberutil.js\"></script>"
 "<script src=\"asyoutypeformatter.js\"></script>"
 "<script src=\"normalize.js\"></script>"
                 baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] resourcePath]]];


NSString *function = [[NSString alloc] initWithFormat: @"phoneNumberParser('%@','%@','')", phoneNumber, ISOCountryCode];
NSLog(@"function is: %@", function);

NSString *result =[webView_ stringByEvaluatingJavaScriptFromString:function];

结果变量让我得到格式化的数字。

我希望这对遇到与我相同的问题的人有所帮助。

4

3 回答 3

6

它已由我们的团队移植。你可以找到它https://github.com/me2day/libPhoneNumber-iOS

于 2013-02-19T17:02:00.013 回答
3

请注意 libphonenumber Javascript 库包括 Google 的闭包库。

因此,您应该考虑将 Javascript 调用包装在 Javascript 对象中,然后使用闭包构建器对其进行编译,以获得高效且轻量级的脚本。(编译前关闭库:18Mb,编译后300Kb!)

请参阅上面的此类包装器示例

goog.provide('sphone.phonenumber');

goog.require('goog.dom');
goog.require('goog.json');
goog.require('goog.proto2.ObjectSerializer');
goog.require('goog.array');
goog.require('goog.proto2.PbLiteSerializer');
goog.require('goog.string');
goog.require('goog.proto2.Message');
goog.require('goog.string.StringBuffer');

goog.require('i18n.phonenumbers.NumberFormat');
goog.require('i18n.phonenumbers.PhoneNumber');
goog.require('i18n.phonenumbers.PhoneNumberUtil');


sphone.phonenumber = function(phoneNumber, regionCode) {
    this.getCountryCallCode=phonenumberGetCountryCallCode;
};

function phonenumberGetCountryCallCode(phoneNumber, regionCode) {
   var phoneUtil = i18n.phonenumbers.PhoneNumberUtil.getInstance();
    var number = phoneUtil.parseAndKeepRawInput(phoneNumber, regionCode);
    return number.getCountryCode();
};


// Ensures the symbol will be visible after compiler renaming.
goog.exportSymbol('sphone.phonenumber', sphone.phonenumber);
于 2012-05-21T09:13:47.303 回答
2

1)修复所有错误并重新编译arm的所有依赖项。正如你之前所说。

2) 是的。根据kstenerud 的 iOS-Universal-Framework

使用 iOS 框架 iOS 框架与常规的动态 Mac OS X 框架基本相同,只是它们是静态链接的。

要将框架添加到您的项目中,只需将其拖到您的项目中即可。在包含框架中的标头时,请记住使用尖括号语法而不是引号。

例如,使用框架“MyFramework”:

#import <MyFramework/MyClass.h>

这个问题Importing an external library in xcode - C++如下所示:导入 C++ 库,使用它,从它对内置框架的依赖中获取错误,导入那些内置框架,一切正常。

3)我会投资 LPNKit,而不是通过选项 1 来争取。你可以从 LPNKit 中做出贡献并从中受益。GitHub 是一个很棒的地方,与选项 1 相比,它的最大推动力是你有另一个(或多个人!)有相同的目标,并且会共同努力实现它。

于 2012-03-12T15:44:14.980 回答