2016-08-27 15 views
8

Chcę użyć PositionService z Gluon Mobile na iOS. Napisałem małą przykładową aplikację, która działa na komputerze, zapewniając (zgodnie z zamierzeniami) fałszywe zmiany lokalizacji i na Androida. Jednak w symulatorze iOS słuchacz nie jest wywoływany. Tutaj jest odpowiednia część kodu:Jak korzystać z usługi PositionService w Gluon Mobile na 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"))); 
     } 

    } 

Dodałem libCharm.a, ale o ile mogę powiedzieć, że nie powinno być tutaj potrzebne.

Też znalazłem wskazówki dotyczące aktualizacji pliku info.plist w następujący sposób, ale z lub bez niego detektor nie jest wywoływany.

<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> 

Jedyne wyjście dotyczące lokalizacji widzę to tak:

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. 

Myślę, że jestem brakuje czegoś tutaj ... Jak zawsze, każda pomoc jest mile widziana.

EDIT: Niestety, zapomniałem 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.**.*' 
     ] 
    } 
} 
+0

Właśnie wydaliśmy Charm Down 3.0.0, z całkowitym remontem biblioteki. Spójrz na zaktualizowane próbki Gluon, które korzystają z nowej wersji 1.1.0 wtyczki jfxmobile. Również wtyczki IDE są aktualizowane w celu użycia tych wersji. Spróbuj i daj mi znać, jeśli to rozwiąże Twój problem. –

+0

José, przepraszam, że poświęciłem trochę czasu na odpowiedź. Zmieniłem wersję na Gluon Mobile 4, czyli wtyczkę i nowy Charm Down. Kiedy uaktualniłem swój kod (używając Usług) i zastosowałem zmiany, o których wspomniałem w swojej odpowiedzi, zacząłem widzieć zmiany pozycji w symulatorze iPada. Aktualizacja do Gluon Mobile 4 rozwiązała mój problem. ;-) – Thomas

+0

Importujesz 'com.gluonhq.charm.down.plugins. *' (Zawierający PositionServices)? Kompiluję 'com.gluonhq: charm: 4.3.7' w mojej' kompilacji.gradle' file - ale nie mogę/nie wiem, jak uzyskać dostęp do najnowszych usług - widzę tylko ograniczoną ich liczbę. Nie są one możliwe poprzez 'import com. *. * ...' (etc). – Lealo

Odpowiedz

1

Śledziłem porady José Pereda i przeniesieni do gluonowych Mobile 4. Po kolejnych krokach widziałem zmiany pozycji w iPad Simulator. Proponuję więc każdemu, kto ma te same trudności, o których wspomniałem w swoim pytaniu, spróbuj uaktualnić. To rozwiązało mój problem.

Aktualizacja build.gradle następująco:

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.**.*' 
     ] 
    } 
} 

Jak Charm dół API zmieniła lekko zmodyfikować kod, który uzyskuje dostęp do usługi stanowisko w następujący sposób:

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

} 

We wcześniejszych wersjach wydawało się konieczne mieć plik ibCharm.a w src/ios/jniLibs. W Gluon 4 ciągle widziałem błędy podczas łączenia, dopóki nie usunąłem pliku. Zakładam, że z powodu refaktoryzacji Charm Down ta lib nie jest już potrzebna w tym katalogu.

Należy również pamiętać, że należy zmodyfikować plik Default-Info.plist, tak jak zostało to już wspomniane w dokumentacji funkcji Charm Down dotyczącej usługi PositionService. Już to opisałem w moim pytaniu. Począwszy od dziś, docu nie wspomina rozważyć dodanie

<string>location-services</string> 

do

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

ale myślę, że to może być dobry pomysł, jeśli aplikacja potrzebuje usługi pozycji i nie będzie działać inaczej. Może ekspert od iOS może to skomentować, proszę.

+1

Wygląda dobrze. O aktualizacji Gluon Charm 4, wtyczka Gluon IDE już to robi, aktualizuje twój build.gradle z najnowszymi wersjami i nowymi wtyczkami Down. Zauważysz, że istnieją inne wymagane wtyczki, takie jak 'lifecycle' lub' storage', które są dodawane domyślnie. ConfigDown doda do ciebie biblioteki natywne, nie musisz przechowywać 'libCharm.a' ani używać zadania' extractNativeLibrary'. –

+1

Informacje o 'UIRequiredDeviceCapabilities', nie jestem pewien, czy jest to obowiązkowe. W moich testach każda wtyczka (akcelerometr, kamera, lokalizacja, ...) działa dobrze bez dodawania ich do tej listy. Wydaje się, że "App Store używa zawartości tego klucza, aby uniemożliwić użytkownikom pobieranie twojej aplikacji na urządzenie, które nie może jej obsługiwać." –

+0

José, myślę, że twoje założenie dotyczące UIRequiredDeviceCapabilities jest prawdziwe, nie jest konieczne, aby kod działa. Ale jeśli aplikacja nie będzie działać w ogóle, jeśli usługi lokalizacyjne nie są dostępne na urządzeniu, prawdopodobnie należy je ustawić. :-) Odnośnie innych wymaganych wtyczek ... faktycznie je usunąłem. Czy radzisz mi zaktualizować moją odpowiedź, to znaczy ponownie je uwzględnić? – Thomas

Powiązane problemy