koogawa blog

iOS、Android、foursquareに関する話題

【Tips】iOSで電子コンパスを使う

2016/4/2追記:Swift編はこちら

blog.koogawa.com


磁力センサーを利用し、iPhoneの向きを計測する方法を解説します。

「磁北」と「真北」について

単純に「北」と言っても、「磁北(じほく)」と「真北(しんぽく)」の二種類が存在します(2つの違いについては「真北とは? | 用語集とGISの使い方 | 株式会社パスコ」で丁寧に解説されています)。

ここでは磁北を取得する方法について解説します。

実装方法

まずは「CoreLocation.framework」を追加します。

f:id:koogawa:20131122152458p:plain

次にヘッダをインポートします。

#import <CoreLocation/CoreLocation.h>

CLLocationManagerDelegateプロトコルも宣言しておきます。

@interface ViewController : UIViewController <CLLocationManagerDelegate>
@end

ヘディングイベントの取得を開始します。

    if ([CLLocationManager headingAvailable])
    {
        // インスタンスを生成
        _locationManager = [[CLLocationManager alloc] init];

        // デリゲートを設定
        _locationManager.delegate = self;

        // 何度動いたら更新するか(デフォルトは1度)
        _locationManager.headingFilter = kCLHeadingFilterNone;

        // デバイスのどの向きを北とするか(デフォルトは画面上部)
        _locationManager.headingOrientation = CLDeviceOrientationPortrait;

        // ヘディングイベントの開始
        [_locationManager startUpdatingHeading];
    }

この状態でiPhoneの向きが変わると、次のメソッドが呼ばれます。

// デバイスの方位が変わるたびに呼ばれる
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{
    CLLocationDirection heading = newHeading.magneticHeading;
    self.textField.text = [NSString stringWithFormat:@"%.2f", heading];
}

magneticHeading には 0.0 から 359.9 の値が入ります。北の方向がちょうど 0.0 になり、それから東、南、西の順に値が増えていき、北に戻ると再び 0.0 に戻ります。

方角
0.0
90.0
180.0
西 270.0

ヘディングイベントの取得を停止するには次のメソッドを実行します。

if ([CLLocationManager headingAvailable]) {
    [_locationManager stopUpdatingHeading];
}

イベントの取得が不要になったら、忘れずに停止しておきましょう。

サンプルコード

注意点

応用できそうなアプリ

参考リンク