質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

0回答

2580閲覧

Unity バックグラウンド時、位置情報取得

tectec

総合スコア10

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2019/04/15 12:18

編集2019/04/17 08:54

前提・実現したいこと

Unityで位置情報を利用するiOSアプリを開発しています。
上記アプリのバックグラウンド動作中に端末の位置情報を随時取得したいと思っています。

以下の認識で開発を行っています。認識に誤りがあればご教示ください。
①Unityではアプリをバックグラウンドにした場合、update等が一時停止状態になり、Unity及びC#のみではバックグラウンド動作中に処理を行うことは不可能である
②ネイティブプラグインを自作してObjective-cやSwiftで正しい処理を記載すればバックグラウンド動作中に処理を行うことが可能である

発生している問題・エラーメッセージ

以下の2点の問題が発生しています。原因・解決策をご教示ください。
locationManager.requestAlwaysAuthorizationによって表示される位置情報取得を常に許可するかのアラートは表示されるが1秒程度で消えてしまう。
上記問題により、Unity側でInput.location.Startを先に呼んで位置情報取得を許可するアラートを表示し、許可するを選択することでCLLocationManager.authorizationStatusから取得できる値をauthorizedWhenInUseに変更することは成功したが、アプリがフォアグラウンド時であってもlocationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)のデリゲートメソッドが呼び出されない問題が発生している。

該当のソースコード

以下のサイト様を参考に記述、環境設定を行っています。
http://program-life.com/191

Swift

1import UIKit 2import CoreLocation 3 4class ViewController: UIViewController, CLLocationManagerDelegate { 5 6 var locationManager : CLLocationManager! 7 8 func getLocation() { 9 10 locationManager = CLLocationManager.init() 11 locationManager.allowsBackgroundLocationUpdates = true; // バックグランドモードで使用する場合YESにする必要がある 12 locationManager.desiredAccuracy = kCLLocationAccuracyBest; // 位置情報取得の精度 13 locationManager.distanceFilter = 1; // 位置情報取得する間隔、1m単位とする 14 locationManager.delegate = self as? CLLocationManagerDelegate; 15 16 // 位置情報の認証チェック 17 let status = CLLocationManager.authorizationStatus() 18 if (status == .notDetermined) { 19 print("許可、不許可を選択してない"); 20 // 常に許可するように求める 21 locationManager.requestAlwaysAuthorization(); 22 } 23 else if (status == .restricted) { 24 print("機能制限している"); 25 } 26 else if (status == .denied) { 27 print("許可していない"); 28 } 29 else if (status == .authorizedWhenInUse) { 30 print("このアプリ使用中のみ許可している"); 31 locationManager.startUpdatingLocation(); 32 } 33 else if (status == .authorizedAlways) { 34 print("常に許可している"); 35 locationManager.startUpdatingLocation(); 36 } 37 } 38 39 //************************************************** 40 // CLLocationManagerDelegate 41 //************************************************** 42 43 // 位置情報が取得されると呼ばれる 44 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 45 // 最新の位置情報を取得 locationsに配列で入っている位置情報の最後が最新となる 46 //let location : CLLocation = locations.last!; 47 print("位置情報の取得に失敗"); 48 } 49 50 // 位置情報の取得に失敗すると呼ばれる 51 func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { 52 print("位置情報の取得に失敗"); 53 } 54 55 func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { 56 if (status == .restricted) { 57 print("機能制限している"); 58 } 59 else if (status == .denied) { 60 print("許可していない"); 61 } 62 else if (status == .authorizedWhenInUse) { 63 print("このアプリ使用中のみ許可している"); 64 locationManager.startUpdatingLocation(); 65 } 66 else if (status == .authorizedAlways) { 67 print("常に許可している"); 68 locationManager.startUpdatingLocation(); 69 } 70 } 71}

試したこと

xcodeで新規プロジェクトを作成し、上記と同様のコード及び環境設定にて実行したところlocationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)が正常に呼びだされることを確認。

補足情報(FW/ツールのバージョンなど)

iOSは12.0 swiftは4.0です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問