Подтвердить что ты не робот

Libphonenumber для iOS или порта objective-c

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

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

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

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

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

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

3 Вопросы:

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

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

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

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

Update:

В итоге я использовал версию 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];

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

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

4b9b3361

Ответ 2

Просто обратите внимание, что библиотека javascript libphonenumber включает в себя библиотеку закрытия Google.

Итак, вы должны подумать о том, чтобы обернуть свой Javascript-вызов в объект Javascript, а затем скомпилировать его, используя конструктор закрытия, чтобы получить эффективный и легкий вес script. (закрытие библиотеки перед компиляцией: 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);

Ответ 3

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

2) Да. Согласно ksteneruds iOS-Universal-Framework

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

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

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

#import <MyFramework/MyClass.h>

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

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