Как использовать PositionService в Gluon Mobile на iOS?

Я хочу использовать PositionService Gluon Mobile на iOS. Я написал небольшой пример приложения, которое запускается на рабочем столе, обеспечивая (как и предполагалось) поддельные изменения местоположения, а также на Android. Однако в симуляторе iOS прослушиватель не вызывается. Вот соответствующая часть кода:

public class BasicView extends View {

        private static final Logger LOGGER = Logger.getLogger(BasicView.class.getName());

        final Label label;

        public BasicView(String name) {
            super(name);
            label = new Label();
            VBox controls = new VBox(15.0, label);
            controls.setAlignment(Pos.CENTER);
            setCenter(controls);
            // get current position
            Platform p = PlatformFactory.getPlatform();
            PositionService ps = p.getPositionService();
            outputPos(ps.getPosition());
            ps.positionProperty().addListener((obs, oldPos, newPos) -> {
                LOGGER.log(Level.INFO, "\nobs: {0}\noldPos: {1}\nnewPos: {2}",
                        new Object[]{obs, oldPos, newPos});
                outputPos(newPos);
            });
        }

        private void outputPos(Position p) {
            if (p != null) {
                label.setText(String.format("We are currently here: %f %f",
                        p.getLatitude(),
                        p.getLongitude()));
            }
        }

        @Override
        protected void updateAppBar(AppBar appBar) {
            appBar.setNavIcon(MaterialDesignIcon.MENU.button(e -> System.out.println("Menu")));
            appBar.setTitleText("Basic View");
            appBar.getActionItems().add(MaterialDesignIcon.SEARCH.button(e -> System.out.println("Search")));
        }

    }

Я добавил libCharm.a, но насколько я могу судить, здесь он не нужен.

Я также нашел подсказки по обновлению info.plist следующим образом, но с ним или без него слушатель не вызывается.

    <key>UIRequiredDeviceCapabilities</key>
    <array>
            <string>armv7</string>
            <string>location-services</string>
    </array>
    ...
    <key>NSLocationWhenInUseUsageDescription</key>
            <string>Location is required to find out where you are</string>
    <key>NSLocationAlwaysUsageDescription</key>
            <string>Location is required to find out where you are</string>

Единственный вывод относительно местоположения, который я вижу:

Aug 27, 2016 1:37:31 PM com.gluonhq.charm.down.ios.IOSPositionService <init>
INFO: Location Manager configured with desiredAccuracy 10.00 and distanceFilter 100.00

Aug 27, 2016 1:37:31 PM com.gluonhq.charm.down.ios.IOSPositionService <init>
INFO: Telling LocationManager to start updating location.

Полагаю, мне здесь чего-то не хватает ... Как всегда, любая помощь приветствуется.

РЕДАКТИРОВАТЬ: Извините, забыл build.gradle:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'org.javafxports:jfxmobile-plugin:1.0.8'
    }
}

apply plugin: 'org.javafxports.jfxmobile'

repositories {
    jcenter()
    maven {
        url 'http://nexus.gluonhq.com/nexus/content/repositories/releases'
    }
}

mainClassName = 'com.thomaskuenneth.gluon.positionservicedemo.PositionServiceDemo'

dependencies {
    compile 'com.gluonhq:charm:3.0.0'

    androidRuntime 'com.gluonhq:charm-android:3.0.0'
    iosRuntime 'com.gluonhq:charm-ios:3.0.0'
    desktopRuntime 'com.gluonhq:charm-desktop:3.0.0'
}

jfxmobile {
    android {
        manifest = 'src/android/AndroidManifest.xml'
        compileSdkVersion = 23
    }
    ios {
        infoPList = file('src/ios/Default-Info.plist')
        forceLinkClasses = [
                'com.gluonhq.**.*',
                'io.datafx.**.*',
                'javax.annotations.**.*',
                'javax.inject.**.*',
                'javax.json.**.*',
                'org.glassfish.json.**.*'
        ]
    }
}

person Community    schedule 27.08.2016    source источник
comment
Мы только что выпустили Charm Down 3.0.0 с полной переработкой библиотеки. Взгляните на обновленные образцы Gluon, в которых используется новая версия 1.1.0 плагина jfxmobile. Также плагины IDE обновлены для использования этих версий. Попробуйте и дайте мне знать, решит ли это вашу проблему.   -  person José Pereda    schedule 25.10.2016
comment
Хосе, извини, что нашел время, чтобы ответить. Я обновился до Gluon Mobile 4, то есть плагина и нового Charm Down. После того, как я обновил свой код (с помощью служб) и применил изменения, упомянутые в моем ответе, я начал видеть изменения положения в симуляторе iPad. Итак, обновление до Gluon Mobile 4 решило мою проблему. ;-)   -  person    schedule 31.10.2016
comment
Вы импортируете com.gluonhq.charm.down.plugins.* (содержащий PositionServices)? Я компилирую com.gluonhq:charm:4.3.7 в свой build.gradle файл, но я не могу / не знаю, как получить доступ к последним Службам - вижу только ограниченное их количество. Они не доступны через import com.*.*... (и т. Д.).   -  person Lealo    schedule 10.10.2017


Ответы (1)


Я последовал совету Хосе Переды и обновился до Gluon Mobile 4. После следующих шагов я увидел изменения положения в iPad Simulator. Итак, я предлагаю всем, у кого те же трудности, что я упоминал в своем вопросе, попробовать обновить. Это решило мою проблему.

Обновите build.gradle следующим образом:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'org.javafxports:jfxmobile-plugin:1.1.1'
    }
}

