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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

2861閲覧

iBeaconを検知してUUIDやMajor,MinorIDをXcodeのコンソールに表示する。

SERA0_0b

総合スコア1

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2021/12/26 18:11

前提・実現したいこと

iBeaconを検知してUUIDやMajor,MinorIDをXcodeのコンソールに表示させたいです。
下記コードを実行したところコンソールには何も表示されず、原因や改善方法を知りたいです。
CoreLocationというフレームワークを使っております。
公式ドキュメント
https://developer.apple.com/documentation/corelocation
エラーメッセージは出ておりません。
各関数の使い方が間違っていたり、関数を呼び出さないといけないところで呼び出してなかったり
のような間違いなのか、どこが上手く機能していないのか分かりません。
ソースコードのどのあたりを変更したら良いかご教示頂けると幸いです。

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

エラーメッセージは出ていません。

該当のソースコード

Swift

1import UIKit 2import CoreLocation 3 4class ViewController: UIViewController, CLLocationManagerDelegate { 5 6 var myLocationManager : CLLocationManager! 7 var myBeaconRegion : CLBeaconRegion! 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 // Do any additional setup after loading the view. 12 13 // 受信対象のビーコンのUUIDを設定 14 let uuid:UUID? = UUID(uuidString: "********-****-****-****-************") 15 16 // ビーコン領域の初期化 17 myBeaconRegion = CLBeaconRegion(uuid: uuid!, identifier: "BeaconApp") 18 19 // ロケーションマネージャを作成する 20 myLocationManager = CLLocationManager(); 21 22 // デリゲートを自身に設定 23 myLocationManager.delegate = self; 24 25 } 26 27 //インスタンス作成時に呼ばれる 28 func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) { 29 let status = manager.authorizationStatus 30 switch status { 31 case .authorizedAlways, .authorizedWhenInUse: 32 break 33 case .notDetermined, .denied, .restricted: 34 myLocationManager.requestWhenInUseAuthorization() 35 default: 36 break 37 } 38 } 39 40 //位置認証のステータスが変更された時に呼ばれる 41 func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { 42 //観測を開始させる 43 myLocationManager.startMonitoring(for: self.myBeaconRegion) 44 } 45 46 //観測の開始に成功すると呼ばれる 47 func locationManager(_ manager: CLLocationManager, didStartMonitoringFor region: CLRegion) { 48 //観測開始に成功したら、領域内にいるかどうかの判定をおこなう。→(didDetermineState)へ 49 myLocationManager.requestState(for: self.myBeaconRegion) 50 } 51 52 // ビーコン領域のステータスを取得 53 func locationManager(_ manager: CLLocationManager, didDetermineState state: CLRegionState, for inRegion: CLRegion) { 54 55 switch (state) { 56 case .inside: // ビーコン領域内 57 // ビーコンの測定を開始 58 self.myLocationManager.startRangingBeacons(satisfying: self.myBeaconRegion.beaconIdentityConstraint) 59 break 60 case .outside: // ビーコン領域外 61 break 62 63 case .unknown: // 不明 64 break 65 66 } 67 } 68 69 // ビーコン領域に入った時 70 func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) { 71 // ビーコンの位置測定を開始 72 self.myLocationManager.startRangingBeacons(satisfying: self.myBeaconRegion.beaconIdentityConstraint) 73 } 74 75 //領域から出た時 76 func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) { 77 //測定を停止する 78 self.myLocationManager.stopRangingBeacons(satisfying: self.myBeaconRegion.beaconIdentityConstraint) 79 } 80 81 // ビーコンの位置測定 82 func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion){ 83 for beacon in beacons { 84 print("uuid:(beacon.uuid)") 85 print("major:(beacon.major)") 86 print("minor:(beacon.minor)") 87 if (beacon.proximity == CLProximity.immediate) { 88 print("proximity:immediate") 89 } 90 if (beacon.proximity == CLProximity.near) { 91 print("proximity:near") 92 } 93 if (beacon.proximity == CLProximity.far) { 94 print("proximity:Far") 95 } 96 if (beacon.proximity == CLProximity.unknown) { 97 print("proximity:unknown") 98 } 99 print("accuracy:(beacon.accuracy)") 100 print("rssi:(beacon.rssi)") 101 print("timestamp:(beacon.timestamp)") 102 } 103 } 104} 105

試したこと

print関数が機能していないのではと思ったのですが、他のプログラムでは動いていたのを確認できました。設定しているUUIDも間違いはございませんでした。iBeaconはbluetoothをonにしていないと動かないと聞いたことがあり、wi-fiやbluetoothもonの状態で実行致しましたが上手くいきませんでした。

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

Swift5
Xcode.Ver.13.2.1

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

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

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

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

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

hoshi-takanori

2021/12/26 18:20

実機を USB ケーブル (または Wifi) で Xcode に繋いで、デバッグ状態で動かしてるってことでしょうか?
SERA0_0b

2021/12/26 18:23

iPhone11をUSBでMacBookに接続し、デバッグ状態で実行しております。
SERA0_0b

2021/12/27 13:51

1つ間違いを見つけました。 --------------------------------------------------- //インスタンス作成時に呼ばれる func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) { let status = manager.authorizationStatus switch status { case .authorizedAlways, .authorizedWhenInUse: break case .notDetermined, .denied, .restricted: myLocationManager.requestWhenInUseAuthorization() default: break } } //位置認証のステータスが変更された時に呼ばれる func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { //観測を開始させる myLocationManager.startMonitoring(for: self.myBeaconRegion) } ---------------------------------------------------- 上記の部分を、以下のように変更するとさらに下のlocationManagerも呼び出されるようになりました。 ---------------------------------------------------- //インスタンス作成時及び位置認証のステータスが変更された時に呼ばれる func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) { print("bbb") let status = manager.authorizationStatus switch status { case .authorizedAlways, .authorizedWhenInUse: //観測を開始させる print("ccc") myLocationManager.startMonitoring(for: self.myBeaconRegion) case .notDetermined, .denied, .restricted: myLocationManager.requestWhenInUseAuthorization() default: break } } ------------------------------------------------------------ ただ、この時、ビーコン領域のステータスを取得する部分で、 ビーコン領域外(switch文の.outside)のところに判定されてしまいます。 ビーコンは目の前に置いているので、確実に領域内のはずなのですが、 なぜ領域外と判定されるのかが分かりません。
guest

回答1

0

自己解決


//インスタンス作成時に呼ばれる
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
let status = manager.authorizationStatus
switch status {
case .authorizedAlways, .authorizedWhenInUse:
break
case .notDetermined, .denied, .restricted:
myLocationManager.requestWhenInUseAuthorization()
default:
break
}
}

//位置認証のステータスが変更された時に呼ばれる
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
//観測を開始させる
myLocationManager.startMonitoring(for: self.myBeaconRegion)
}

まず、上記の部分を、以下のように変更します。

//インスタンス作成時及び位置認証のステータスが変更された時に呼ばれる
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
print("bbb")
let status = manager.authorizationStatus
switch status {
case .authorizedAlways, .authorizedWhenInUse:
//観測を開始させる
print("ccc")
myLocationManager.startMonitoring(for: self.myBeaconRegion)
case .notDetermined, .denied, .restricted:
myLocationManager.requestWhenInUseAuthorization()
default:
break
}
}

さらに、Xcodeを開いているPC側でwi-fiとbluetoothをONにします。
私の場合、アプリをインストールした実機の方だけ、wi-fiとbluetoothをONにしていたため
動作していないようでした。
質問を閲覧・回答頂きありがとうございました。

投稿2021/12/28 08:18

SERA0_0b

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問