現在位置を表示するには?

swiftUIで現在位置を取得して、表示させる

【やりたい事】

swiftUIを使って、現在位置の取得をしたい。

 

・地図を利用する

・CLLocationManager を利用する

・フレームワークを追加する

・swiftUIでmapKitを使う

・アラート表示(位置情報のon)

・struct MapView を同じファイルに書く

・func makeUIView でUIViewを使う

・func updateUIView で更新された時の処理を書く

 

■私がはまった部分

1. swiftuiのViewについての理解

2. コアロケーションって何?

3. infoplistの設定がうまく出来ていなかった

4. フレームワークをダウンロードしなかったら、プレビューがおかしかった

 

■わたしの結論

先に考察を書くと、GPS情報については、古いUIKitの情報を調べて、昔はどうやって書いていたか?を知り

さらに新しいSwiftUIのコードの書き方と照らし合わせて、学習するしかない・・・

と思いました。

初めて学ぶ人には、かなりハードな内容かな・・・と思ったりしていますw

ホント、一人で勉強するのつらいっす...

 

CLLocationManageを利用

GPSの位置情報や電子コンパスの機能を使いたい場合はCLLocationManagerクラスを使用します。

CLLocationManagerクラスは、「CoreLocation.framework」フレームワークを追加して使用します。

 

NSObject

CLLocationManager

 

という関係になっています。

フレームワークをダウンロードしてつかう。と思って、先に進みましょう。

詳細はこちら>>

 

フレームワークのダウンロード

 

 

プロジェクトをクリック。上記の部分を押して、フレームワークをダウンロードする。

 

「Build Phases」をクリック

「Link Binary With Libraries」を選ぶ

「+」をクリックしてCoreLocation.frameworkを追加します。

 

 

CoreLocation.frameworkを追加すると、プレビューしたときに、左下に趣味レーターが表示されるようになります

 

GPSなど位置情報をCoreLocationを使って取得>>

 

プライバシー情報の取得

info.plistの設定

位置や連絡先、ヘルスなどプライバシーに関わる情報を取得する前に、ユーザから許可を得る必要があります。

Info.plistにその告知文を追加する必要があります

 

Key: Privacy-Location When In Use Usage Description
Value: 任意の文字列(「このアプリは位置情報を取得します」など)

 

【ポイント】

Privacyが抜けていると、ダメです。

位置情報の取得画面がきちんと動かないと、位置情報を取得できません。

 

NSObject

CLLocationManager

 

【許可の種類】

authorizedAlways・・・ 常に許可する。

authorizedWhenInUse・・・ 使用中だけ許可する。

denied・・・ 許可しない。

 

サンプルコード

2020年 8/17に動くソースです。

swift 5.24

xcode 11.6

2020年 8/21

 

バージョンはコロコロ変わるので、注意してください。

 

import SwiftUI
import MapKit

struct ContentView: View {

@State var manager = CLLocationManager()
@State var alert = false//値を監視するために@Stateで設定する

var body: some View {

MapView(manager: $manager, alert: $alert)

.alert(isPresented: $alert) {//アラートの表示条件。引数(isPresented)に$alertを渡します。

//表示フラグの値そのものではなく、参照値を渡す為にプロパティ名の頭には$を付けます

//アラートが閉じられるタイミングで、表示フラグはfalseに戻されます。


Alert(title: Text("設定パネルで位置情報をアクセスを有効にしてください"))//この文章が表示される
}
}
}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

struct MapView : UIViewRepresentable {

@Binding var manager : CLLocationManager
@Binding var alert : Bool
let map = MKMapView()

func makeCoordinator() -> MapView.Coordinator {
return Coordinator(parent1: self)
}

func makeUIView(context: UIViewRepresentableContext<MapView>) -> MKMapView {


let center = CLLocationCoordinate2D(latitude: 13.086, longitude: 80.2707)
let region = MKCoordinateRegion(center: center, latitudinalMeters: 1000, longitudinalMeters: 1000)
map.region = region
manager.requestWhenInUseAuthorization()
manager.delegate = context.coordinator
manager.startUpdatingLocation()
return map
}
func updateUIView(_ uiView: MKMapView, context: UIViewRepresentableContext<MapView>) {

}

class Coordinator : NSObject,CLLocationManagerDelegate{
var parent : MapView

init(parent1 : MapView) {

parent = parent1
}

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {

if status == .denied{

parent.alert.toggle()
}
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

let location = locations.last
let point = MKPointAnnotation()

let georeader = CLGeocoder()
georeader.reverseGeocodeLocation(location!) { (places, err) in

if err != nil{

print((err?.localizedDescription)!)
return
}

let place = places?.first?.locality
point.title = place
point.subtitle = "Current"
point.coordinate = location!.coordinate
self.parent.map.removeAnnotations(self.parent.map.annotations)
self.parent.map.addAnnotation(point)

let region = MKCoordinateRegion(center: location!.coordinate, latitudinalMeters: 1000, longitudinalMeters: 1000)
self.parent.map.region = region
}
}
}
}

 

 

