AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung iOS Testen ob die App den LocationSensor nutzen darf!
Thema durchsuchen
Ansicht
Themen-Optionen

Testen ob die App den LocationSensor nutzen darf!

Ein Thema von Mavarik · begonnen am 7. Jun 2013 · letzter Beitrag vom 9. Apr 2020
Antwort Antwort
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#1

Testen ob die App den LocationSensor nutzen darf!

  Alt 7. Jun 2013, 11:26
Hallo Zusammen!

Jede App, die zum erstem mal den LocationSensor auf Active stellt, lößt ja eine Frage beim User aus,
ob die App den Ortungsdienst nutzen darf...

Was ist also, wenn der User NEIN tippt?

Weitere Aufrufen von LocationSensor.Active := true; können zwar aufgerufen werden, aber haben keinen Effekt!

Und jetzt...? Den Switch Disablen? Wie bekomme ich raus, dass der User "NEIN" getippt hat?

Ich hab da mal was vorbereitet...(Auszug aus unserer Library)

Delphi-Quellcode:
Function DDTCheckLocationAvail:boolean;
var
  LSensorArray : TSensorArray;
  LSensor : TCustomSensor;
  CS : TCustomLocationSensor;
begin
  {$IFDEF IOS}
  result := false;
  TSensorManager.Current.Activate();
  try
    LSensorArray := TSenSorManager.Current.GetSensorsByCategory(TSensorCategory.Location);

    for LSensor in LSensorArray do
      begin
        CS := TCustomLocationSensor(LSensor);
        if not CS.Started then
          CS.Start;

         if TCustomLocationSensor.TProperty.Latitude IN CS.AvailableProperties then
           Result := true;

         CS.Stop;
      end;

  finally
// TSensorManager.Current.Deactivate; Soll man machen, lößt aber eine Exception aus...
  end;
  {$ELSE}
  result := False;
  {$ENDIF}
end;

Quick an Dirty... Bei mir Funktioniert es, wenn jemand ne bessere Idee hat, bin ich für Vorschläge offen.

Somit kann ich dem User die entsprechende Information geben...

Delphi-Quellcode:
procedure TGenMain.GPSSwitch(Sender: TObject);
begin
  if GPS.IsChecked
    then begin
           if DDTCheckLocationAvail
             then LocationSensor1.Active := true
             else begin
                    ShowMessage('Sie haben den Ortungsdienst nicht gestattet!');
                    GPS.IsChecked := false;
                  end;
         end
    else begin
           LocationSensor1.Active := false;
         end;
end;
Grüsse Mavarik
  Mit Zitat antworten Zitat
Stewag

Registriert seit: 12. Jun 2008
175 Beiträge
 
Delphi 12 Athens
 
#2

AW: Testen ob die App den LocationSensor nutzen darf!

  Alt 8. Apr 2020, 22:39
Hallo Mavarik,

deine Anleitung scheint mit der kürzlich erfolgten Verschärfung bei der Abfrage der Positionsdatennutzung nicht mehr zu funktionieren.
Es gibt ja jetzt drei Fälle: "Bei Verwenden der App erlauben", "Einmal erlauben" und "Nie erlauben".
Wird letzteres gewählt so erhalte ich stets den
"Fehler: Nicht autorisierte Verwendung der Positionsdienste"

Ich habe einiges ausprobiert aber keine Möglichkeit gefunden den Fehler zu umgehen.

Hast du eine aktuelle Lösung parat?

Grüße
Steffen
Steffen
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.100 Beiträge
 
Delphi 12 Athens
 
#3

AW: Testen ob die App den LocationSensor nutzen darf!

  Alt 9. Apr 2020, 08:12
Das leider sehr komplex, besonders wenn noch weitere Permissions gebraucht werden.
Foreground / Background spielt da auch mit rein.
Das ist äusserst behämmert gelöst von Apple, weil es da keine Asynchronen callbacks gibt,
so wie bei Android.

Immerhin kann man den Status abfragen.

Delphi-Quellcode:
function IsAuthorized_Foreground( const AAllowBackgroundOperation : Boolean ) : Boolean;
var
    LRes : TAuthorizationType;

begin

    // Taken from System.iOS.Sensors
    case TCLLocationManager.OCClass.authorizationStatus of
      kCLAuthorizationStatusNotDetermined :
          LRes := TAuthorizationType.atNotSpecified;

      kCLAuthorizationStatusDenied, // by user
      kCLAuthorizationStatusRestricted : // maybe globally
          LRes := TAuthorizationType.atUnauthorized;

      kCLAuthorizationStatusAuthorizedWhenInUse :
          begin
              if AAllowBackgroundOperation then
              begin
                  LRes := TAuthorizationType.atUnauthorized // this may not be allowed in background
              end
              else
                  LRes := TAuthorizationType.atAuthorized; // CAN USE
          end;

      kCLAuthorizationStatusAuthorizedAlways :
                  LRes := TAuthorizationType.atAuthorized; // CAN USE

    else // avoids compiler warnings
          LRes := TAuthorizationType.atNotSpecified;
    end;

    if LRes = TAuthorizationType.atAuthorized then
    begin
        Result := True;
    end
    else
    begin
        Result := False;
    end;

