2011-11-07 11 views
8

Jak uzyskać dostęp do kompasu iPhone'a w Firemonkey?Jak uzyskać dostęp do kompasu w systemie iOS?

+0

Nie rozumiem, to jest coś w stylu: pytam, daję odpowiedź? – RBA

+0

@RBA, właśnie udostępniam moją zakładkę. Mam nadzieję, że to jest przydatne. WIĘC pozwala na to, zobacz FAQ. – Johan

+0

Rzeczywiście :) masz absolutną rację, to był powód, by dać ci +1. IMHO, to również powinno być umieszczone na wiki, ponieważ jest to dobre pytanie na temat rozwoju iOS. – RBA

Odpowiedz

8

Oto film howto: http://blogs.embarcadero.com/ao/2011/10/13/39171
Pełny kod źródłowy: http://cc.embarcadero.com/item/28536
I (krótka) artykuł: http://edn.embarcadero.com/article/41715

A oto kod źródłowy komponentu kompasu.
Nie próbowałem jeszcze, ale powinno działać.

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. 
+0

+1 Byłoby jednak dobrze, aby odpowiednie części zawarte w odpowiedzi, jeśli to w ogóle możliwe. – jpfollenius

+0

@Smasher, zobaczę, co mogę zrobić. – Johan

+0

@Smasher, dodano kod źródłowy komponentu kompasu – Johan

Powiązane problemy