{"id":12072,"date":"2026-02-20T12:34:33","date_gmt":"2026-02-20T03:34:33","guid":{"rendered":"https:\/\/www.moonmile.net\/blog\/?p=12072"},"modified":"2026-02-20T12:35:27","modified_gmt":"2026-02-20T03:35:27","slug":"iphoneios-%e3%81%a7-ibeacon-%e3%81%a8-en-api-%e7%99%ba%e4%bf%a1%e6%a9%9f%e3%82%92%e4%bd%9c%e3%82%8b","status":"publish","type":"post","link":"http:\/\/www.moonmile.net\/blog\/archives\/12072","title":{"rendered":"iPhone(iOS) \u3067 iBeacon \u3068 EN API \u767a\u4fe1\u6a5f\u3092\u4f5c\u308b"},"content":{"rendered":"\n<p>\u63a5\u89e6\u78ba\u8a8d\u30a2\u30d7\u30ea\u3067\u306f Android\/iOS \u306e\u76f8\u4e92\u3067 BLE \u901a\u4fe1\u3092\u884c\u3046\u305f\u3081\u306b\u3001iOS \u3067\u306e\u767a\u4fe1\u6a5f\u306e\u30c1\u30a7\u30c3\u30af\u3082\u3057\u3066\u304a\u304d\u307e\u3059\u3002<br>iOS \u306e\u5834\u5408\u306f\u300116 bit Service UUID \u5f62\u5f0f\u3068 Manufacturer Data \u5f62\u5f0f\u3067\u306f\u767a\u4fe1\u3067\u304d\u307e\u305b\u3093\u3002\u304c\u3001&#8221;\u767a\u4fe1\u3067\u304d\u306a\u3044\u3053\u3068&#8221; \u3092\u78ba\u8a8d\u3059\u308b\u305f\u3081\u306b\u3001\u3042\u3048\u3066\u4e21\u65b9\u306e\u5b9f\u88c5\u3082\u3057\u3066\u3042\u308a\u307e\u3059\u3002\u5b9f\u969b\u306b iOS\/Android \u306e\u53d7\u4fe1\u6a5f\u3067\u53d7\u4fe1\u304c\u3067\u304d\u306a\u3044\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<p>iOS \u306e\u5834\u5408\u3001BLE \u306e\u767a\u4fe1\u30bf\u30a4\u30df\u30f3\u30b0\u3092\u5236\u5fa1\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002\u53d7\u4fe1\u6a5f\u306e\u69d8\u5b50\u3092\u898b\u308b\u3068\u3001\u304b\u306a\u308a\u306e\u983b\u5ea6\u3067\u53d7\u4fe1\u3059\u308b\u306e\u3067\u3001Android \u306e Low Latency \u3068\u540c\u7b49\u306e\u767a\u4fe1\u30bf\u30a4\u30df\u30f3\u30b0\u3067\u767a\u4fe1\u3057\u3066\u3044\u308b\u3088\u3046\u3067\u3059\u3002\u3053\u308c\u306f\u3001\u5225\u9014 M5Stack \u3067\u53d7\u4fe1\u6a5f\u3092\u4f5c\u3063\u3066\u8a08\u6e2c\u3057\u3066\u3044\u304d\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>SwiftUI \u3067\u4f5c\u308b<\/strong><\/h2>\n\n\n\n<p>\u3053\u308c\u3082 SwiftUI \u3067\u4f5c\u308a\u307e\u3059\u3002\u6700\u7d42\u7684\u306b\u306f Flutter \u3068\u304b React Native \u3067\u3082\u3088\u3044\u6c17\u304c\u3059\u308b\u306e\u3067\u3059\u304c\u3001BLE \u307e\u308f\u308a\u306e\u5236\u5fa1\u304c\u3001Android \u3068 iOS \u3067\u304b\u306a\u308a\u7570\u306a\u308b\u306e\u3067\u30cd\u30a4\u30c6\u30a3\u30d6\u306e\u307e\u307e\u3067\u4f5c\u3063\u3066\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: swift; title: ; notranslate\" title=\"\">\nstruct ContentView: View {\n    var body: some View {\n        TabView {\n            BeaconTabView()\n                .tabItem {\n                    Label(&quot;Beacon&quot;, systemImage: &quot;antenna.radiowaves.left.and.right&quot;)\n                }\n\n            FolkBearsTabView()\n                .tabItem {\n                    Label(&quot;FolkBears&quot;, systemImage: &quot;bear&quot;)\n                }\n\n            ENTabView()\n                .tabItem {\n                    Label(&quot;EN API&quot;, systemImage: &quot;wave.3.right&quot;)\n                }\n\n            MfDTabView()\n                .tabItem {\n                    Label(&quot;MfD&quot;, systemImage: &quot;shippingbox&quot;)\n                }\n        }\n    }\n}\n\nstruct BeaconTabView: View {\n    @StateObject private var transmitter = BeaconTransmitter()\n    @State private var majorHex: String = &quot;&quot;\n    @State private var minorHex: String = &quot;&quot;\n\n    var body: some View {\n        NavigationView {\n            Form {\n                Section {\n                    HStack {\n                        Text(&quot;Bluetooth&quot;)\n                        Spacer()\n                        Text(transmitter.bluetoothState)\n                            .foregroundStyle(.secondary)\n                    }\n                    HStack {\n                        Text(&quot;\u9001\u4fe1\u72b6\u614b&quot;)\n                        Spacer()\n                        Text(transmitter.transmissionStatus)\n                            .foregroundStyle(transmitter.isTransmitting ? .green : .secondary)\n                    }\n                } header: {\n                    Text(&quot;\u30b9\u30c6\u30fc\u30bf\u30b9&quot;)\n                }\n\n                Section {\n                    TextField(&quot;Major (4 hex)&quot;, text: $majorHex)\n                        .textInputAutocapitalization(.none)\n                        .autocorrectionDisabled(true)\n                        .font(.system(.body, design: .monospaced))\n                        .onSubmit(applyMajorMinor)\n\n                    TextField(&quot;Minor (4 hex)&quot;, text: $minorHex)\n                        .textInputAutocapitalization(.none)\n                        .autocorrectionDisabled(true)\n                        .font(.system(.body, design: .monospaced))\n                        .onSubmit(applyMajorMinor)\n                } header: {\n                    Text(&quot;Major \/ Minor (hex)&quot;)\n                }\n\n                Section {\n                    Toggle(&quot;raw iBeacon manufacturer \u3092\u4f7f\u3046&quot;, isOn: $transmitter.useRawIBeaconAdvertising)\n                } header: {\n                    Text(&quot;\u30aa\u30d7\u30b7\u30e7\u30f3&quot;)\n                }\n\n                Section {\n                    HStack {\n                        Button {\n                            transmitter.startTransmitting()\n                        } label: {\n                            Label(&quot;\u767a\u4fe1\u958b\u59cb&quot;, systemImage: &quot;play.fill&quot;)\n                        }\n                        .disabled(transmitter.isTransmitting || transmitter.bluetoothState != &quot;Powered On&quot;)\n\n                        Button {\n                            transmitter.stopTransmitting()\n                        } label: {\n                            Label(&quot;\u505c\u6b62&quot;, systemImage: &quot;stop.fill&quot;)\n                        }\n                        .disabled(!transmitter.isTransmitting)\n                    }\n                } header: {\n                    Text(&quot;\u64cd\u4f5c&quot;)\n                }\n            }\n            .navigationTitle(&quot;Beacon&quot;)\n            .onAppear(perform: syncFieldsFromModel)\n        }\n    }\n\n    private func syncFieldsFromModel() {\n        let newMajor = UInt16.random(in: 0...UInt16.max)\n        let newMinor = UInt16.random(in: 0...UInt16.max)\n        transmitter.major = newMajor\n        transmitter.minor = newMinor\n        majorHex = String(format: &quot;%04X&quot;, newMajor)\n        minorHex = String(format: &quot;%04X&quot;, newMinor)\n    }\n\n    private func applyMajorMinor() {\n        let cleanedMajor = majorHex.trimmingCharacters(in: .whitespacesAndNewlines)\n            .replacingOccurrences(of: &quot;0x&quot;, with: &quot;&quot;)\n            .uppercased()\n        if let value = UInt16(cleanedMajor, radix: 16) {\n            transmitter.major = value\n            majorHex = String(format: &quot;%04X&quot;, value)\n        }\n\n        let cleanedMinor = minorHex.trimmingCharacters(in: .whitespacesAndNewlines)\n            .replacingOccurrences(of: &quot;0x&quot;, with: &quot;&quot;)\n            .uppercased()\n        if let value = UInt16(cleanedMinor, radix: 16) {\n            transmitter.minor = value\n            minorHex = String(format: &quot;%04X&quot;, value)\n        }\n    }\n}\n\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>iBeacon \u5f62\u5f0f\u3067\u767a\u4fe1\u3059\u308b<\/strong><\/h2>\n\n\n\n<p>iBeacon \u3092\u767a\u4fe1\u3059\u308b\u3068\u304d\u306f CBPeripheralManager, CLBeaconRegion, CBPeripheralManagerDelegate \u3092\u4f7f\u3044\u307e\u3059\u3002iBeacon \u81ea\u4f53\u306f\u3001Manufacturer Data \u3068\u540c\u3058\u306a\u306e\u3067\u3001\u5b9f\u306f startAdvertisingRawIBeacon \u95a2\u6570\u306e\u3088\u3046\u306b\u3001Manufacturer Data \u3092\u624b\u4f5c\u308a\u3057\u3066 startAdvertising \u3059\u308b\u3053\u3068\u3082\u53ef\u80fd\u306a\u306e\u3067\u3059\u304c\u3001\u5b9f\u306f\u3067\u304d\u307e\u305b\u3093\u3002iOS \u3067\u306f\u3001\u81ea\u7531\u306a\u30c7\u30fc\u30bf\u3092\u9001\u4fe1\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u306a\u304f\u3066\u3001\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u306f iBeacon \u5f62\u5f0f\u306e\u307f\u306b\u9650\u3089\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: swift; title: ; notranslate\" title=\"\">\nclass BeaconTransmitter: NSObject, ObservableObject {\n    private var peripheralManager: CBPeripheralManager?\n    private var beaconRegion: CLBeaconRegion?\n    \/\/ \u5b9f\u9a13\u7528: raw iBeacon manufacturer data \u3092\u4f7f\u3063\u3066\u5e83\u544a\u3059\u308b\u304b\u3069\u3046\u304b\n    @Published var useRawIBeaconAdvertising = false\n    \/\/ \u4fdd\u6301\u3057\u3066\u304a\u304f\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u30c7\u30fc\u30bf\uff08\u30c7\u30d0\u30c3\u30b0\u7528\uff09\n    private var lastAdvertisementData: &#x5B;String: Any]?\n\n    @Published var isTransmitting = false\n    @Published var transmissionStatus = &quot;\u505c\u6b62\u4e2d&quot;\n    @Published var bluetoothState = &quot;Unknown&quot;\n    @Published var major: UInt16 = 0\n    @Published var minor: UInt16 = 0\n\n    \/\/ \u30c7\u30d5\u30a9\u30eb\u30c8\u306eiBeacon\u8a2d\u5b9a\n    private let defaultUUID = UUID(uuidString: &quot;90FA7ABE-FAB6-485E-B700-1A17804CAA13&quot;)!\n    private let defaultIdentifier = &quot;FolkBearsBeacon&quot;\n\n    override init() {\n        super.init()\n        setupPeripheralManager()\n    }\n\n    private func setupPeripheralManager() {\n        peripheralManager = CBPeripheralManager(delegate: self, queue: nil)\n    }\n\n    func startTransmitting() {\n        guard let peripheralManager = peripheralManager,\n              peripheralManager.state == .poweredOn,\n              !isTransmitting else {\n            print(&quot;Bluetooth \u304c\u5229\u7528\u3067\u304d\u306a\u3044\u304b\u3001\u65e2\u306b\u767a\u4fe1\u4e2d\u3067\u3059&quot;)\n            return\n        }\n\n        let major = CLBeaconMajorValue(major)\n        let minor = CLBeaconMinorValue(minor)\n\n        \/\/ \u30d3\u30fc\u30b3\u30f3\u30ea\u30fc\u30b8\u30e7\u30f3\u3092\u4f5c\u6210\n        beaconRegion = CLBeaconRegion(\n            uuid: defaultUUID,\n            major: major,\n            minor: minor,\n            identifier: defaultIdentifier\n        )\n\n        guard let region = beaconRegion else { return }\n\n        \/\/ \u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u30e1\u30f3\u30c8\u30c7\u30fc\u30bf\u3092\u751f\u6210\n        if useRawIBeaconAdvertising {\n            \/\/ raw manufacturer data \u3092\u4f5c\u6210\u3057\u3066 startAdvertising \u3059\u308b\n            startAdvertisingRawIBeacon(uuid: defaultUUID, major: UInt16(major), minor: UInt16(minor), txPower: -59)\n        } else {\n            \/\/ measuredPower\u3092\u660e\u793a\u7684\u306b\u8a2d\u5b9a\uff08-59dBm\u304c\u4e00\u822c\u7684\uff09\n            let peripheralData = region.peripheralData(withMeasuredPower: -59 as NSNumber)\n            \/\/ \u4fdd\u6301\u3057\u3066\u304a\u304f\uff08\u30c7\u30d0\u30c3\u30b0\uff09\n            if let adv = peripheralData as? &#x5B;String: Any] {\n                lastAdvertisementData = adv\n            }\n            \/\/ \u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u958b\u59cb\n            peripheralManager.startAdvertising(peripheralData as? &#x5B;String: Any])\n        }\n\n        isTransmitting = true\n        transmissionStatus = &quot;\u767a\u4fe1\u4e2d...&quot;\n        let majorHex = String(format: &quot;%04X&quot;, major)\n        let minorHex = String(format: &quot;%04X&quot;, minor)\n        print(&quot;\ud83d\udce1 iBeacon \u767a\u4fe1\u958b\u59cb&quot;)\n        print(&quot;   UUID: \\(defaultUUID)&quot;)\n        print(&quot;   Major: \\(majorHex)&quot;)\n        print(&quot;   Minor: \\(minorHex)&quot;)\n        print(&quot;   Measured Power: -59dBm&quot;)\n\n        \/\/ \u30c7\u30d0\u30c3\u30b0\u7528\uff1a\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u30e1\u30f3\u30c8\u30c7\u30fc\u30bf\u3092\u8868\u793a\n        if useRawIBeaconAdvertising {\n            if let adv = lastAdvertisementData {\n                print(&quot;   Advertisement Data (raw manufacturer used): \\(adv)&quot;)\n            } else {\n                print(&quot;   Advertisement Data: (raw manufacturer advertising active)&quot;)\n            }\n        } else if let advData = lastAdvertisementData {\n            print(&quot;   Advertisement Data: \\(advData)&quot;)\n        }\n    }\n\n    \/\/ MARK: - Raw iBeacon (manufacturer data) \u5e83\u544a\uff08\u5b9f\u9a13\u7528\uff09\n    \/\/\/ iBeacon \u306e manufacturer data \u3092\u624b\u4f5c\u308a\u3057\u3066\u5e83\u544a\u3092\u884c\u3046\uff08\u5b9f\u9a13\u7528\uff09\n    private func startAdvertisingRawIBeacon(uuid: UUID, major: UInt16, minor: UInt16, txPower: Int8 = -59) {\n        \/\/ iBeacon \u30d5\u30a9\u30fc\u30de\u30c3\u30c8: Apple company id (0x004C little-endian), 0x02, 0x15, UUID(16), major(2), minor(2), tx(1)\n        var data = Data()\n        \/\/ Apple company ID (0x004C) little-endian\n        data.append(0x4C)\n        data.append(0x00)\n        \/\/ iBeacon type and length\n        data.append(0x02)\n        data.append(0x15)\n\n        \/\/ UUID bytes (big-endian order as raw bytes of UUID)\n        withUnsafeBytes(of: uuid.uuid) { (bytes: UnsafeRawBufferPointer) in\n            data.append(contentsOf: bytes)\n        }\n\n        \/\/ major (big endian)\n        data.append(UInt8((major &gt;&gt; 8) &amp; 0xFF))\n        data.append(UInt8(major &amp; 0xFF))\n        \/\/ minor (big endian)\n        data.append(UInt8((minor &gt;&gt; 8) &amp; 0xFF))\n        data.append(UInt8(minor &amp; 0xFF))\n        \/\/ tx power\n        data.append(UInt8(bitPattern: txPower))\n\n        let adv: &#x5B;String: Any] = &#x5B;CBAdvertisementDataManufacturerDataKey: data]\n        \/\/ \u30c7\u30d0\u30c3\u30b0\u7528\u306b\u4fdd\u6301\u3068\u8868\u793a\n        lastAdvertisementData = adv\n        print(&quot;\ud83d\udce1 iBeacon (raw) \u767a\u4fe1\u30c7\u30fc\u30bf\u751f\u6210: manufacturerData length=\\(data.count)&quot;)\n\n        peripheralManager?.startAdvertising(adv)\n    }\n\n    func stopTransmitting() {\n        guard let peripheralManager = peripheralManager,\n              isTransmitting else { return }\n\n        peripheralManager.stopAdvertising()\n\n        isTransmitting = false\n        transmissionStatus = &quot;\u505c\u6b62\u4e2d&quot;\n        print(&quot;iBeacon \u767a\u4fe1\u505c\u6b62&quot;)\n    }\n\n    func updateBeaconParameters(major: CLBeaconMajorValue? = nil, minor: CLBeaconMinorValue? = nil) {\n        if let major = major { self.major = major }\n        if let minor = minor { self.minor = minor }\n\n        let newMajor = CLBeaconMajorValue(self.major)\n        let newMinor = CLBeaconMinorValue(self.minor)\n\n        if isTransmitting {\n            stopTransmitting()\n            DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {\n                self.startTransmitting()\n            }\n        }\n        print(&quot;\u30d3\u30fc\u30b3\u30f3\u30d1\u30e9\u30e1\u30fc\u30bf\u66f4\u65b0 - Major: \\(newMajor), Minor: \\(newMinor)&quot;)\n    }\n}\nextension BeaconTransmitter: CBPeripheralManagerDelegate {\n    func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {\n        DispatchQueue.main.async {\n            switch peripheral.state {\n            case .poweredOn:\n                self.bluetoothState = &quot;Powered On&quot;\n                print(&quot;Bluetooth \u304c\u6709\u52b9\u306b\u306a\u308a\u307e\u3057\u305f&quot;)\n            case .poweredOff:\n                self.bluetoothState = &quot;Powered Off&quot;\n                self.stopTransmitting()\n                print(&quot;Bluetooth \u304c\u7121\u52b9\u3067\u3059&quot;)\n            case .resetting:\n                self.bluetoothState = &quot;Resetting&quot;\n                print(&quot;Bluetooth \u30ea\u30bb\u30c3\u30c8\u4e2d&quot;)\n            case .unauthorized:\n                self.bluetoothState = &quot;Unauthorized&quot;\n                print(&quot;Bluetooth \u4f7f\u7528\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093&quot;)\n            case .unsupported:\n                self.bluetoothState = &quot;Unsupported&quot;\n                print(&quot;Bluetooth \u304c\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093&quot;)\n            case .unknown:\n                self.bluetoothState = &quot;Unknown&quot;\n                print(&quot;Bluetooth \u72b6\u614b\u4e0d\u660e&quot;)\n            @unknown default:\n                self.bluetoothState = &quot;Unknown&quot;\n                break\n            }\n        }\n    }\n\n    func peripheralManagerDidStartAdvertising(_ peripheral: CBPeripheralManager, error: Error?) {\n        DispatchQueue.main.async {\n            if let error = error {\n                print(&quot;\u274c \u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u958b\u59cb\u30a8\u30e9\u30fc: \\(error.localizedDescription)&quot;)\n                self.transmissionStatus = &quot;\u30a8\u30e9\u30fc: \\(error.localizedDescription)&quot;\n                self.isTransmitting = false\n            } else {\n                print(&quot;\u2705 \u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u958b\u59cb\u6210\u529f&quot;)\n                print(&quot;   \u72b6\u614b: Advertising&quot;)\n                print(&quot;   \u78ba\u8a8d: Android\u5074\u3067\u30b9\u30ad\u30e3\u30f3\u3092\u958b\u59cb\u3057\u3066\u304f\u3060\u3055\u3044&quot;)\n                self.transmissionStatus = &quot;\u767a\u4fe1\u4e2d&quot;\n            }\n        }\n    }\n\n    func peripheralManagerIsReady(toUpdateSubscribers peripheral: CBPeripheralManager) {\n        print(&quot;\ud83d\udd04 PeripheralManager\u306e\u6e96\u5099\u5b8c\u4e86&quot;)\n    }\n}\n\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>\u30c7\u30d0\u30a4\u30b9\u540d\u306e\u767a\u898b\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba<\/strong><\/h2>\n\n\n\n<p>GattAdvertise \u3067\u3001Device Name \u3092\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u3059\u308b\u30d1\u30bf\u30fc\u30f3\u3082\u4f5c\u3063\u3066\u3044\u307e\u3059\u3002\u3053\u308c\u306f GATT \u63a5\u7d9a\u306e\u524d\u306b\u767a\u4fe1\u3055\u308c\u308b\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u3067\u3059\u3002<br>\u30c7\u30d0\u30a4\u30b9\u540d\u3060\u3051\u3092\u9001\u4fe1\uff08\u5b9f\u306f\u30c7\u30d0\u30a4\u30b9\u540d\u81ea\u4f53\u306f\u3044\u3089\u306a\u3044\u306e\u3067\u3059\u304c\uff09\u3059\u308b\u3060\u3051\u306a\u306e\u3067\u3001CBPeripheralManager \u3068 CBPeripheralManagerDelegate \u3060\u3051\u3067\u5341\u5206\u3067\u3059\u3002\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u30c7\u30fc\u30bf advertisementData \u3067\u306f\u3001CBAdvertisementDataServiceUUIDsKey \u3068 CBAdvertisementDataLocalNameKey \u306e\u307f\u304c\u6709\u52b9\u306b\u306a\u308a\u307e\u3059\u3002\u4ed6\u306e\u30ad\u30fc\u3092\u8a2d\u5b9a\u3057\u3066\u3082\u7121\u8996\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: swift; title: ; notranslate\" title=\"\">\nclass GattAdvertise: NSObject, ObservableObject {\n    private var peripheralManager: CBPeripheralManager?\n    private var customService: CBMutableService?\n    \n    @Published var isAdvertising = false\n    @Published var advertisingStatus = &quot;\u505c\u6b62\u4e2d&quot;\n    @Published var bluetoothState = &quot;Unknown&quot;\n    @Published var connectedCentrals: &#x5B;CBCentral] = &#x5B;]\n    \n    \/\/ \u30ab\u30b9\u30bf\u30e0\u30b5\u30fc\u30d3\u30b9\u3068\u30ad\u30e3\u30e9\u30af\u30bf\u30ea\u30b9\u30c6\u30a3\u30c3\u30af\u306eUUID\n    private let serviceUUID = CBUUID(string: &quot;90FA7ABE-FAB6-485E-B700-1A17804CAA13&quot;)\n    private let characteristicUUID = CBUUID(string: &quot;90FA7ABE-FAB6-485E-B700-1A17804CAA14&quot;)\n    private let deviceName = &quot;FolkBears-GATT&quot;\n    \n    private var customCharacteristic: CBMutableCharacteristic?\n    private var characteristicValue = &quot;Hello GATT World!&quot;\n    \n    override init() {\n        super.init()\n        setupPeripheralManager()\n    }\n    \n    private func setupPeripheralManager() {\n        peripheralManager = CBPeripheralManager(delegate: self, queue: nil)\n    }\n    \n    func startAdvertising() {\n        guard let peripheralManager = peripheralManager,\n              peripheralManager.state == .poweredOn,\n              !isAdvertising else {\n            print(&quot;Bluetooth \u304c\u5229\u7528\u3067\u304d\u306a\u3044\u304b\u3001\u65e2\u306b\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u4e2d\u3067\u3059&quot;)\n            return\n        }\n        \n        let advertisementData: &#x5B;String: Any] = &#x5B;\n            CBAdvertisementDataServiceUUIDsKey: &#x5B;serviceUUID],\n            CBAdvertisementDataLocalNameKey: deviceName\n        ]\n        \n        peripheralManager.startAdvertising(advertisementData)\n        \n        isAdvertising = true\n        advertisingStatus = &quot;\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u4e2d...&quot;\n        print(&quot;GATT \u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u958b\u59cb - \u30b5\u30fc\u30d3\u30b9: \\(serviceUUID)&quot;)\n    }\n    \n    func stopAdvertising() {\n        guard let peripheralManager = peripheralManager,\n              isAdvertising else { return }\n        \n        peripheralManager.stopAdvertising()\n        peripheralManager.removeAllServices()\n        \n        isAdvertising = false\n        advertisingStatus = &quot;\u505c\u6b62\u4e2d&quot;\n        connectedCentrals.removeAll()\n        print(&quot;GATT \u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u505c\u6b62&quot;)\n    }\n    \n    func getConnectionSummary() -&gt; String {\n        return &quot;&quot;&quot;\n        \u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u72b6\u614b: \\(advertisingStatus)\n        \u63a5\u7d9a\u4e2d\u30c7\u30d0\u30a4\u30b9\u6570: \\(connectedCentrals.count)\u500b\n        \u30b5\u30fc\u30d3\u30b9UUID: \\(serviceUUID)\n        \u30c7\u30d0\u30a4\u30b9\u540d: \\(deviceName)\n        &quot;&quot;&quot;\n    }\n}\n\n\/\/ MARK: - CBPeripheralManagerDelegate\nextension GattAdvertise: CBPeripheralManagerDelegate {\n    func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {\n        DispatchQueue.main.async {\n            switch peripheral.state {\n            case .poweredOn:\n                self.bluetoothState = &quot;Powered On&quot;\n                print(&quot;Bluetooth \u304c\u6709\u52b9\u306b\u306a\u308a\u307e\u3057\u305f&quot;)\n            case .poweredOff:\n                self.bluetoothState = &quot;Powered Off&quot;\n                self.stopAdvertising()\n                print(&quot;Bluetooth \u304c\u7121\u52b9\u3067\u3059&quot;)\n            case .resetting:\n                self.bluetoothState = &quot;Resetting&quot;\n                print(&quot;Bluetooth \u30ea\u30bb\u30c3\u30c8\u4e2d&quot;)\n            case .unauthorized:\n                self.bluetoothState = &quot;Unauthorized&quot;\n                print(&quot;Bluetooth \u4f7f\u7528\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093&quot;)\n            case .unsupported:\n                self.bluetoothState = &quot;Unsupported&quot;\n                print(&quot;Bluetooth \u304c\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093&quot;)\n            case .unknown:\n                self.bluetoothState = &quot;Unknown&quot;\n                print(&quot;Bluetooth \u72b6\u614b\u4e0d\u660e&quot;)\n            @unknown default:\n                self.bluetoothState = &quot;Unknown&quot;\n                break\n            }\n        }\n    }\n    \n    func peripheralManagerDidStartAdvertising(_ peripheral: CBPeripheralManager, error: Error?) {\n        DispatchQueue.main.async {\n            if let error = error {\n                print(&quot;\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u958b\u59cb\u30a8\u30e9\u30fc: \\(error.localizedDescription)&quot;)\n                self.advertisingStatus = &quot;\u30a8\u30e9\u30fc&quot;\n                self.isAdvertising = false\n            } else {\n                print(&quot;\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u958b\u59cb\u6210\u529f&quot;)\n                self.advertisingStatus = &quot;\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u4e2d&quot;\n            }\n        }\n    }\n}\n\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>16 bit Service UUID \u5f62\u5f0f\u306e\u767a\u4fe1<\/strong><\/h2>\n\n\n\n<p>EN API \u5f62\u5f0f\u306e\u767a\u4fe1\u306f\u300116 bit Service UUID \u3092\u6307\u5b9a\u3057\u3066\u767a\u4fe1\u3059\u308b\u30d1\u30bf\u30fc\u30f3\u3067\u3059\u304c\u3001iOS \u3067\u306f\u9001\u4fe1\u3067\u304d\u307e\u305b\u3093\u3002\u9001\u4fe1\u306f\u3067\u304d\u306a\u3044\u306e\u3067\u3059\u304c\u3001\u78ba\u8a8d\u306e\u305f\u3081\u306b\u30b3\u30fc\u30c9\u306f\u4f5c\u3063\u3066\u3042\u308a\u307e\u3059\u3002Android \u306e\u53d7\u4fe1\u6a5f\u3067\u53d7\u4fe1\u3067\u304d\u306a\u3044\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002<br>\u305f\u307e\u306b\u3001Android\/iOS \u306e\u53d7\u4fe1\u6a5f\u306b\u5230\u9054\u3059\u308b\u3053\u3068\u304c\u3042\u308a\uff08\u3053\u306e\u3068\u304d\u306e\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u30c7\u30fc\u30bf\u306f\u30e9\u30f3\u30c0\u30e0\u5024\u306b\u306a\u3063\u3066\u3044\u307e\u3059\uff09\u3001\u5fae\u5999\u306a\u611f\u3058\u304c\u3059\u308b\u306e\u3067\u3059\u304c\u3001\u4f7f\u3048\u306a\u3044\u306e\u306f\u78ba\u304b\u3067\u3059\u3002<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: swift; title: ; notranslate\" title=\"\">\nclass ENSimTransmitter: NSObject, ObservableObject {\n\tprivate var peripheralManager: CBPeripheralManager?\n\tprivate let serviceUUID = CBUUID(string: &quot;FD6F&quot;) \/\/ Exposure Notification 16-bit UUID\n    private let altServiceUUID = CBUUID(string: &quot;FF00&quot;) \/\/ Alternative UUID for testing\n\n\t@Published var isTransmitting = false\n\t@Published var transmissionStatus = &quot;\u505c\u6b62\u4e2d&quot;\n\t@Published var bluetoothState = &quot;Unknown&quot;\n\t@Published var localName = &quot;ENSim&quot;\n    @Published var useAltService: Bool = false\n\t@Published var rpi: Data = ENSimTransmitter.generateRandomRpi()\n\n\toverride init() {\n\t\tsuper.init()\n\t\tsetupPeripheralManager()\n\t}\n\n\tprivate func setupPeripheralManager() {\n\t\tperipheralManager = CBPeripheralManager(delegate: self, queue: nil)\n\t}\n\n\tfunc startTransmitting() {\n\t\tguard let manager = peripheralManager else {\n\t\t\tprint(&quot;PeripheralManager \u304c\u521d\u671f\u5316\u3055\u308c\u3066\u3044\u307e\u305b\u3093&quot;)\n\t\t\treturn\n\t\t}\n\n\t\tguard manager.state == .poweredOn else {\n\t\t\tprint(&quot;Bluetooth \u304c\u5229\u7528\u3067\u304d\u307e\u305b\u3093 (state: \\(manager.state.rawValue))&quot;)\n\t\t\treturn\n\t\t}\n\n\t\tguard !isTransmitting else {\n\t\t\tprint(&quot;\u65e2\u306b\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u4e2d\u3067\u3059&quot;)\n\t\t\treturn\n\t\t}\n\n        let selectedService = useAltService ? altServiceUUID : serviceUUID\n        let serviceData: &#x5B;CBUUID: Data] = &#x5B;selectedService: rpi]\n\n\t\tlet advertisementData: &#x5B;String: Any] = &#x5B;\n\t\t\tCBAdvertisementDataServiceUUIDsKey: &#x5B;selectedService],\n\t\t\tCBAdvertisementDataLocalNameKey: localName,\n\t\t\t\/\/ CBAdvertisementDataServiceDataKey: serviceData\n\t\t]\n\n\t\tmanager.startAdvertising(advertisementData)\n\n\t\tisTransmitting = true\n\t\ttransmissionStatus = &quot;\u767a\u4fe1\u4e2d...&quot;\n\n\t\tprint(&quot;\ud83d\udce1 EN \u30b7\u30df\u30e5\u30ec\u30fc\u30b7\u30e7\u30f3\u767a\u4fe1\u958b\u59cb&quot;)\n\t\tprint(&quot;   Service UUID (16-bit): \\(useAltService ? altServiceUUID.uuidString : serviceUUID.uuidString)&quot;)\n\t\tprint(&quot;   Local Name: \\(localName)&quot;)\n\t\tprint(&quot;   RPI (hex): \\(rpi.map { String(format: &quot;%02X&quot;, $0) }.joined())&quot;)\n\t}\n\n\tfunc stopTransmitting() {\n\t\tguard let manager = peripheralManager, isTransmitting else { return }\n\n\t\tmanager.stopAdvertising()\n\t\tisTransmitting = false\n\t\ttransmissionStatus = &quot;\u505c\u6b62\u4e2d&quot;\n\n\t\tprint(&quot;EN \u30b7\u30df\u30e5\u30ec\u30fc\u30b7\u30e7\u30f3\u767a\u4fe1\u505c\u6b62&quot;)\n\t}\n\n\tprivate static func generateRandomRpi() -&gt; Data {\n\t\t\n\t\t\/\/ let bytes = (0..&lt;16).map { _ in UInt8.random(in: 0...255) }\n\n\t\t\/\/ \u30e9\u30f3\u30c0\u30e0\u306a uuid \u3092\u751f\u6210\u3057\u3066 RPI \u3068\u3057\u3066\u4f7f\u7528\uff08\u30c7\u30d0\u30c3\u30b0\u7528\uff09\n\t\t\/\/ \u9001\u4fe1\u306f\u6210\u529f\u3059\u308b\u304c\u3001Service Data \u306e\u5185\u5bb9\u306f\u30e9\u30f3\u30c0\u30e0\u5024\u306b\u306a\u3063\u3066\u3057\u307e\u3046\u306e\u3067\u3001\n\t\t\/\/ \u5b9f\u8cea\u5229\u7528\u304c\u3067\u304d\u306a\u3044\u3002\n\t\tlet uuid = UUID()\n\t\tlet uuidBytes = withUnsafeBytes(of: uuid.uuid) { Array($0) }\n\t\tlet bytes = Array(uuidBytes.prefix(16))\n\t\treturn Data(bytes)\n\t}\n}\n\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>Manufacturer Data \u5f62\u5f0f\u306e\u767a\u4fe1<\/strong><\/h2>\n\n\n\n<p>\u81ea\u7531\u306a\u5f62\u5f0f\u3067\u30c7\u30fc\u30bf\u3092\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8\u3059\u308b\u5834\u5408\u306f\u3001Manufacturer Data \u5f62\u5f0f\u3067\u767a\u4fe1\u3059\u308b\u306e\u304c\u4e00\u756a\u3044\u3044\u306e\u3067\u3059\u304c\u3001\u3053\u308c\u3082 iOS \u3067\u306f\u4f7f\u3048\u307e\u305b\u3093\u3002\u3053\u308c\u3082\u3001\u4f7f\u3048\u306a\u3044\u3053\u3068\u3092\u78ba\u8a8d\u3059\u308b\u305f\u3081\u306b\u30b3\u30fc\u30c9\u3092\u4f5c\u3063\u3066\u3042\u308a\u307e\u3059\u3002<br>\u5148\u306b\u66f8\u3044\u305f\u901a\u308a\u3001startAdvertisingRawIBeacon \u95a2\u6570\u3092\u4f5c\u3063\u3066\u3082\u30c7\u30fc\u30bf\u306f\u9001\u4fe1\u3067\u304d\u307e\u305b\u3093\u3002<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: swift; title: ; notranslate\" title=\"\">\n\/\/\/ Advertises custom manufacturer data (often consumed as scan response data on the scanner side).\n\/\/\/ \u30d5\u30a9\u30fc\u30de\u30c3\u30c8: &#x5B;0]=0x02 (type), &#x5B;1]=0x10 (length=16), &#x5B;2..17]=TempId(16byte)\n\nclass ManufacturerDataTransmitter: NSObject, ObservableObject {\n\tprivate var peripheralManager: CBPeripheralManager?\n\n\t@Published var isTransmitting = false\n\t@Published var transmissionStatus = &quot;\u505c\u6b62\u4e2d&quot;\n\t@Published var bluetoothState = &quot;Unknown&quot;\n\t@Published var localName: String = &quot;MFG&quot;\n\n\t\/\/\/ 16-bit company identifier (Little Endian in the payload). Default: 0xFFFF for testing.\n\t@Published var companyId: UInt16 = 0xFFFF\n    let beacon_type = 0x02\n    let beacon_length = 0x10\n\n\t\/\/\/ Arbitrary manufacturer payload. Default 16 zero bytes for easy overriding.\n\t@Published var tempIdBytes: Data = Data(repeating: 0x00, count: 16)\n\n\t\/\/\/ Last advertisement dictionary for debugging.\n\tprivate(set) var lastAdvertisementData: &#x5B;String: Any]? = nil\n\n\toverride init() {\n\t\tsuper.init()\n\t\tsetupPeripheralManager()\n\t}\n\n\tprivate func setupPeripheralManager() {\n\t\tperipheralManager = CBPeripheralManager(delegate: self, queue: nil)\n\t}\n\n\t\/\/\/ Start advertising manufacturer data. Uses CBAdvertisementDataManufacturerDataKey which may appear in scan response on the scanner side depending on size and platform rules.\n\tfunc startTransmitting() {\n\t\tguard let manager = peripheralManager else {\n\t\t\tprint(&quot;PeripheralManager \u304c\u521d\u671f\u5316\u3055\u308c\u3066\u3044\u307e\u305b\u3093&quot;)\n\t\t\treturn\n\t\t}\n\n\t\tguard manager.state == .poweredOn else {\n\t\t\tprint(&quot;Bluetooth \u304c\u5229\u7528\u3067\u304d\u307e\u305b\u3093 (state: \\(manager.state.rawValue))&quot;)\n\t\t\treturn\n\t\t}\n\n\t\tguard !isTransmitting else {\n\t\t\tprint(&quot;\u65e2\u306b\u30a2\u30c9\u30d0\u30bf\u30a4\u30ba\u4e2d\u3067\u3059&quot;)\n\t\t\treturn\n\t\t}\n\n\t\t\/\/ Build manufacturer data: company ID (little endian) + payload.\n\t\tvar mfgData = Data()\n\t\tmfgData.append(UInt8(companyId &amp; 0xFF))\n\t\tmfgData.append(UInt8((companyId &gt;&gt; 8) &amp; 0xFF))\n        mfgData.append(UInt8(beacon_type))\n\t\tmfgData.append(UInt8(beacon_length))\n        mfgData.append(tempIdBytes)\n\t\tlet advertisementData: &#x5B;String: Any] = &#x5B;\n\t\t\tCBAdvertisementDataManufacturerDataKey: mfgData,\n\t\t\tCBAdvertisementDataLocalNameKey: localName\n\t\t]\n\n\t\tlastAdvertisementData = advertisementData\n\t\tmanager.startAdvertising(advertisementData)\n\n\t\tisTransmitting = true\n\t\ttransmissionStatus = &quot;\u767a\u4fe1\u4e2d...&quot;\n\n\t\tprint(&quot;\ud83d\udce1 Manufacturer \u767a\u4fe1\u958b\u59cb&quot;)\n\t\tprint(String(format: &quot;   Company ID: 0x%04X (LE)&quot;, companyId))\n\t\tprint(&quot;   tempIdBytes (hex): \\(tempIdBytes.map { String(format: &quot;%02X&quot;, $0) }.joined())&quot;)\n\t\tprint(&quot;   Local Name: \\(localName)&quot;)\n\t}\n\n\tfunc stopTransmitting() {\n\t\tguard let manager = peripheralManager, isTransmitting else { return }\n\n\t\tmanager.stopAdvertising()\n\t\tisTransmitting = false\n\t\ttransmissionStatus = &quot;\u505c\u6b62\u4e2d&quot;\n\n\t\tprint(&quot;Manufacturer \u767a\u4fe1\u505c\u6b62&quot;)\n\t}\n}\n\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>\u5b9f\u884c<\/strong><\/h2>\n\n\n\n<p>\u5de6\u304b\u3089<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Android \u3067\u53d7\u4fe1<\/li>\n\n\n\n<li>iPhone \u3067\u53d7\u4fe1<\/li>\n\n\n\n<li>iPhone \u3067\u767a\u4fe1<\/li>\n<\/ul>\n\n\n\n<p>\u3068\u3044\u3046\u72b6\u614b\u3067\u3059\u3002iBeacon \u306e UUID \u306f\u540c\u3058\u306a\u306e\u3067\u3001major \u3068 minor \u3067\u5224\u65ad\u3092\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>iBeacon \u53d7\u767a\u4fe1\u306e\u69d8\u5b50<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2026\/02\/image-49.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2026\/02\/image-49.png\" alt=\"\" class=\"wp-image-12073\" srcset=\"http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2026\/02\/image-49.png 1024w, http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2026\/02\/image-49-300x225.png 300w, http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2026\/02\/image-49-768x576.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>\u53d7\u4fe1\u56de\u6570\u306f5\u5206\u4ee5\u5185\u306b\u53d7\u4fe1\u3057\u305f\u30d3\u30fc\u30b3\u30f3\u306e\u56de\u6570\u3092\u6570\u3048\u3066\u3044\u308b\u306e\u3067\u30015\u5206\u7a0b\u5ea6\u653e\u7f6e\u3057\u3066\u304a\u304f\u30681\u5206\u3042\u305f\u308a\u306e\u53d7\u4fe1\u983b\u5ea6\u304c\u8a08\u7b97\u3067\u304d\u307e\u3059\u3002\u5b9f\u969b\u306f\u3001\u5e73\u5747\u7b49\u3092\u8003\u3048\u306a\u3044\u3068\u3044\u3051\u306a\u3044\u306e\u3067\u3001\u3082\u3046\u5c11\u3057\u7d71\u8a08\u30c7\u30fc\u30bf\u3068\u3057\u3066\u4fdd\u5b58\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u306a\u3044\u3068\u3044\u3051\u306a\u3044\u306e\u3067\u3059\u304c\u3002<\/p>\n\n\n\n<p>iOS \u306e\u53d7\u4fe1\u6a5f\u3067\u306f1\u79d2\u306b1\u56de\u7a0b\u5ea6\u3001Android\u306e\u53d7\u4fe1\u6a5f\u3067\u306f1\u79d2\u306b5\u56de\u7a0b\u5ea6\u53d7\u4fe1\u3057\u3066\u3044\u307e\u3059\u3002\u305f\u3076\u3093\u3001iOS \u53d7\u4fe1\u6a5f\u306e\u307b\u3046\u3067\u9593\u5f15\u3044\u3066\u3044\u308b\u3068\u601d\u3046\u306e\u3067\u3059\u304c\u3001\u3053\u306e\u3042\u305f\u308a\u306f\u5f8c\u306b\u691c\u8a3c\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Android : 5\u5206\u3067 1210 \u56de = 1\u79d2\u3042\u305f\u308a 4.03 \u56de<\/li>\n\n\n\n<li>iOS : 5\u5206\u3067 300 \u56de = 1\u79d2\u3042\u305f\u308a 1 \u56de<\/li>\n<\/ul>\n\n\n\n<p>5\u5206\u5f8c<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2026\/02\/image-50.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2026\/02\/image-50.png\" alt=\"\" class=\"wp-image-12074\" srcset=\"http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2026\/02\/image-50.png 1024w, http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2026\/02\/image-50-300x225.png 300w, http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2026\/02\/image-50-768x576.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p><strong>\u53c2\u8003\u30b3\u30fc\u30c9<\/strong><\/p>\n\n\n\n<p>folkbears-transmitter-ios <a href=\"https:\/\/github.com\/FolkBearsGroup\/ble-tools\/tree\/master\/folkbears-transmitter-ios\">https:\/\/github.com\/FolkBearsGroup\/ble-tools\/tree\/master\/folkbears-transmitter-ios<\/a><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u63a5\u89e6\u78ba\u8a8d\u30a2\u30d7\u30ea\u3067\u306f Android\/iOS \u306e\u76f8\u4e92\u3067 BLE \u901a\u4fe1\u3092\u884c\u3046\u305f\u3081\u306b\u3001iOS \u3067\u306e\u767a\u4fe1\u6a5f\u306e\u30c1\u30a7\u30c3\u30af\u3082\u3057\u3066\u304a\u304d\u307e\u3059\u3002iOS \u306e\u5834\u5408\u306f\u300116 bit Service UUID \u5f62\u5f0f\u3068 Manufacturer Da &hellip; <a href=\"http:\/\/www.moonmile.net\/blog\/archives\/12072\">\u7d9a\u304d\u3092\u8aad\u3080 <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3,110],"tags":[],"class_list":["post-12072","post","type-post","status-publish","format-standard","hentry","category-dev","category-folkbears"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts\/12072","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/comments?post=12072"}],"version-history":[{"count":2,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts\/12072\/revisions"}],"predecessor-version":[{"id":12076,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts\/12072\/revisions\/12076"}],"wp:attachment":[{"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/media?parent=12072"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/categories?post=12072"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/tags?post=12072"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}