WeetA

Quand normalement rime avec rarement !

Plugin GeoLocation 0.0.8 de NativeScript qui ne fonctionne pas sur iOS 9+

Comment perdre plusieurs heures à comprendre comment fonctionne un produit ?
En utilisant un de ses plugins buggy :)
Avant d'expliquer le problème, je tiens à dire que je débute en NativeScript.
Après avoir créé une pauvre application avec un champ text, un label et un bouton, je me suis dit comme beaucoup : "Tiens ! je vais jouer avec la position GPS"
Super, c'est bien expliqué dans la partie Hardware Access > Location de la documentation.
En gros, il faut ajouter le plugin avec la commande :

tns plugin add nativescript-geolocation

Puis, dans le fichier xml de l'UI, j'ai ajouté 2 boutons :

  • 1 pour demander l'autorisation d'accès à la position
  • 1 pour récupérer la position
<Button text="Enable Location" tap="enableLocationTap"/>
<Button text="Get Current Location" tap="getLocationTap"/>

Côté JS, il faut ajouter le code associé aux boutons :

var geolocation = require("nativescript-geolocation");
function enableLocationTap(args) {
    if (!geolocation.isEnabled()) {
        geolocation.enableLocationRequest();
    }
}
exports.enableLocationTap = enableLocationTap;

function getLocationTap(args) {
    var location = geolocation.getCurrentLocation({desiredAccuracy: 3, updateDistance: 10, maximumAge: 20000, timeout: 20000}).
    then(function(loc) {
        if (loc) {
            console.log("Current location is: " + loc);
        }
    }, function(e){
        console.log("Error: " + e.message);
    });
}
exports.getLocationTap = getLocationTap;

C'est parti, on pousse l'appli sur le iDevice à coup de :

tns run ios --release

Impec, l'appli se lance. Un petit Tap sur Enable Location et là ... rien, quedal, nada. Bon ! ça aurait dû me demander l'autorisation d'accéder à ma position.
Un petit Tap sur Get Current Location et là ...

CONSOLE LOG file:///app/main-page.js:40:20: Error: Location service is disabled

Je vous passe les Tap, reTap, rereTap, compile, clean, raahhh, plugin remove/add, platform remove/add, recherches google, github, ... rien.
J'ai cherché un peu du côté des accès demandés pour l'appli (comme les manifest Android). C'est rangé dans le fichier Info.plist.
Après vérification sur la page Cocoa Keys, les clés NSLocationWhenInUseUsageDescription et NSLocationAlwaysUsageDescription sont bien présentes.
Faut chercher ailleurs. Le plugin ne sera pas buggy ? non quand même, ça serait vraiment la loose !
Commençons par le fichier suivant qui parait, d'après son nom, bien être celui qui nous intéresse :

node_modules/nativescript-geolocation/nativescript-geolocation.ios.js

J'y retrouve notre fonction enableLocationRequest. Et là, j'ai compris. Il y a un test de version iOS 8 strict au lieu d'un test de version minimum.
J'ai oublié de vous le dire mais vous l'avez peut-être vu dans la page Cocoa Keys, les clés NSLocationWhenInUseUsageDescription et NSLocationAlwaysUsageDescription ne sont prises en charge qu'à partir de iOS 8. Avant, il fallait utiliser l'unique clé NSLocationUsageDescription.
J'ai modifié le code comme suit :

 function enableLocationRequest(always) {
-    if (platformModule.device.osVersion.indexOf("8") === 0) {
+    var intOsVersionMajor = parseInt(platformModule.device.osVersion.split('.')[0]);
+    if (intOsVersionMajor >= 8) {

Après recompilation et exécution, ça fonctionne comme prévu. Cool !
Du coup, j'ai créé un incident sur le GitHub de NativeScript pour que ce soit corrigé dans une future version : iOS 9+ Location Request does nothing

Ajouter un commentaire

Loading