0

Geräte/Nutzer identifizieren

Ich nutze Ninox via iCloud. Hier fehlen ja logischerweise die user()-Funktionen. Doch wie könnte ich dennoch zwei Geräte unterscheiden? Gibt es globale Variablen, die auf jedem Device einen anderen Wert haben können? Ich habe auch nach Funktionen gesucht, um zum Beispiel den Gerätenamen vom Betriebssystem abzugreifen, aber nichts dazu gefunden. Das würde mir schon reichen.

25 Antworten

null
    • Ninox-Professional
    • planoxpro
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo, mit der Funktion ninoxApp() lässt sich die Plattform abfragen, auf der Ninox gerade läuft. Rückgabewerte sind "web", "mac", "ipad", "iphone" oder "android".

    • Tekl
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Danke, das hilft schon mal. Zwei Macs lassen sich damit aber leider nicht unterscheiden.

    • Tekl
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hat jemand vielleicht noch einen Trick parat? Ich brauche für eine x-callback-URL einen Access-Token, der aber eben gerätegebunden ist, weil die entsprechende App den Code einmal zufällig generiert.

    • Tekl
    • vor 7 Monaten
    • Gemeldet - anzeigen

    Haben sich hier Neuigkeiten ergeben? Mittlerweile sind ja einige Ninox-Versionen ins Land gezogen.

    • Tekl
    • vor 7 Monaten
    • Gemeldet - anzeigen

    Vielleicht gib's einen Weg mittels http() an die IP-Adresse des Gerätes zu gelangen? Etwa mithilfe der Fritzbox?

    • Tobias_Bartzsch
    • vor 6 Monaten
    • Gemeldet - anzeigen

    Du könntest zB eine simple API abfrage machen und damit ein Feld befüllen. Hier als Script auf einem Button:

    let response := http("GET", "https://api.ipify.org?format=json");
    'TEXTFELD' := text(response.result.ip)

    Das ist dann aber nicht die interne Geräte IP, sondern deine Public IP des Routers. Das hilft also nur bei "verstreuten" Mitarbeitern...

    • Tobias_Bartzsch
    • vor 6 Monaten
    • Gemeldet - anzeigen

    Du könntest auch die von Ninox gesetzten Cookies auslesen. Ich habe es gerade probiert, man kann über eine javascript Funktion aus Ninox heraus entweder eigene Cookies setzen, oder vorhandene auslesen...

    • Tekl
    • vor 6 Monaten
    • Gemeldet - anzeigen

    Danke für die Tipps. Wie führe ich den JavaScript aus? In der Doku finde ich nichts dazu. Wichtig in meinem Fall zu wissen, ich nutze nicht Ninox Cloud.

      • Ninox-Professional
      • planoxpro
      • vor 6 Monaten
      • Gemeldet - anzeigen

       Vielleicht gibt es noch eine bessere Lösung, aber mir fiele dazu spontan nur ein, die in Frage kommenden Geräte mit Bezeichnung und Kennung in einer Tabelle abzulegen, bei jedem Öfnen der Datenbank abzufragen und in einem temporären Feld zu speichern. Das würde aber voraussetzen, dass die Datenbank auf jedem Gerät wieder geschlossen wird, bevor man sie an einem anderen Gerät öffnet (oder man stellt ggf. manuell um).

    • Tekl
    • vor 6 Monaten
    • Gemeldet - anzeigen

    Das mit der Abfrage und dem Dialog mache ich bereits so. Ist allerdings unkomfortabel und fehleranfällig.

    Ich habe mittlerweile über html() in einem Funktions-Feld hinbekommen, mittels localStorage einen eindeutigen Wert zu speichern. Doch irgendwie komme ich nicht über herkömmliche Ninox-Funktionen an den Inhalt des Feldes.

    html("
    <span id=result></span>
    <script>
    myDevice = localStorage.getItem('device');
    if (myDevice == null) {
        localStorage.setItem('device', crypto.randomUUID());
    }
    
    document.getElementById('result').innerHTML = localStorage.getItem('device');
    </script>
    ")
    
    • Tobias_Bartzsch
    • vor 6 Monaten
    • Gemeldet - anzeigen

    ...aber user() funktioniert doch auch in der App...?

      • Tekl
      • vor 6 Monaten
      • Gemeldet - anzeigen

       Ja, gibt es, aber das Ergebnis ist auf jedem Gerät "User". Wie gesagt, ich arbeite nur mit lokalen per iCloud synchronisierten Datenbanken.

    • mirko3
    • vor 6 Monaten
    • Gemeldet - anzeigen

    Wenn du das Ergebnis in ein Textfeld übertragen willst, benötigst Du die Feld-ID des Textfelds (im Beispiel ist es 'R') und kannst dann per Button den Wert übertragen. Feld-ID werden fortlaufend vergeben, kann also über Versuch gefunden werden oder per API - findest Du hier im Forum. Falls Du das nicht schon wußtest. Mirko

    let content := "
    <script>
    function transfer() {
    myDevice = localStorage.getItem('device');
    if (myDevice == null) {
        localStorage.setItem('device', crypto.randomUUID());
    }
    const result = localStorage.getItem('device');
    let idNX = '" +
        raw(Nr) +
        "';
    database.update(idNX, 'R' , result);
    }
    </script>
    <button onclick='transfer()'>
     <p id='ip'>device</p></button>
    ";
    html(content)
    
      • Tekl
      • vor 6 Monaten
      • Gemeldet - anzeigen

      Vielen Dank  ,

      mit der API hatte ich noch nix am Hut. Ich dachte, die geht nur in der Cloud. database.update() klappt aber auch lokal. Wie ich die Feld-ID herausfinde, konnte ich nicht im Forum finden, bzw. nur Methoden die scheinbar die Cloud benötigen. Ich habe mir dann so beholfen:

      1. Formelfeld angelegt
      2. Textfeld angelegt
      3. Textfeld in Formel referenziert
      4. Textfeld gelöscht
      5. In Formel steht nun die ID (in meinem Fall K1)
      6. Neues Textfeld angelegt
      7. Das hat nun die nächste ID (L1)

      Wenn ich die Funktion direkt aufrufe, muss ich nichtmal einen Button anklicken, das Feld wird gefüllt, sobald ich die Ansicht aufrufe. Mal schauen, ob ich damit nun eine Lösung habe.

      • Tekl
      • vor 6 Monaten
      • Gemeldet - anzeigen

       Ich hab jetzt selbst rausgefunden, dass ich auch die ID in einer Formel eingeben kann und sie dann in den Feldnamen übersetzt wird. Ich hätte also auch A1, B1, C1 … durchprobieren können.

      • mirko3
      • vor 6 Monaten
      • Gemeldet - anzeigen

      Tja, das ist ja mal eine coole Lösung zur Bestimmung der FeldID. Danke Dir.

      • mirko3
      • vor 6 Monaten
      • Gemeldet - anzeigen

      Das verstehe ich nicht. Welche Formel meinst Du, in die Du die ID eingibst? (bezüglich 2. Post)

      • Tekl
      • vor 6 Monaten
      • Gemeldet - anzeigen

       Das ist einfach ein temporäres Formelfeld, das zunächst nichts ausgibt (""). Dann erstelle ich das Feld, damit ich es in die Formel einfügen kann. Nach dem Löschen des Feldes (zwischendurch Änderungen speichern) ist die Formel fehlerhaft und sie zeigt statt des ursprünglichen Feldnamens nur noch die ID. Nun kenne ich den letzten Index und weiß, dass das nächst Feld eine ID höher bekommt. Danach kann ich die Formel dann natürlich wieder löschen. Die brauchte ich nur, um die ID zu bekommen.

      • mirko3
      • vor 6 Monaten
      • Gemeldet - anzeigen

      Okay. Habe es gerade nachvollzogen. Genial. Danke fürs Teilen.

      • Ninox-Professional
      • planoxpro
      • vor 6 Monaten
      • Gemeldet - anzeigen

       Pfiffige Lösung. Auf die Idee bin ich auch noch nicht gekommen. 😄

      • Tobias_Bartzsch
      • vor 6 Monaten
      • Gemeldet - anzeigen

      ja sauber! Vor allem sind einem die wilden Buchstaben nach löschen einzelner Felder schon öfter mal aufgefallen ... 

    • Tekl
    • vor 6 Monaten
    • Gemeldet - anzeigen

    Für das Protokoll: Ich habe Mirkos Formel wie folgt abgewandelt:

    let content := "
    <span id='myresult'></span>
    <script>
    function transfer() {
    myDevice = localStorage.getItem('device');
    if (myDevice == null) {
        localStorage.setItem('device', crypto.randomUUID());
    }
    const result = localStorage.getItem('device');
    document.getElementById('myresult').innerHTML = result;
    let idNX = '" +
        raw(Nr) +
        "';
    database.update(idNX, 'T1' , result);
    }
    transfer();
    </script>
    ";
    html(content)

    Das Formelfeld muss sichtbar sein, damit es automatisch die ID in ein Textfeld (in meinem Fall 'T1') einfügt. Da meine Datenbank ohnehin mit einem Dashboard (Tabelle mit nur einem Datensatz) startet, musste ich das Formelfeld hier nur einfügen, das Textfeld liegt in einem versteckten Reiter. Ich habe das Formelfeld ohne Feldnamen und mit weißer Schrift und weißem Hintergrund eingesetzt, damit es nicht sichtbar ist.

    • john_eans
    • vor 6 Monaten
    • Gemeldet - anzeigen

    Inwiefern ist damit nun das Ursprungsproblem gelöst? Ich komm da grad nicht ganz mit und würd mich über etwas Licht im Dunkeln freuen 🙂

      • Tekl
      • vor 6 Monaten
      • Gemeldet - anzeigen

       Ich habe mal eine Beispieldatenbank erstellt. Die Funktionsweise:

      • Beim Öffnen wird die Tabelle "Dashboard" aufgerufen.
      • Dort gibt es das Formelfeld "DeviceID hole (JS)", das beim Anzeigen automatisch ein JavaScript ausführt.
      • Das JavaScript prüft, ob im localStorage der Browser-Engine (die Ninox-App ist ein Browser) ein Wert "device" hinterlegt ist.
      • Ist das nicht der Fall, wird eine UUID generiert und im localStorage abgelegt.
      • Ansonsten wird die bereits gespeicherte ID aus dem localStorage eingelesen.
      • So erhält jedes Gerät (und jeder User eines Macs/PCs) eine eindeutige ID.
      • Da man in Ninox-Skripten nicht auf das Ergebnis des JavaScripts zugreifen kann, muss die ID in einem normalen Feld gespeichert werden. Das macht das JavaScript mit database.update().

      Getestet habe ich das aber nur mit Macs und der „nativen“ App.

      • john_eans
      • vor 6 Monaten
      • Gemeldet - anzeigen

       Jetzt hab ich es verstanden.
      War nur überrascht, dass es plötzlich um die Feld-IDs ging und nichtmehr um die Geräte ID. Aber jetzt ist das Zusammenspiel klar 👍

Content aside

  • Status Answered
  • vor 6 MonatenZuletzt aktiv
  • 25Antworten
  • 458Ansichten
  • 6 Folge bereits