2012-01-31 10 views
13

Mi objetivo es utilizar libphonenumber, la biblioteca de manejo de números de teléfono de google para un proyecto de iPhone en el que estoy trabajando.libphonenumber para iOS o objetivo-c puerto

Después de descargarlo (y muchas muchas horas), cumplí con la versión C++ de la biblioteca y construyó un número de archivos ".a" y ".dylib", de los cuales asumí que debo importarlos en mi xCodeProject para acceder a esas funciones de C++.

Así que importé "libphonenumber.a" en mi proyecto, actualicé mi objetivo, las configuraciones de compilación, las fases de compilación y las rutas de búsqueda de bibliotecas, según las necesidades.

Construcción del proyecto de Xcode para el dispositivo & pase simulador, sin embargo me da la siguiente advertencia: "ld: Advertencia: el archivo ignorando ../XcodeProjects/libphonenumber/build/libphonenumber.dylib, el archivo fue construido para el formato de archivo no compatible cuales no es la arquitectura vinculada (armv7) ". (o i386 al compilar para el simulador)

Entiendo de esto que debo compilar el número libphon para la arquitectura i386 y/o armv7 correcta. Así que traté de hacerlo, pero rápidamente me di cuenta de que esto también me obliga a reconstruir las 3 bibliotecas dependientes de libphonenumber, para las arquitecturas i386/armv7 para que libphonenumber's compile ahora correctamente. Eventualmente, renuncié a eso, comenzó a verse como un gran desastre por delante de mí.

Después de todas mis pruebas, me quedo con

3 Preguntas:

1) ¿Cómo Puedo compilar libphonenumber biblioteca de C++ para su uso con las arquitecturas i386/ARMv6/ARMv7.

2) Cuando uso una biblioteca de C++, ¿mi suposición es correcta? ¿Es solo cuestión de importar el archivo ".a" que resulta de la compilación, y simplemente señalarlo en el encabezado de mis archivos de proyecto xCode? ¿Cuáles son exactamente los pasos para incluir y usar bibliotecas C++ y acceder a sus funciones desde object-c dentro de xCode?

3) Encontré LPNKit, un puerto objetivo-c para libphonenumber, pero está incompleto. ¿Alguien ha oído hablar de él y ha tenido suerte al usarlo? ¿O alguien tiene un puerto object-c para libphonenumber que está completo, funcionando, con instrucciones sobre cómo compilarlo e instalarlo correctamente?

Cualquier ayuda o consejo sobre cómo hacer que esta biblioteca funcione en iOS sería muy apreciada.

Actualización:

Terminé usando la versión de JavaScript libphonenumber, sumando todos los archivos a mi paquete, incluyendo todos los referenciados bibliotecas javascript y el uso de UIWebView y stringByEvaluatingJavaScriptFromString para ejecutar funciones. También podría hacer que UIWebview haga referencia a la biblioteca de JavaScript en línea (prefiero tener todo lo local para no depender de una conexión a Internet).

Aquí está una muestra de lo que hice:

variables
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]; 

El resultado me pone el número formateado.

Espero que ayude a cualquiera que se encuentre con el mismo problema que yo.

+0

¿cómo lo recompilaste y cuáles son las dependencias que tienes? – LordT

+0

Primero puse "i386" en "CMAKE_OSX_ARCHITECTURES: STRING =" en el archivo "CMakeCache.txt" para el proceso cmake, y luego volví a compilar. Las bibliotecas dependientes son [boost] (http://www.boost.org/), [protobuf] (http://code.google.com/p/protobuf/), y [googletest] (http: // code .google.com/p/googletest /). – YoCoh

+0

¿Alguna vez tuvo éxito al portar el framework libphonenumber al Objective C? Necesito exactamente lo mismo para mi aplicación iOS. ¡Si fuera tan amable de compartirlo conmigo, sería genial! Gracias por adelantado. –

Respuesta

6

Se ha portado por nuestro equipo. Lo puedes encontrar https://github.com/me2day/libPhoneNumber-iOS

+1

¿Incluye esto el AsYouTypeFormatter muy esencial? –

+0

Sí, felicitaciones y muchas gracias @hyukhur – qgicup

+0

¿Por qué esa biblioteca de iOS es tan lenta? Lo estoy usando para buscar contactos duplicados y lleva 23 segundos procesar 119 entradas. Por el contrario, si comparo nombres, el procesamiento lleva solo 1 segundo. – kelin

2

1) Arregle todos los errores y vuelva a compilar todas las dependencias para el brazo. Como dijiste antes.

2) Sí. De acuerdo con kstenerud’s iOS-Universal-Framework

Utilizando un marco marcos IOS IOS son básicamente los mismos que los marcos regulares dinámicas de Mac OS X, excepto que están enlazados estáticamente.

Para agregar un marco a su proyecto, simplemente arrástrelo a su proyecto. Al incluir encabezados de su marco, recuerde utilizar la sintaxis del corchete angular en lugar de comillas.

Por ejemplo, con el marco de "MyFramework":

#import <MyFramework/MyClass.h>

Esta pregunta Importing an external library in xcode - C++ sigue así: Importar biblioteca de C++, lo utilizan, consigue errores de su dependencia de una función de marcos, la importación esos marcos incorporados, todo funciona.

3) Invertiré en LPNKit en lugar de abrirme paso en la opción 1. Usted puede contribuir y beneficiarse de LPNKit. GitHub es un lugar maravilloso y el gran impulso de esto sobre la opción 1 es que tienes otra persona (o personas) que tienen el mismo objetivo y todos trabajarán juntos para lograrlo.

3

Solo tenga en cuenta que libphonenumber Javascript library incluye la biblioteca de cierre de Google.

Así que deberías considerar envolver tu llamada de Javascript en un objeto Javascript y luego compilarlo usando el constructor de cierre para obtener un script eficiente y liviano. (Biblioteca de cierre antes de la compilación: 18Mb, después de 300Kb compilación)

Ver por encima de una muestra de una envoltura tales

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); 
+0

¿Puede proporcionar un ejemplo completo? He agregado la versión compilada 300k y la he cargado en la vista web, pero cuando llamo a los métodos, nunca responde nada. Este script no devuelve nada: phoneNumberParser ('NUMBER HERE', 'PT', '') –

Cuestiones relacionadas