14

在设置 PhoneGap 项目时,您会看到以下内容:

建造

如何在 iOS 应用程序中获取这些信息?有没有办法用phonegap做到这一点?插件呢?如果不存在插件,并且有办法在 iOS 应用程序中执行此操作,则可以编写插件。我只是找不到任何答案。

谢谢!

4

4 回答 4

22

我想提供我的解决方案(基于 Adam Ware 的解决方案)。

通常我不喜欢只给人们复制和粘贴所有代码,但我觉得这有点例外,因为很多潜入PhoneGap的人对Objective-C及其看起来很有趣的语法一无所知(像我这样的)。

所以这就是我使用代码并遵循亚当指出的指南所经历的:

在我的项目插件文件夹中<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"];

把它们扔进一个字典:

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", []);

我对目标 C 的了解不够,无法在 JS cordova.exec 回调函数中将其作为两个参数返回,否则这可能是最直接的。

史蒂夫

于 2013-10-22T20:21:43.633 回答
2

现在存在一个插件,: http: //plugins.cordova.io/#/package/uk.co.whiteoctober.cordova.appversion

我只是测试它,就像一个魅力。

于 2014-08-26T16:20:31.260 回答
0

如果您使用的是 jquery,那么我们可以从cordova-plugin-app-version cordova 插件的这个函数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 回答