libphonenumber для iOS или порт target-c - PullRequest
13 голосов
/ 31 января 2012

Моя цель - использовать libphonenumber , библиотеку Google для обработки телефонных номеров для проекта iPhone, над которым я работаю.

После загрузки (и много-много часов) я выполнилC ++ версия библиотеки, и она построила несколько файлов «.a» и «.dylib», которые, как я предполагал, я должен импортировать в свой xCodeProject, чтобы получить доступ к этим функциям C ++.

Таким образом, я импортировал «libphonenumber.a» в свой проект, обновил цель, настройки сборки, фазы сборки и пути поиска в библиотеке по мере необходимости.

Сборка проекта xCode для прохода Device & Simulator, однако выдает мне следующее предупреждение: "ld: warning: игнорирование файла ../XcodeProjects/libphonenumber/build/libphonenumber.dylib, файл создан для неподдерживаемого формата файлакоторая не является связываемой архитектурой (armv7) ".(или i386 при компиляции для симулятора)

Из этого я понимаю, что должен скомпилировать число libphonenumber для правильной архитектуры i386 и / или armv7.Поэтому я попытался сделать это, но быстро понял, что для этого нужно также перестроить 3 зависимые библиотеки libphonenumber для архитектур i386 / armv7, чтобы теперь libphonenumber мог правильно компилироваться.В конце концов, я отказался от этого, это начало казаться большим беспорядком передо мной.

После всех моих испытаний у меня осталось

3 Вопросы:

1) Как мне скомпилировать библиотеку libphonenumber C ++ для использования с архитектурами i386 / armv6 / armv7.

2) Верно ли мое предположение при использовании библиотеки c ++?Нужно ли просто импортировать файл «.a», полученный в результате компиляции, и просто указать на него в заголовке файлов моего проекта xCode?Каковы точные шаги для включения и использования библиотек c ++ и доступа к их функциям из target-c внутри xCode?

3) Я нашел LPNKit , порт target-c для libphonenumber, однако он неполный.Кто-нибудь слышал об этом, и повезло, используя его?Или у кого-нибудь есть целевой порт c для libphonenumber, который работает, с инструкциями о том, как правильно скомпилировать и установить его?

Любая помощь или совет о том, как заставить эту библиотеку работать на iOS, была бы очень полезной.приветствуется.

Обновление:

В итоге я использовал версию libphonenumber для javascript, добавив все файлы в свой пакет, включая все библиотеки javascript, на которые есть ссылки, и используя UIWebview и stringByEvaluatingJavaScriptFromString для запуска функций.Вы также можете сделать так, чтобы UIWebview ссылался на библиотеку javascript онлайн (я просто предпочел, чтобы все было локально, чтобы не зависеть от интернет-соединения).

Вот пример того, что я сделал:

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

Переменная результата возвращает мне отформатированное число.

Надеюсь, это поможет любому, кто столкнулся с той же проблемой, что и я.

Ответы [ 3 ]

6 голосов
/ 19 февраля 2013

Он был портирован нашей командой. Вы можете найти это https://github.com/me2day/libPhoneNumber-iOS

3 голосов
/ 21 мая 2012

Просто обратите внимание, что библиотека 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);
2 голосов
/ 12 марта 2012

1) Исправьте все ошибки и пересоберите все зависимости для arm.Как вы сказали раньше.

2) Да.В соответствии с iOS-универсальной платформой kstenerud

Использование платформы iOS Framework iOS в основном аналогична обычным динамическим платформам Mac OS X, за исключением того, что они статически связаны.

Чтобы добавить фреймворк в свой проект, просто перетащите его в свой проект.При включении заголовков из вашей структуры не забывайте использовать синтаксис угловых скобок, а не кавычки.

Например, с фреймворком "MyFramework":

#import <MyFramework/MyClass.h>

Этот вопрос Импорт внешней библиотеки в xcode - C ++ выглядит следующим образом: импортировать библиотеку C ++, использовать ее, получать ошибки из-за ее зависимости от встроенных сред, импортировать эти встроенные платформы, все работает.

3) Я бы инвестировал в LPNKit вместо того, чтобы пробиться сквозь вариант 1. Вы можете внести свой вклад и получить выгоду от LPNKit.GitHub - это замечательное место, и большим преимуществом этого варианта является то, что у вас есть другой человек (или люди!), Которые имеют ту же цель и будут все вместе работать для ее достижения.

...