apply plugin: 'org.javafxports.jfxmobile'

repositories {
    jcenter()
    maven {
        url 'http://nexus.gluonhq.com/nexus/content/repositories/releases'
    }
}

mainClassName = 'com.thomaskuenneth.gluon.positionservicedemo.PositionServiceDemo'

dependencies {
    compile 'com.gluonhq:charm:4.0.1'
}

jfxmobile {
    downConfig {
        version '3.0.0'
        plugins 'display', 'lifecycle', 'statusbar', 'storage', 'position'
    }
    android {
        manifest = 'src/android/AndroidManifest.xml'
        androidSdk = "/Users/thomas/Library/Android/sdk"
        compileSdkVersion = 24
    }
    ios {
        infoPList = file('src/ios/Default-Info.plist')
        forceLinkClasses = [
                'com.gluonhq.**.*',
                'io.datafx.**.*',
                'javax.annotations.**.*',
                'javax.inject.**.*',
                'javax.json.**.*',
                'org.glassfish.json.**.*'
        ]
    }
}

Поскольку Charm Down API немного изменился, измените код, который обращается к сервисам позиционирования, следующим образом:

package com.thomaskuenneth.gluon.positionservicedemo;

import com.gluonhq.charm.down.Services;
import com.gluonhq.charm.down.plugins.Position;
import com.gluonhq.charm.down.plugins.PositionService;
import com.gluonhq.charm.glisten.control.AppBar;
import com.gluonhq.charm.glisten.mvc.View;
import com.gluonhq.charm.glisten.visual.MaterialDesignIcon;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.geometry.Pos;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;

public class BasicView extends View {

    private static final Logger LOGGER = Logger.getLogger(BasicView.class.getName());

    final Label label;

    public BasicView(String name) {
        super(name);
        label = new Label();
        VBox controls = new VBox(15.0, label);
        controls.setAlignment(Pos.CENTER);
        setCenter(controls);
        Services.get(PositionService.class).ifPresent(serivce -> {
            serivce.positionProperty().addListener((obs, oldPos, newPos) -> {
                LOGGER.log(Level.INFO, "\nobs: {0}\noldPos: {1}\nnewPos: {2}",
                        new Object[]{obs, oldPos, newPos});
                outputPos(newPos);
            });
        });
    }

    private void outputPos(Position p) {
        if (p != null) {
            label.setText(String.format("We are currently here: %f %f",
                    p.getLatitude(),
                    p.getLongitude()));
        }
    }

    @Override
    protected void updateAppBar(AppBar appBar) {
        appBar.setNavIcon(MaterialDesignIcon.MENU.button(e -> System.out.println("Menu")));
        appBar.setTitleText("Basic View");
        appBar.getActionItems().add(MaterialDesignIcon.SEARCH.button(e -> System.out.println("Search")));
    }

}

В более ранних версиях казалось необходимым иметь файл ibCharm.a в src / ios / jniLibs. С Gluon 4 я продолжал видеть ошибки при связывании, пока не удалил файл. Я предполагаю, что из-за рефакторинга Charm Down эта библиотека больше не нужна в этом каталоге.

Также обратите внимание, что вам необходимо отредактировать Default-Info.plist, как теперь упоминается в документации Charm Down о PositionService. Я уже описал это в своем вопросе. На сегодняшний день в документе не упоминается возможность добавления

<string>location-services</string>

to

<key>UIRequiredDeviceCapabilities</key>
<array>
    ...

но я думаю, что это может быть хорошей идеей, если вашему приложению НУЖНА служба определения местоположения, и оно не будет запускаться в противном случае. Может быть, специалист по iOS мог бы это прокомментировать, пожалуйста.

person Community    schedule 31.10.2016
comment
Выглядит неплохо. Что касается обновления до Gluon Charm 4, плагин Gluon IDE уже делает это, обновляет ваш build.gradle последними версиями и новыми плагинами Down. Вы заметите, что есть другие необходимые плагины, такие как lifecycle или storage, которые добавляются по умолчанию. ConfigDown добавит вам собственные библиотеки, не нужно ни хранить libCharm.a, ни использовать задачу extractNativeLibrary. - person José Pereda; 31.10.2016
comment
Насчет UIRequiredDeviceCapabilities, я не уверен, обязательно ли это. В моих тестах каждый плагин (акселерометр, камера, местоположение и т. Д.) Отлично работает без добавления их в этот список. Похоже на то, что the App Store uses the contents of this key to prevent users from downloading your app onto a device that cannot possibly run it. - person José Pereda; 31.10.2016
comment
Хосе, я думаю, что ваше предположение относительно UIRequiredDeviceCapabilities верно, это не нужно для того, чтобы код работал. Но если приложение вообще не будет работать, если на устройстве недоступны службы определения местоположения, вероятно, это следует установить. :-) Что касается остальных необходимых плагинов ... на самом деле я их удалил. Вы бы посоветовали мне обновить свой ответ, то есть снова включить их? - person ; 31.10.2016
comment
Да, вы должны включить их, поскольку библиотека Gluon Charm зависит от них, но не включает их. В вашем случае lifecycle, если он присутствует, используется для предотвращения запуска службы, когда приложение переходит в фоновый режим. - person José Pereda; 31.10.2016
comment
Сделанный. Спасибо, что указали на это и помогли улучшить свой ответ. - person ; 31.10.2016
comment
Спасибо, что нашли время протестировать и опубликовать, наверняка это будет полезно другим. - person José Pereda; 31.10.2016