質問編集履歴

2 誤字

tectec

tectec score 10

2019/04/17 17:54  投稿

Unity バックグラウンド時、位置情報取得
### 前提・実現したいこと
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
import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
   
   var locationManager : CLLocationManager!
   func getLocation() {
       locationManager = CLLocationManager.init()
       locationManager.allowsBackgroundLocationUpdates = true; // バックグランドモードで使用する場合YESにする必要がある
       locationManager.desiredAccuracy = kCLLocationAccuracyBest; // 位置情報取得の精度
       locationManager.distanceFilter = 1; // 位置情報取得する間隔、1m単位とする
       locationManager.delegate = self as? CLLocationManagerDelegate;
       
       // 位置情報の認証チェック
       let status = CLLocationManager.authorizationStatus()
       if (status == .notDetermined) {
           print("許可、不許可を選択してない");
           // 常に許可するように求める
           locationManager.requestAlwaysAuthorization();
       }
       else if (status == .restricted) {
           print("機能制限している");
       }
       else if (status == .denied) {
           print("許可していない");
       }
       else if (status == .authorizedWhenInUse) {
           print("このアプリ使用中のみ許可している");
           locationManager.startUpdatingLocation();
       }
       else if (status == .authorizedAlways) {
           print("常に許可している");
           locationManager.startUpdatingLocation();
       }
   }
   //**************************************************
   // CLLocationManagerDelegate
   //**************************************************
   
   // 位置情報が取得されると呼ばれる
   func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
       // 最新の位置情報を取得 locationsに配列で入っている位置情報の最後が最新となる
       //let location : CLLocation = locations.last!;
       print("位置情報の取得に失敗");
   }
   
   // 位置情報の取得に失敗すると呼ばれる
   func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
       print("位置情報の取得に失敗");
   }
   
   func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
       if (status == .restricted) {
           print("機能制限している");
       }
       else if (status == .denied) {
           print("許可していない");
       }
       else if (status == .authorizedWhenInUse) {
           print("このアプリ使用中のみ許可している");
           locationManager.startUpdatingLocation();
       }
       else if (status == .authorizedAlways) {
           print("常に許可している");
           locationManager.startUpdatingLocation();
       }
   }
}
```
### 試したこと
xcodeで新規プロジェクトを作成し、上記と同様のコード及び環境設定にて実行したところlocationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)が正常に呼びだされることを確認。
### 補足情報(FW/ツールのバージョンなど)
iOSは12.0 swiftは4.0です。
  • C#

    12235 questions

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

  • iOS

    6102 questions

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

  • Unity

    8261 questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Swift

    11960 questions

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

1 初心者アイコン付与

tectec

tectec score 10

2019/04/15 21:23  投稿

Unity バックグラウンド時、位置情報取得
### 前提・実現したいこと
Unityで位置情報を利用するiOSアプリを開発しています。
上記アプリのバックグラウンド動作中に端末の位置情報を随時取得したいと思っています。
以下の認識で開発を行っています。
①Unityではアプリをバックグラウンドにした場合、update等が一時停止状態になり、Unity及びC#のみではバックグラウンド動作中に処理を行うことは不可能である
②ネイティブプラグインを自作してObjective-cやSwiftで正しい処理を記載すればバックグラウンド動作中に処理を行うことが可能である
### 発生している問題・エラーメッセージ
locationManager.requestAlwaysAuthorizationによって表示される位置情報取得を常に許可するかのアラートは表示されるが1秒程度で消えてしまう。
上記問題により、Unity側でInput.location.Startを先に呼んで位置情報取得を許可するアラートを表示し、許可するを選択することでCLLocationManager.authorizationStatusから取得できる値をauthorizedWhenInUseに変更することは成功したが、アプリがフォアグラウンド時であってもlocationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)のデリゲートメソッドが呼び出されない問題が発生している。
### 該当のソースコード
以下のサイト様を参考に記述、環境設定を行っています。
http://program-life.com/191
```Swift
import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
var locationManager : CLLocationManager!
func getLocation() {
locationManager = CLLocationManager.init()
locationManager.allowsBackgroundLocationUpdates = true; // バックグランドモードで使用する場合YESにする必要がある
locationManager.desiredAccuracy = kCLLocationAccuracyBest; // 位置情報取得の精度
locationManager.distanceFilter = 1; // 位置情報取得する間隔、1m単位とする
locationManager.delegate = self as? CLLocationManagerDelegate;
// 位置情報の認証チェック
let status = CLLocationManager.authorizationStatus()
if (status == .notDetermined) {
print("許可、不許可を選択してない");
// 常に許可するように求める
locationManager.requestAlwaysAuthorization();
}
else if (status == .restricted) {
print("機能制限している");
}
else if (status == .denied) {
print("許可していない");
}
else if (status == .authorizedWhenInUse) {
print("このアプリ使用中のみ許可している");
locationManager.startUpdatingLocation();
}
else if (status == .authorizedAlways) {
print("常に許可している");
locationManager.startUpdatingLocation();
}
}
//**************************************************
// CLLocationManagerDelegate
//**************************************************
// 位置情報が取得されると呼ばれる
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
// 最新の位置情報を取得 locationsに配列で入っている位置情報の最後が最新となる
//let location : CLLocation = locations.last!;
print("位置情報の取得に失敗");
}
// 位置情報の取得に失敗すると呼ばれる
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("位置情報の取得に失敗");
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if (status == .restricted) {
print("機能制限している");
}
else if (status == .denied) {
print("許可していない");
}
else if (status == .authorizedWhenInUse) {
print("このアプリ使用中のみ許可している");
locationManager.startUpdatingLocation();
}
else if (status == .authorizedAlways) {
print("常に許可している");
locationManager.startUpdatingLocation();
}
}
}
```
### 試したこと
xcodeで新規プロジェクトを作成し、上記と同様のコード及び環境設定にて実行したところlocationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)が正常に呼びだされることを確認。
### 補足情報(FW/ツールのバージョンなど)
iOSは12.0 swiftは4.0です。
  • C#

    12235 questions

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

  • iOS

    6102 questions

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

  • Unity

    8261 questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Swift

    11960 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る