13

私の目標は、私が取り組んでいる iPhone プロジェクト用の Google の電話番号処理ライブラリであるlibphonenumberを使用することです。

それをダウンロードした後 (そして何時間もかけて)、ライブラリの C++ バージョンをコンパイルし、いくつかの ".a" ファイルと ".dylib" ファイルを構築しました。それらの C++ 関数。

そこで、「libphonenumber.a」をプロジェクトにインポートし、必要に応じてターゲット、ビルド設定、ビルド フェーズ、およびライブラリ検索パスを更新しました。

デバイス & シミュレーター パス用の xCode プロジェクトをビルドすると、次の警告が表示されます。リンク(armv7)」。(またはシミュレーター用にコンパイルする場合は i386)

このことから、正しい i386 および/または armv7 アーキテクチャ用に libphonenumber をコンパイルする必要があることがわかりました。だから私はそれをやろうとしましたが、libphonenumber が適切にコンパイルされるようにするには、i386/armv7 アーキテクチャ用に、libphonenumber の 3 つの依存ライブラリも再構築する必要があることにすぐに気付きました。結局、私はそれをあきらめました、それは私の前に大きな混乱のように見え始めました.

すべての私の試練の後、私は残っています

3 つの質問:

1) i386/armv6/armv7 アーキテクチャで使用する libphonenumber C++ ライブラリをコンパイルする方法。

2) C++ ライブラリを使用する場合、私の仮定は正しいですか? コンパイルの結果である「.a」ファイルをインポートし、xCode プロジェクト ファイルのヘッダーでそれをポイントするだけですか? c++ ライブラリを含めて使用し、xCode 内の object-c からそれらの関数にアクセスするための手順は正確には何ですか?

3) libphonenumber の目的の c ポートである LPNKit を見つけましたが、不完全です。誰かがそれを聞いたことがありますか?または、libphonenumber の目的の c ポートを持っていて、正しくコンパイルしてインストールする方法についての指示があり、完全に機能している人はいますか?

このライブラリを 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];

結果変数は、フォーマットされた数値を取得します。

私と同じ問題に遭遇した人の助けになることを願っています。

4

3 に答える 3

6

それは私たちのチームによって移植されました。あなたはそれを見つけることができますhttps://github.com/me2day/libPhoneNumber-iOS

于 2013-02-19T17:02:00.013 に答える
3

libphonenumberJavascriptライブラリには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);
于 2012-05-21T09:13:47.303 に答える
2

1) Fix all the errors and re-compile all the dependencies for arm. As you said before.

2) Yes. According to kstenerud’s iOS-Universal-Framework

Using an iOS Framework iOS frameworks are basically the same as regular dynamic Mac OS X frameworks, except they are statically linked.

To add a framework to your project, simply drag it into your project. When including headers from your framework, remember to use angle bracket syntax rather than quotes.

For example, with framework "MyFramework":

#import <MyFramework/MyClass.h>

This question Importing an external library in xcode - C++ follows like this: Import C++ library, use it, get errors from its dependency on built-in frameworks, import those built-in frameworks, everything works.

3) I would invest in LPNKit instead of fighting your way through option 1. You can both contribute and benefit from LPNKit. GitHub is a wonderful place and the great boost of this over option 1 is that you have another person (or people!) who have the same goal and will all work together to achieve it.

于 2012-03-12T15:44:14.980 に答える