14

PhoneGap プロジェクトをセットアップすると、次のように表示されます。

建てる

iOS アプリケーション内でその情報を取得するにはどうすればよいですか? phonegapでそれを行う方法はありますか? プラグインはどうですか?プラグインが存在せず、iOS アプリケーションでそれを行う方法がある場合は、プラグインを作成できます。私は答えを見つけることができませんでした。

ありがとう!

4

4 に答える 4

22

私は自分のソリューションを提供したかったのです (Adam Ware のソリューションに基づいています)。

通常、すべてのコードをコピペできるように提供するのは好きではありませんが、PhoneGap に飛び込む多くの人が Objective-C とその変な構文について何も知らないので、これはちょっとした例外だと思います (私のような)。

したがって、コードを使用して、Adam が指摘したガイドに従って行ったことは次のとおりです。

のプロジェクト プラグイン フォルダに<project name>/Plugins/、 と を作成MyCDVPlugin.mMyCDVPlugin.hました。

私は以前に C で書いたことがあるので、ヘッダーは理解していますが、そうでない人のために説明すると、基本的にはコンパイラーに何を探すべきかを伝えているので、メソッドの名前を伝えて、Cordova のヘッダーをインポートするだけです。

#import <Cordova/CDVPlugin.h>

@interface MyCDVPlugin : CDVPlugin

- (void)getVersionNumber:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;

@end

これらのパラメーターは、Cordova プラグインの標準パラメーターです (私の知る限り)。getter としての私たちの関数は、ある意味で実際にはパラメーターを持っていませんが、それらは依然として必要です。(options実際にはオプションかもしれませんか?私はテストしませんでした。)

で必要な.mのは、実際の関数、前のヘッダー、およびCDVPluginResult.h:

#import "MyCDVPlugin.h"
#import <Cordova/CDVPluginResult.h>

@implementation MyCDVPlugin

- (void)getVersionNumber:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options {
    NSString* version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    NSString* callbackId = [arguments objectAtIndex:0];

    CDVPluginResult* pluginResult = nil;
    NSString* javaScript = nil;

    pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:version];
    javaScript = [pluginResult toSuccessCallbackString:callbackId];

    [self writeJavascript:javaScript];
}

@end

基本的に、これはバージョン番号を取得し、それを成功のコールバックに返します。(このメソッドには本当に失敗するケースがあるとは思わなかったので、失敗のコールバックはありません。)

完全を期すために、Xcode はファイルを自動更新しません (これは実際には理にかなっています) が、私はいつも忘れています。ファイルがプロジェクト ディレクトリにあるからといって、それらがプロジェクトにあるとは限りません。それらをプロジェクトの Plugins ディレクトリにドラッグすることを忘れないでください:

ファイルをプロジェクトにドラッグします。

また、必ずプラグインをCordova.plist Pluginsエントリに追加してください。

Cordova.plist の編集

そこから、JavaScript からメソッドを呼び出すのは非常に簡単です (必ずdevicereadyがトリガーされた後に使用してください)。

// get and show the version number
var gotVersionNumber = function(version) {
    // cache value so we can use it later if we need it
    Hub.Global.Version = version;
    $('.version-number').text(version);
};

// my plugin doesn't even have a failure callback, so we pass null.
// 5th param (parameters to pass into our Obj-C method) is NOT 
// optional. must be at least empty array
cordova.exec(gotVersionNumber, null, "MyCDVPlugin", "getVersionNumber", []);

それでおしまい!シンプルですよね…?これが、PhoneGap の Obj-C 側に圧倒されている他の誰かの助けになることを願っています。

于 2013-02-05T17:27:58.457 に答える
2

@CWSpear のすばらしい回答を微調整するために、ビルドも取得したいと思いました。

ビルドとバージョンを取得します。

NSString* version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
NSString* build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

それらを Dict に投げます:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:[NSString stringWithString:version] forKey:@"version"];
[dict setObject:[NSString stringWithString:build] forKey:@"build"];

新しい Dict を返すように pluginResult を変更します。

pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dict];

Cordova.exec:

    cordova.exec(function(response){
        console.log(response.build);
        console.log(response.version);
    }, null, "MyCDVPlugin", "getVersionNumber", []);

JS cordova.exec コールバック関数で 2 つの引数として返す目的 C について十分に知りません。それ以外の場合は、おそらく最も簡単です。

スティーブ

于 2013-10-22T20:21:43.633 に答える
0

jquery を使用している場合は、cordova-plugin-app-versionコルドバ プラグインのこの関数cordova.getAppVersion.getVersionNumberからアプリ バージョンを取得できます。

cordova.getAppVersion.getVersionNumber().then(function (version) {
   $('.version').text(version);
});

ただし、angular を使用する場合は、バージョン設定コードを$timeout内に配置する必要があり、正常に動作します。

angular.module('testApp', [])
.controller('MainCtrl', function($scope, $rootScope, $timeout) {
// Calling cordova plugin cordova-plugin-app-version
    cordova.getAppVersion.getVersionNumber().then(function (version) {
    $timeout(function() {
          $rootScope.app = {};
          $rootScope.app.version = version;
    }, 0);
});
于 2016-07-17T10:38:42.227 に答える