このソースコードで動きます。

本当にありがたい。これを見つけるのに1日かかりました・・・

 

 

こんな感じで作っていくようです。参考にしてください。

 

makeUIView・・・apple公式

 

func makeUIView(context: Self.Context) -> Self.UIViewType

 

 

locationManager・・・apple公式

 

optional func locationManager(_ manager: CLLocationManager,
didVisit visit: CLVisit)

 

 

この部分について解説

class Coordinator : NSObject,CLLocationManagerDelegate{
var parent : MapView
init(parent1 : MapView) {
parent = parent1
}

 

CLLocationManagerDelegate

CLLocationManagerDelegateはプロトコルです。

デリゲートのメソッドを呼び出して、ロケーション関連のイベントをアプリに報告します

deveを見る>>

 

CoreLocation.framework追加
CoreLocation/CoreLocation.hをインクルード
CLLocationManagerDelegateプロトコル使用を宣言
didUpdateLocationsデリゲートメソッドを作成
CLLocationManagerのインスタンスを生成
生成したインスタンスにデリゲート割り当て
生成したインスタンスのstartUpdatingLocationメソッド呼び出し

参照:GPSから位置情報を取得する

 

class ViewController: UIViewController, CLLocationManagerDelegate {
var locationManager: CLLocationManager!

 

プロトコルを継承することで、位置情報更新など、イベントに対する処理ができる

ViewController.swift で継承したことで、クラスが増えずシンプルな実装になる。

プロトコルはクラスで継承できるのね

 

以前はこのように書いていたようです。

 

override func viewDidLoad() {
super.viewDidLoad()

// locationManager初期化
locationManager = CLLocationManager()
// ユーザーの使用許可を確認
locationManager.requestWhenInUseAuthorization()
// 使用許可に対するステータス
let status = CLLocationManager.authorizationStatus()
if status == .authorizedWhenInUse {
// delegateを設定
locationManager.delegate = self
// 測位精度の設定
locationManager.desiredAccuracy = locationAccuracy[1]
// アップデートする距離半径(m)
locationManager.distanceFilter = 10
// 位置情報の取得を開始
locationManager.startUpdatingLocation()
}

以前の書き方参照>>

 

以前はこんな感じで書いてました。

 

デリゲートメソッドが変更された理由

ios14では、場所のアクセス許可に加えて、精度のアクセス許可(高精度/低精度)が追加されています。

そのため、

 

・位置情報精度について、full、reducedの2パターンが追加され、どちらの値だったとしてもアプリ側が対応できるようにしておく必要がある

 

・full精度ではないとできないような機能がある場合、「一時的なfull精度の許可」を求めるか、「設定アプリにユーザーを飛ばして設定を変更してもらう」という対応のどちらかにすると良い。

 

・必要もないのにfull精度の許可をユーザーに求めるような事は適切でない。

reduced精度をデフォルト設定とする事もできるので、選択肢の一つとして考えるべき。

 

位置情報の精度について

位置情報には、2種類があります

 

正確な位置が必要・・・地図アプリ

状況によって必要・・・SNSアプリ、ツイッター、FB

 

つまり、情報の精度はコントロールできた方がよいです。

ios14からは、精度についてユーザーに聞く必要があります。

 

 

精度がfull の場合は、上記のようになります。

 

iOS13~では3つの選択肢でしたが、ios14からは、精度という項目が追加になります。

それにともない、

 

authorizationStatuslocationManagerDidChangeAuthorization(_:) は廃止になる予定です。

すでに作ってしまったアプリは大丈夫なようですが、最新に合わせる必要があります。

 

非推奨になったもの

var headingAvailable: Bool は非推奨で

class func headingAvailable() -> Bool に変更

 

swiftuiではiosのverが変わるたびに、非推奨になりソースコードを変更しなければならない。

つまり、開発をしても、変更についていかないと、アプリが使えなくなる。

なぜ非推奨になったのか?を追っていく必要がある。

 

 

CLLocationManager

CLLocationManagerを生成し、CLLocationManagerDelegateプロトコルを実装したクラスをdelegateに設定すると、位置情報取得に関する許可が変更された時に、locationManager(_:didChangeAuthorization:)でその状態を受け取ることができるようになります。

 

そして、この認可ステータスに基いて、必要な許可をユーザーに求めたり、情報取得を開始したり、設定変更を促すメッセージを表示するなどの処理を記述します。

 

 

コード

 

お役に立てればうれしいです。

 

まとめ

今回は、現在位置の表示について、勉強してみました。

GPSを使ったアプリは、ウーバーなどに利用されています。今後、ロケーション情報を使ったアプリは、かなり利用されてくると思うので、このあたりの勉強をしておくのは、意味があると思います。

ただ、swiftUIの情報が少なすぎるので、皆さんの情報もお待ちしています。

 

swiftUIの初学は本当につらいです。情報がない・・・

情報がなさすぎる・・・という連続です。一緒に学ぼう!!という人がいましたら、ぜひご一緒しましょう。

上級のエンジニアの人も、ぜひ仲良くなれたら嬉しいです。

ぜひ、コメント、DMください。東京で集まって、勉強会しましょう^^

牧宏典まで、ぜひぜひ!!

twはこちら>>

FBはこちら>>

 

参照サイト

参照したサイトについてご紹介します。とても分かりやすく情報がまとまっていますので

ぜひ参考にしてみてください。

 

位置情報の取得>>

makeUIView・・・apple公式

locationManager・・・apple公式

 

 

大変申し訳ありませんが、当社ではサービスの質を落とさないために、月の契約は5件までとさせていただいております。 契約をお待ちいただく可能性もございますので、ご了承のほどよろしくお願いいたします

 

 

 

 

この記事を読んだ人は、こんな記事も読んでいます

 

SEO対策の基本 外部要因とは?

SEO対策の基本的である、外部要因とは何か?

SEO対策をするなら絶対に知っておきたい、基本知識です。

 

売れるサイトを作るのに知って起きたい知識

サーチエンジンマーケティングという言葉をご存知でしょうか?

ホームページで商品やサービスを売る時に知っておきたいマーケティング

についてご紹介いたします。

seo対策をするメリットとは

SEO対策をする5つのメリットとは?

なぜ上位表示させることが大事なのか?なぜSEO対策をする必要があるのか

についてご紹介させていただきます。

 

内部要因とは

SEO対策の内部要因とは?

上位表示させるためには、内部要因について知っておくことも大事です。

キーワードを上位表示させるために必要なのは、ソースコードを最適化することです

内部要因の対策について知りたい方はこちらへ

 

キーワード対策をするまえに

キーワード対策をする前に

そのキーワード対策。ちょっと待ってください。

そのまま対策をすると、必ずお金を損してしまいます。個人事業主や中小企業は

そんな大きなキーワードで対策をしてはいけません。

広告費用が高くなる理由とは

広告費用が高くなる本当の理由とは?

売れないサイトに集めていませんか?広告費用がかかるわりには

お問い合わせが少ない・・・と感じる方は多いはずです。

購入率の悪いサイトに集客をしている可能性があります。

 

 

 

 

【SEO対策・web広告・webコンサルティングのプラスワーク対応エリアについて】

プラスワークでは、東京、神奈川、千葉、埼玉を中心に全国でwebコンサルティング、SEO対策、ホームページの更新、ホームページのリニューアル運営代行をしております。売上アップをお考えならお気軽にご相談ください。

 

【SEO対策・web広告・webコンサルティングのプラスワーク 対応地域】

北海道 [ 北海道 ]

東北  [ 青森 | 岩手 | 山形 | 福島 | 秋田 | 宮城 ]

関東  [ 東京 | 埼玉 | 千葉 | 茨城 | 栃木 | 群馬 | 神奈川 ]

甲信越 [ 山梨 | 長野 | 新潟 ]

北陸  [ 石川 | 福井 | 富山 ]

東海  [ 愛知 | 静岡 | 岐阜 | 三重 ]

近畿  [ 大阪 | 兵庫 | 京都 | 滋賀 | 奈良 | 和歌山 ]

中国  [ 島根 | 山口 |鳥取 | 広島 | 岡山 ]

四国  [ 徳島 | 香川 | 愛媛 | 高知 ]

九州  [ 福岡 | 佐賀 | 長崎 | 熊本 | 大分 | 宮崎 | 鹿児島 ]

プラスワークでは全国でSEO対策、ホームページ更新、制作をしております。中小企業専門SEO対策・ホームページ更新制作会社、ダイレクト レスポンス マーケティング、ウェブ マーケティング、マーケティング 分析、口コミのよいSEO対策会社をお探しならプラスワークにお任せくださいませ。

 

 

【コンテンツ】

トップへ

更新レスキュー

料金について

制作実績

お客様の声

よくある質問

会社概要

お問い合わせ

【更新レスキュー】

ライトコース

ゴールドコース

プラチナコース

 

【その他】

ニュース

メルマガ登録

特別資料プレゼント

相互リンク募集中

【課題から探す】

ホームページの課題

SEO対策とは

SEO対策がダメな理由

上位表示されない理由

相互リンクとは

順位が落ちてしまう原因

 

 

フェイスブック  ツイッター