[英]libphonenumber for iOS or objective-c port
我的目标是使用libphonenumber ,google的电话号码处理库来处理我正在处理的iPhone项目。
下载后(和许多小时),我编译了库的C ++版本,它构建了一个“.a”文件和“.dylib”文件,我假设我必须导入到我的xCodeProject才能访问那些C ++函数。
所以我将“libphonenumber.a”导入到我的项目中,根据需要更新了我的目标,构建设置,构建阶段和库搜索路径。
为Device&Simulator传递构建xCode项目但是给我以下警告:“ld:warning:忽略文件../XcodeProjects/libphonenumber/build/libphonenumber.dylib,文件是为不支持的文件格式构建的,这不是架构所针对的链接(armv7)“。 (或编译模拟器时的i386)
我从中理解,我必须编译libphonenumber以获得正确的i386和/或armv7架构。 所以我试着这样做,但很快意识到这也要求我也重建libphonenumber的3个依赖库,对于i386 / armv7架构,以便libphonenumber现在可以正确编译。 最终,我放弃了它,它开始看起来像我之前的一团糟。
在我所有的考验之后,我离开了
3个问题:
1)如何编译libphonenumber C ++库以与i386 / armv6 / armv7体系结构一起使用。
2)使用c ++库时,我的假设是正确的吗? 是仅仅导入编译产生的“.a”文件,只是在我的xCode项目文件的标题中指向它? 包含和使用c ++库以及从xCode中的objective-c访问其函数的具体步骤是什么?
3)我确实找到了LPNKit ,一个libphonenumber的Objective-c端口,但它不完整。 有没有人听说过它,并且运气好吗? 或者有没有人有libphonenumber的objective-c端口,它是完整的,有效的,有关如何正确编译和安装它的说明?
任何有关如何让这个库在iOS上运行的帮助或建议将不胜感激。
更新:
我最终使用了libphonenumber的javascript版本,将所有文件添加到我的包中,包括所有引用的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];
结果变量获取格式化的数字。
我希望能帮助遇到同样问题的人。
它已由我们的团队移植。 你可以找到它https://github.com/me2day/libPhoneNumber-iOS
请注意,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);
1)修复所有错误并重新编译arm的所有依赖项。 正如你之前所说。
2)是的。 根据kstenerud的iOS-Universal-Framework
使用iOS框架iOS框架与常规动态Mac OS X框架基本相同,只是它们是静态链接的。
要向项目添加框架,只需将其拖到项目中即可。 在包含框架中的标题时,请记住使用尖括号语法而不是引号。
例如,使用框架“MyFramework”:
#import <MyFramework/MyClass.h>
这个问题在xcode中导入外部库 - C ++如下所示:导入C ++库,使用它,从内置框架的依赖中获取错误,导入这些内置框架,一切正常。
3)我会投资LPNKit而不是通过选项1战斗。你可以贡献LPNKit并从中受益。 GitHub是一个很棒的地方,这个选项1的巨大推动力在于你有另一个人(或人!)谁拥有相同的目标,并将共同努力实现它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.