end;
Den Zustand Immer erlauben kann man auch in machen Versionen erst im 2ten Schritt einstellen.
Programmmässig scheint es da keine Möglichkeit zu geben das einzustellen,
oder auch nur die Frage hochkommen zu lassen.

https://medium.com/better-programmin...s-5482abc77961

https://medium.com/@jigarm/core-loca...s-ac2f46848dfc

https://stackoverflow.com/questions/...-time/37471850

Das ist auch abgekündigt und geändert, und scheint auf jedem Phone irgendwie anders zu funktionieren.
Ich bin schon froh wenn die App nicht einfach abstürzt.
Eine einfache Lösung habe ich auch nicht, ich frage regelmässig den Status ab bevor ich weitermache.
Das bringt aber meine bisherigen Abläufe ziemlich Durcheinander.

Geändert von Rollo62 ( 9. Apr 2020 um 08:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Testen ob die App den LocationSensor nutzen darf!

  Alt 9. Apr 2020, 11:51
Hallo Mavarik,

deine Anleitung scheint mit der kürzlich erfolgten Verschärfung bei der Abfrage der Positionsdatennutzung nicht mehr zu funktionieren.



Hast du eine aktuelle Lösung parat?
Hi, Du hast schon gesehen, dass der Post von 2013 ist, oder?

Rollo hat ja schon geantwortet...

Danke für die Info - Ich werde mal meinen aktuellen Source daraufhin testen..
  Mit Zitat antworten Zitat
Stewag

Registriert seit: 12. Jun 2008
175 Beiträge
 
Delphi 12 Athens
 
#5

AW: Testen ob die App den LocationSensor nutzen darf!

  Alt 9. Apr 2020, 14:22
... ja habe ich gesehen. Deswegen beziehe ich mich ja auch auf die neueren Apple Änderungen, die ja gar nicht mehr soo neu sind. Ich dachte ich frage dich trotzdem, da du an dem Thema zumindest damals dicht dran warst.

Der Code von Rollo ist mir so gar nicht eingängig, danke trotzdem, Rollo!

Hier mein angepasster Code. Ist aber etwas holprig, insbesondere weil beim ersten Aufruf bei blockierten Diensten trotzdem der Toast ("Die nächste Station...") kommt:

Code:
{$IFDEF IOS}
Function DDTCheckLocationAvail: boolean;
var
  LSensorArray: TSensorArray;
  LSensor: TCustomSensor;
  CS: TCustomLocationSensor;
  PositionAllowed: boolean;
begin
  result := False;
  PositionAllowed := true;

  TSensorManager.Current.Activate();
  try
    LSensorArray := TSensorManager.Current.GetSensorsByCategory(TSensorCategory.Location);
    for LSensor in LSensorArray do
    begin
      CS := TCustomLocationSensor(LSensor);
      if not CS.Started then
        try
          CS.Start; // hier gibt es eine Exception wenn die Positionsdienste NICHT autorisiert wurden!
        except
          PositionAllowed := False;
          result := False;
        end;

      if PositionAllowed then
        if TCustomLocationSensor.TProperty.Latitude IN CS.AvailableProperties then
          result := true;

      CS.Stop
    end;
  finally
    // TSensorManager.Current.Deactivate; // Soll man machen, lößt aber eine Exception aus...
  end
end;
{$ENDIF IOS}
Aufruf dann so:

Code:
{$IFDEF iOS}
  if DDTCheckLocationAvail then
  begin
    dm.LocationSensor1.Active := true;
    dm.Timer1.Enabled := true;
    TfgToast.show('Die nächste Station wird bestimmt...', short)
  end
  else
  begin
    showmessage('Zugriff auf Positionsdaten wurde verweigert. Bitte ggfl. in den Einstellungen des Gerätes ändern');
    dm.LocationSensor1.Active := False;
  end
{$ENDIF}
Steffen
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.100 Beiträge
 
Delphi 12 Athens
 
#6

AW: Testen ob die App den LocationSensor nutzen darf!

  Alt 9. Apr 2020, 17:53
Ich benutze auch die Methode mit den Exceptions, finde ich aber nicht so elegant.
Damit hatte ich schon Fälle in denen Location einmal ging, dann nicht mehr.

Hast Du schon das KastriFree Projekt getestet, das läuft bei mir mit iOS13 sehr stabil.

Das Probelem ist grundsätzlich wenn der User nicht alle Rechte freigibt, oder schlimmer noch später wieder entzieht.
Ich habe auch iOS13 Geräte, auf einem funktioniert es wunderbar, auf dem anderen crasht es.
Es ist schon zum Heulen.

Geändert von Rollo62 ( 9. Apr 2020 um 17:55 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz