![]() |
Testen ob die App den LocationSensor nutzen darf!
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:
Grüsse Mavarik :coder:
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; |
AW: Testen ob die App den LocationSensor nutzen darf!
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.:cry: Hast du eine aktuelle Lösung parat? Grüße Steffen |
AW: Testen ob die App den LocationSensor nutzen darf!
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:
Den Zustand Immer erlauben kann man auch in machen Versionen erst im 2ten Schritt einstellen.
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; Programmmässig scheint es da keine Möglichkeit zu geben das einzustellen, oder auch nur die Frage hochkommen zu lassen. ![]() ![]() ![]() 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. |
AW: Testen ob die App den LocationSensor nutzen darf!
Zitat:
Rollo hat ja schon geantwortet... Danke für die Info - Ich werde mal meinen aktuellen Source daraufhin testen.. |
AW: Testen ob die App den LocationSensor nutzen darf!
... 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:
Aufruf dann so:
{$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}
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} |
AW: Testen ob die App den LocationSensor nutzen darf!
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz