2016-08-27 2 views
8

Je souhaite utiliser le PositionService de Gluon Mobile sur iOS. J'ai écrit un petit exemple d'application qui fonctionne sur le bureau, fournissant (comme prévu) de faux changements d'emplacement, et sur Android. Sur le simulateur iOS, cependant, l'écouteur n'est pas appelé. Voici la partie pertinente du code:Comment utiliser PositionService dans Gluon Mobile sur 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"))); 
     } 

    } 

J'ai ajouté libCharm.a, mais pour autant que je peux dire qu'il ne devrait pas être nécessaire ici.

J'ai également trouvé des indications sur la mise à jour de info.plist comme suit, mais avec ou sans l'écouteur n'est pas appelé.

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

La seule sortie concernant l'emplacement que je vois est ceci:

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. 

Je suppose que je suis manque quelque chose ici ... Comme toujours, toute aide est grandement appréciée.

EDIT: Désolé, oublièrent 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

Nous venons de publier Charm Down 3.0.0, avec une refonte complète de la bibliothèque. Jetez un coup d'œil aux échantillons Gluon mis à jour, qui utilisent la nouvelle version 1.1.0 du plugin jfxmobile. Les plugins IDE sont également mis à jour pour utiliser ces versions. Essayez-le et faites-moi savoir si cela résout votre problème. –

+0

José, désolé d'avoir pris le temps de répondre. J'ai mis à niveau vers Gluon Mobile 4, c'est-à-dire le plugin et le nouveau Charm Down. Une fois que j'ai mis à jour mon code (en utilisant les Services) et appliqué les changements que j'ai mentionnés dans ma réponse, j'ai commencé à voir les changements de position dans le simulateur d'iPad. Ainsi, la mise à niveau vers Gluon Mobile 4 a résolu mon problème. ;-) – Thomas

+0

Importez-vous 'com.gluonhq.charm.down.plugins. *' (Contenant PositionServices)? Je compile 'com.gluonhq: charm: 4.3.7' dans ma' build.Gradle' fichier - mais je ne peux pas/ne sais pas comment accéder aux derniers services - seulement voir un nombre limité d'entre eux. Ils ne sont pas possibles avec 'import com. *. * ...' (etc). – Lealo

Répondre

1

J'ai suivi les conseils de José Pereda et mis à niveau vers gluons mobile 4. Une fois les étapes suivantes que j'ai vu des changements de position dans le simulateur iPad. Donc, je suggère que quelqu'un ayant les mêmes difficultés que j'ai mentionnées dans ma question, essayez de mettre à niveau. Cela a résolu mon problème.

Mise à jour build.gradle comme suit:

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

Comme API Charm vers le bas a légèrement changé, modifier le code qui permet d'accéder aux services de position comme suit:

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

} 

Dans les versions antérieures, il a semblé nécessaire avoir le fichier ibCharm.a dans src/ios/jniLibs. Avec Gluon 4, j'ai continué à voir des erreurs lors de la liaison jusqu'à ce que j'ai supprimé le fichier. Je suppose qu'en raison du refactoring de Charm Down, lib n'est plus nécessaire dans ce répertoire.

Veuillez également noter que vous devez modifier Default-Info.plist comme indiqué dans la documentation Charm Down sur le PositionService. Je l'ai déjà décrit dans ma question. A ce jour, le docu ne mentionne pas envisager d'ajouter

<string>location-services</string> 

à

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

mais je pense que cela pourrait être une bonne idée si votre application a besoin du service de position et ne fonctionnera pas autrement. Peut-être qu'un expert iOS pourrait faire un commentaire à ce sujet, s'il vous plaît.

+1

Ça a l'air bien. A propos de la mise à jour de Gluon Charm 4, le plugin Gluon IDE le fait déjà, met à jour votre build.gradle avec les dernières versions et les nouveaux plugins Down. Vous remarquerez qu'il y a d'autres plugins requis comme 'lifecycle' ou' storage' qui sont ajoutés par défaut. ConfigDown ajoutera pour vous les bibliothèques natives, pas besoin de garder libCharm.a et d'utiliser la tâche 'extractNativeLibrary'. –

+1

À propos de 'UIRequiredDeviceCapabilities', je ne suis pas sûr que ce soit obligatoire. Dans mes tests, chaque plugin (accéléromètre, caméra, emplacement, ...) fonctionne correctement sans les ajouter à cette liste. Il semble plus que «l'App Store utilise le contenu de cette clé pour empêcher les utilisateurs de télécharger votre application sur un appareil qui ne peut pas l'exécuter.» –

+0

José, je pense que votre hypothèse concernant UIRequiredDeviceCapabilities est vrai, il n'est pas nécessaire de faire le travail de code. Mais si une application ne fonctionne pas du tout si les services de localisation ne sont pas disponibles sur un appareil, il devrait probablement être défini. :-) En ce qui concerne les autres plugins requis ... en fait je les ai supprimés. Me conseillez-vous de mettre à jour ma réponse, c'est-à-dire de les inclure de nouveau? – Thomas