web-dev-qa-db-ja.com

アプリケーションのバージョンを取得してiOSPhoneGapアプリケーションに組み込む方法は?

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

BUILD

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

ありがとう!

14
andrewpthorp

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

通常、私は人々がコピーして貼り付けるためにすべてのコードを与えるのは好きではありませんが、PhoneGapに飛び込む多くの人々がObjective-Cとその変な見た目の構文について何も知らないので、これは少し例外だと思います(私のような)。

それで、これが私がコードを使用して、アダムが指摘したガイドに従って行ったことです:

私のプロジェクトプラグインフォルダの<project name>/Plugins/、 私は造った MyCDVPlugin.mおよびMyCDVPlugin.h

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

#import <Cordova/CDVPlugin.h>

@interface MyCDVPlugin : CDVPlugin

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

@end

これらのパラメーターは、(私が知る限り)標準のCordovaプラグインパラメーターです。ゲッターとしての私たちの関数は、ある意味では実際にはパラメーターを持っていませんが、それでも必要です。 (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はファイルを自動更新しません(これは実際には理にかなっています)が、私はいつも忘れています。ファイルがプロジェクトディレクトリにあるからといって、それらがプロジェクトにあるとは限りません。それらをプロジェクトのプラグインディレクトリにドラッグすることを忘れないでください。

Dragging files into the project.

また、プラグインをCordova.plistPluginsエントリに追加してください:

Editing 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側に少し圧倒される他の誰かを助けることを願っています。

22
CWSpear

@CWSpearのすばらしい答えに対する小さな調整として、ビルドも取得したいと思いました。

ビルドとバージョンを入手します。

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

それらをディクトに投げます:

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

PluginResultを変更して、新しいDictを返します。

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つの引数として返すObjectiveCについては十分にわかりません。そうでない場合は、おそらく最も簡単です。

スティーブ

2
daxiang28

プラグインが存在します: http://plugins.cordova.io/#/package/uk.co.whiteoctober.cordova.appversion

私はそれをテストするだけで、魅力のように機能します。

2
Frederic Fillon

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

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