繁体   English   中英

libphonenumber for iOS或objective-c port

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM