How do I access the iphone compass in Firemonkey?
To turn on true north, tap Settings→Compass and then tap Use True North on.
With iOS 12, Apple has moved the feature into the new Measure app, completely removing its function in the Compass app. For more help getting the most out of your Apple devices, check out our how to guide as well as the following articles: How to add App Store and iTunes gift cards on iPhone and iPad.
Here's a howto video: http://blogs.embarcadero.com/ao/2011/10/13/39171
Full source code: http://cc.embarcadero.com/item/28536
And a (short) article: http://edn.embarcadero.com/article/41715
And here's source code for a compass component.
Have not tried it yet, but it should work.
unit Compass;
{Based on Anders Ohlsson Firemonkey Compass example}
{$IFDEF FPC}
{$mode objfpc}{$H+}
{$modeswitch objectivec1}
{$ENDIF}
interface
uses
SysUtils, Classes, FMX_Types
{$IFDEF FPC}
, iPhoneAll
{$ENDIF}
;
type
TUpdateEvent = TNotifyEvent;
TiOSGPSCompass = class(TFmxObject)
private
FLatitude: Double;
FLongitude: Double;
FAltitude: Double;
FHeading: Double;
FOnUpdate: TUpdateEvent;
UpdateNeeded: Boolean;
protected
procedure SetLatitude(value: Double);
procedure SetLongitude(value: Double);
procedure SetAltitude(value: Double);
procedure SetHeading(value: Double);
procedure Update;
public
constructor Create(AOwner: Classes.TComponent); override;
destructor Destroy; override;
published
property Latitude: Double read FLatitude;
property Longitude: Double read FLongitude;
property Altitude: Double read FAltitude;
property Heading: Double read FHeading;
property OnUpdate: TUpdateEvent read FOnUpdate write FOnUpdate;
end;
var
MyGPSCompass: TiOSGPSCompass = nil;
procedure Register;
implementation
{$IFDEF FPC}
uses
CoreLocation;
{$ENDIF}
{$IFDEF FPC}
type
MyCLController = objcclass(NSObject)
locationManager : CLLocationManager;
procedure locationManager_didUpdateToLocation_fromLocation(manager: CLLocationManager; newLocation, oldLocation: CLLocation); message 'locationManager:didUpdateToLocation:fromLocation:';
procedure locationManager_didUpdateHeading(manager: CLLocationManager; newHeading: CLHeading); message 'locationManager:didUpdateHeading:';
end;
var
Controller : MyCLController;
{$ENDIF}
{$IFDEF FPC}
procedure MyCLController.locationManager_didUpdateToLocation_fromLocation(manager: CLLocationManager; newLocation, oldLocation: CLLocation);
begin
if Assigned(MyGPSCompass) then begin
MyGPSCompass.SetLatitude(newLocation.coordinate.latitude);
MyGPSCompass.SetLongitude(newLocation.coordinate.longitude);
MyGPSCompass.SetAltitude(newLocation.altitude);
MyGPSCompass.Update;
end;
end;
{$ENDIF}
{$IFDEF FPC}
procedure MyCLController.locationManager_didUpdateHeading(manager: CLLocationManager; newHeading: CLHeading);
begin
if Assigned(MyGPSCompass) then begin
MyGPSCompass.FCompassHeading:= newHeading.magneticheading;
MyGPSCompass.Update;
end;
end;
{$ENDIF}
constructor TiOSGPSCompass.Create(AOwner: TComponent);
begin
inherited;
{$IFDEF FPC}
Controller := MyCLController.alloc.init;
Controller.locationManager := CLLocationManager.alloc.init;
Controller.locationManager.setDelegate(Controller);
Controller.locationManager.setDesiredAccuracy(kCLLocationAccuracyBestForNavigation);
Controller.locationManager.startUpdatingLocation;
Controller.locationManager.startUpdatingHeading;
{$ENDIF}
MyGPSCompass:= Self;
end;
destructor TiOSGPSCompass.Destroy;
begin
{$IFDEF FPC}
Controller.locationManager.release;
Controller.release;
{$ENDIF}
inherited;
end;
procedure TiOSGPSCompass.SetLatitude(value: Double);
begin
if (FLatitude <> value) then begin
FLatitude:= value;
UpdateNeeded:= True;
end;
end;
procedure TiOSGPSCompass.SetLongitude(value: Double);
begin
if (FLongitude <> value) then begin
FLongitude:= value;
UpdateNeeded:= True;
end;
end;
procedure TiOSGPSCompass.SetAltitude(value: Double);
begin
if (FAltitude <> value) then begin
FAltitude:= value;
UpdateNeeded:= True;
end;
end;
procedure TiOSGPSCompass.SetHeading(value: Double);
begin
if (FHeading <> value) then begin
FHeading:= value;
UpdateNeeded:= True;
end;
end;
procedure TiOSGPSCompass.Update;
begin
if (UpdateNeeded and Assigned(OnUpdate)) then OnUpdate(Self);
UpdateNeeded:= False;
end;
procedure Register;
begin
RegisterComponents('iOS', [TiOSGPSCompass]);
end;
end.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With