このトピックでは、CocoaPods を使用して既存の iOS プロジェクトに Location プラグインを追加する方法について説明します。Location ソフトウェア開発キット (SDK) は、位置情報サービス (LBS) API のシンプルなセットを提供します。これらの API を使用して、位置データを取得できます。
CocoaPods を使用して、既存の iOS プロジェクトに Location SDK を連携させることができます。
前提条件
mPaaS がプロジェクトに連携されていること。詳細については、「既存のプロジェクトで CocoaPods を使用した連携」をご参照ください。
SDK の追加
cocoapods-mPaaS プラグインを使用して Location コンポーネント SDK を追加します。これを行うには、次の手順に従います。
Podfile で、
mPaaS_pod "mPaaS_LBS"を使用して Location コンポーネントの依存関係を追加します。
コマンドラインから
pod installを実行して、連携を完了します。位置情報アラートを有効にします。

SDK の使用
このトピックでは、公式の Location デモを使用して、ベースライン 10.1.32 以降で Location SDK を使用する方法を説明します。
APMobileLBS モジュールは、現在の緯度と経度を取得するメソッドを提供します。
位置情報サービスは逆ジオコーディングをサポートしていません。逆ジオコーディングを実行するには、Amap API を呼び出してください。
API リファレンス
以下のコードは、位置情報サービスの API を示しています。コード内のコメントは、API とそのパラメーターについて説明しています。
MPLBSConfiguration によるパラメーターの構成
/**
位置情報サービスの構成。
*/
@interface MPLBSConfiguration : NSObject
/** 1 回の位置情報リクエストで要求される精度 (メートル単位)。シナリオに基づいて、500m の範囲であれば 500 のように、許容可能な正の数値を渡します。 */
@property (nonatomic, assign) CLLocationAccuracy desiredAccuracy;
/** 1 回の位置情報リクエストで許容されるキャッシュの有効期間。この値は、キャッシュされた位置情報が現在時刻から遡ってどれくらいの期間有効であるかを指定します。キャッシュ時間は 30 秒以上に設定してください。 */
@property (nonatomic, assign) APCoreLocationCacheAvaliable cacheTimeInterval;
/** 1 回の位置情報リクエストまたは逆ジオコーディングクエリのタイムアウト期間 (秒単位)。デフォルト値および最小値は 2 秒です。 */
@property (nonatomic, assign) NSTimeInterval timeOut;
/** 逆ジオコーディングクエリの情報レベル。デフォルトは APCoreLocationReGeoLevelDistrict です。 */
@property (nonatomic, assign) LBSLocationReGeoLevel reGeoLevel;
/** 逆ジオコーディングクエリの位置情報。このパラメーターで緯度と経度の座標を指定します。 */
@property (nonatomic, strong) CLLocation *reGeoLocation;
/** 逆ジオコーディングクエリの位置情報が Amap 座標系を使用するかどうかを指定します。デフォルトは YES です。このパラメーターは、reGeoLocation パラメーターが使用されている場合にのみ有効です。 */
@property (nonatomic, assign) BOOL reGeoCoordinateConverted;
/** チェックイン機能を有効にするかどうかを指定します。デフォルトは NO です。必要に応じて有効にしてください。 */
@property (nonatomic, assign) BOOL needCheckIn;
/**
* 高精度な位置情報が必要かどうかを指定します。iOS 14 より前のバージョンでは精度は区別されません。iOS 14 以降では、デフォルトは NO (低精度) です。ご利用のサービスで高精度な位置情報が必要かどうかを指定してください。
*/
@property (nonatomic,assign) BOOL highAccuracyRequired;
@endMPLBSLocationManager による位置情報リクエストの開始
/**
位置情報取得結果のコールバックブロック。
@param success 操作が成功したかどうかを指定します。
@param locationInfo 位置情報。
@param error 位置情報リクエストが失敗した場合のエラーメッセージ。
*/
typedef void(^MPLBSLocationCompletionBlock)(BOOL success,
MPLBSLocationInfo *locationInfo,
NSError *error);
/**
位置情報サービス。
*/
@interface MPLBSLocationManager : NSObject
/**
インスタンスを初期化します。
@param configuration パラメーター設定。
@return インスタンス。
*/
- (instancetype)initWithConfiguration:(MPLBSConfiguration *)configuration;
/**
1 回の位置情報リクエストを開始します。
@param needReGeocode 逆ジオコーディング情報が必要かどうかを指定します。位置情報サービスは逆ジオコーディングをサポートしていないため、このパラメーターには NO を渡してください。
@param block 位置情報リクエストが完了したときのコールバックブロック。
*/
- (void)requestLocationNeedReGeocode:(BOOL)needReGeocode
completionHandler:(MPLBSLocationCompletionBlock)block;コールバックにおける MPLBSLocationInfo の説明
/**
逆ジオコーディング情報。
*/
@interface MPLBSReGeocodeInfo : NSObject
@property (nonatomic, strong) NSString* country; // 国
@property (nonatomic, strong) NSString* countryCode; // 国コード
@property (nonatomic, strong) NSString* provience; // 省
@property (nonatomic, strong) NSString* city; // 市
@property (nonatomic, strong) NSString* district; // 区
@property (nonatomic, strong) NSString* street; // 通り
@property (nonatomic, strong) NSString* streetCode; // 通りコード
@property (nonatomic, strong) NSString* cityCode; // 市コード
@property (nonatomic, strong) NSString* adCode; // 行政区画コード
@property (nonatomic, strong) NSArray* poiList; // POI リスト
@end
/**
位置情報取得結果における位置情報のデータ構造。
*/
@interface MPLBSLocationInfo : NSObject
@property (nonatomic, strong) CLLocation* location; // 位置情報
@property (nonatomic, strong) MPLBSReGeocodeInfo* rgcInfo; // 逆ジオコーディング情報
@endコード例
- (void)getLocation {
MPLBSConfiguration *configuration = [[MPLBSConfiguration alloc] init];
configuration.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager = [[MPLBSLocationManager alloc] initWithConfiguration:configuration];
[self.locationManager requestLocationNeedReGeocode:NO completionHandler:^(BOOL success, MPLBSLocationInfo * _Nonnull locationInfo, NSError * _Nonnull error) {
NSString *message;
if (success) {
message = [NSString stringWithFormat:@"Location successful. Longitude: %.5f, Latitude: %.5f, Accuracy: %.3f, High accuracy: %d", locationInfo.location.coordinate.longitude, locationInfo.location.coordinate.latitude, locationInfo.location.horizontalAccuracy, !locationInfo.location.ap_lbs_is_high_accuracy_close];
} else {
message = [NSString stringWithFormat:@"%@", error];
}
dispatch_async(dispatch_get_main_queue(), ^{
AUNoticeDialog *alert = [[AUNoticeDialog alloc] initWithTitle:@"Location Result" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
});
}];
}iOS 14 への対応
iOS 14 では、「正確な位置情報」は、アプリが位置情報の権限をリクエストする際にユーザーが選択できる権限オプションです。ユーザーは、位置情報の権限設定ページでこの設定を変更することもできます。
入力パラメーターの対応
MPLBSConfiguration に、highAccuracyRequired パラメーターを追加します。highAccuracyRequired = YES が渡されたにもかかわらず、高精度な測位が無効になっている場合、コールバックエラーが発生します。
/**
位置情報サービスの構成。
*/
@interface MPLBSConfiguration : NSObject
/**
* 高精度な位置情報が必要かどうかを指定します。iOS 14 より前のバージョンでは精度は区別されません。iOS 14 以降では、デフォルトは NO (低精度) です。ご利用のサービスで高精度な位置情報が必要かどうかを指定してください。
*/
@property (nonatomic,assign) BOOL highAccuracyRequired;
@end// highAccuracyRequired が YES に設定されていて、高精度な位置情報の権限が付与されていない場合、コールバックでエラーが返されます。
Errorcode: APCoreLocationErrorCodeHighAccuracyAuthorizationコールバックの対応
highAccuracyRequired = NO が渡された場合、または高精度な測位が指定されていない場合、コールバックオブジェクト CLLocation には ap_lbs_is_high_accuracy_close フィールドが含まれます。このフィールドは、高精度な測位が無効になっているかどうかを示します。
// レスポンスパラメーターの変更
@interface CLLocation (APMobileLBS)
/*
* 正確な位置情報が無効になっているかどうかを指定します。デフォルトは NO です。
*/
@property(nonatomic,assign)BOOL ap_lbs_is_high_accuracy_close;
@endコード例
- (void)getLocationWithHighAccuracy {
MPLBSConfiguration *configuration = [[MPLBSConfiguration alloc] init];
configuration.desiredAccuracy = kCLLocationAccuracyBest;
configuration.highAccuracyRequired = YES;
self.locationManager = [[MPLBSLocationManager alloc] initWithConfiguration:configuration];
[self.locationManager requestLocationNeedReGeocode:NO completionHandler:^(BOOL success, MPLBSLocationInfo * _Nonnull locationInfo, NSError * _Nonnull error) {
NSString *message;
if (success) {
message = [NSString stringWithFormat:@"Location successful. Longitude: %.5f, Latitude: %.5f, Accuracy: %.3f, High accuracy: %d", locationInfo.location.coordinate.longitude, locationInfo.location.coordinate.latitude, locationInfo.location.horizontalAccuracy, !locationInfo.location.ap_lbs_is_high_accuracy_close];
} else {
message = [NSString stringWithFormat:@"%@", error];
}
dispatch_async(dispatch_get_main_queue(), ^{
AUNoticeDialog *alert = [[AUNoticeDialog alloc] initWithTitle:@"Location Result" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
});
}];
}