Как получить версию приложения и создать приложение iOS PhoneGap?

Когда вы настраиваете проект PhoneGap, вы увидите следующее:

BUILD

Как я могу получить эту информацию внутри приложения iOS? Есть ли способ сделать это с помощью телефонного разговора? Как насчет плагина? Если плагин не существует, и есть способ сделать это в приложении iOS, можно написать плагин. Я просто не смог найти ответы.

Спасибо!

Ответы

Ответ 1

Я хотел предложить свое решение (основанное на решении Adam Ware).

Обычно мне не нравится просто давать код для копирования и вставки для людей, но я чувствую, что это немного исключение, так как многие люди, ныряющие в PhoneGap, ничего не знают о Objective-C (например, я).

Итак, вот что я прочитал, используя код и следуя указаниям Адама:

В моей папке плагина проекта в <project name>/Plugins/ я создал MyCDVPlugin.m и MyCDVPlugin.h.

Я писал на C раньше, поэтому я понимаю заголовки, но для тех из вас, кто этого не делает, он в основном говорит компилятору, что искать, поэтому мы просто рассказываем имя нашего метода и импортируем заголовок Кордовы

#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 не автообновляет файлы (что на самом деле имеет смысл), но я всегда забываю. Просто потому, что ваши файлы находятся в каталоге вашего проекта, это не значит, что они находятся в вашем проекте. Не забудьте перетащить их в свой каталог Plugins в свой проект:

Dragging files into the project.

Кроме того, убедитесь, что вы добавили свой плагин в запись Cordova.plist Plugins:

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

Что это! Просто, правильно...? Надеюсь, это поможет кому-то еще немного перегружен стороной Obj-C PhoneGap.

Ответ 2

Как небольшая настройка для @CWSpear удивительного ответа, я также хотел захватить Build:

Возьмите сборку и версию:

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"];

Измените 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, иначе это, вероятно, было бы самым прямым.

Стив

Ответ 4

Если вы используете jquery, мы можем получить версию приложения из этой функции cordova.getAppVersion.getVersionNumber плагина cordova-plug-app-version cordova.. p >

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