当前位置: 首页 > 知识库问答 >
问题:

在后台将iPhone作为iBeacon运行

楚弘益
2023-03-14

是否可以将iOS7设备作为蓝牙LE外设(iBeacon)运行并在后台发布广告?我已经能够让它在前台用下面的代码做广告,并且可以从另一个iOS设备上看到它,但是一旦我回到主屏幕,它就停止了广告。我确实在plist中添加了蓝牙外围后台模式,但这似乎没有帮助,尽管我确实得到提示说设备想要在后台使用蓝牙。是我做错了什么,还是在iOS不可能?

peripManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];

- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral
{
  if (peripheral.state != CBPeripheralManagerStatePoweredOn) {
      return;
  }

  NSString *identifier = @"MyBeacon";
  //Construct the region
  CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:identifier];

  //Passing nil will use the device default power
  NSDictionary *payload = [beaconRegion peripheralDataWithMeasuredPower:nil];

  //Start advertising
  [peripManager startAdvertising:payload];
}

以下是接收/侦听端的代码:

- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons
           inRegion:(CLBeaconRegion *)region
{
//Check if we have moved closer or farther away from the iBeacon…
if (beacons.count > 0) {
    CLBeacon *beacon = [beacons objectAtIndex:0];

    switch (beacon.proximity) {
        case CLProximityImmediate:
            [self log:[NSString stringWithFormat:@"You're Sitting on it! %li", (long)beacon.rssi]];
            break;
        case CLProximityNear:
            [self log:[NSString stringWithFormat:@"Getting Warmer! %li", (long)beacon.rssi]];
            break;
        default:
            [self log:[NSString stringWithFormat:@"It's around here somewhere! %li", (long)beacon.rssi]];
            break;
    }
}
}

共有3个答案

韦叶秋
2023-03-14

不,iOS设备仅在前台运行进行广告宣传的应用程序时才对iBeacon进行广告宣传。因此,如果您切换到其他应用程序或设备进入睡眠状态,广告将停止。

当然,如果你真的想继续播放广告,请禁用空闲计时器并进行引导访问,这样iOs设备就不会进入睡眠状态,也没有人可以切换到其他应用程序。

孔扬
2023-03-14

你能闻到iBeacon吗?这篇文章讨论了Mac和iOS设备上的Estimote和广告的使用。您需要在项目目标中检查“充当蓝牙LE附件”的功能。

穆英飙
2023-03-14

标准的Core蓝牙广告可以在应用程序处于后台时广播,但如果它们是通过CLBeaconArea字典启动的,则不会广播。解决方法是完全抛弃CorePlace框架,只使用CoreBlueT创建自己的邻近“框架”。

您仍然需要在信息中使用适当的背景说明符。plist文件(例如蓝牙外围设备蓝牙中央设备)。

代码如下所示:

1)创建一个标准的外设广告使用

NSDictionary *advertisingData = @{CBAdvertisementDataLocalNameKey:@"my-peripheral",
                                  CBAdvertisementDataServiceUUIDsKey:@[[CBUUID UUIDWithString:identifier]]};

// Start advertising over BLE
[peripheralManager startAdvertising:advertisingData];

2) 使用CBCentralManager使用指定的UUID扫描该服务。

NSDictionary *scanOptions = @{CBCentralManagerScanOptionAllowDuplicatesKey:@(YES)};
NSArray *services = @[[CBUUID UUIDWithString:identifier]];

[centralManager scanForPeripheralsWithServices:services options:scanOptions];

3) 在CBCentralManagerDelegate方法didiscoverperipheral中,读取广告的RSSI值。

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral
     advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{

    NSLog(@"RSSI: %d", [RSSI intValue]);
}

4) 将RSSI值转换为距离。

- (INDetectorRange)convertRSSItoINProximity:(NSInteger)proximity
{
    if (proximity < -70)
        return INDetectorRangeFar;
    if (proximity < -55)
        return INDetectorRangeNear;
    if (proximity < 0)
        return INDetectorRangeImmediate;

    return INDetectorRangeUnknown;
}

我发现我需要“简化”或“平均”RSSI值,以获得任何可行的结果。这与处理任何传感器数据(如加速计数据)时没有区别。

我完全有这个概念,希望在某个时候能在某个地方发表。

此外,如果卡住了,请使用文档(核心蓝牙编程指南)。

更新:Github上提供了完整的代码示例。我是作为一个工作相关项目的一部分来做这件事的。

更新#2:苹果发布了iBeacon在iOS7背景行为方面的重大改进。1.

 类似资料:
  • 问题内容: 我一直在尝试编写从串行端口读取数据的python脚本。它在命令行上运行良好,但是我需要它作为后台进程运行而没有任何命令行界面。该脚本有一个while循环,该循环从串行端口读取下一个数据字节,并相应地模拟按键。为了使按键可以专注于当前窗口而不是python命令行,我需要脚本作为后台进程运行。我在这里读的答案很少,但是没有什么让我振奋。请指出正确的方向。 问题答案: 在Windows上,您

  • 问题内容: 每当用户断开手机通话时,我都希望显示自定义弹出消息。问题是如何检测应用程序何时未运行。任何线索都将有所帮助。 问题答案: 已经有一段时间了,并且已经有了很多发展。 首先,如何在Flutter中创建服务以使应用程序始终在后台运行有一些答案? 此外,使用Flutter插件和地理围栏(在2018年9月),Flutter / Background流程 基本上将使您指向在后台执行中等/执行Dar

  • 问题内容: 我已经开发了一个Java控制台应用程序,该应用程序在启动时打开控制台窗口并保持在前台,我想在后台启动该应用程序。 现在,我通过以下命令行启动该应用程序: 有没有办法实现这种行为?更改命令行参数就足够了,还是我需要对代码进行一些更改? 问题答案: 答案取决于操作系统。

  • 问题内容: 多年来,由于这篇文章引起了很多关注,因此我在文章的底部列出了每个平台的最佳解决方案。 原始帖子 : 我希望我的node.js服务器在后台运行,即:当我关闭终端时,我希望服务器继续运行。我已经用谷歌搜索并提出了本教程,但是它没有按预期工作。因此,我没有使用该守护程序脚本,而是以为我只使用了输出重定向(该`2>&1 file`部分),但这也不会退出-我在终端中出现空白行,就像它在等待输出/

  • 问题内容: 我目前正在为运行ubuntu的vms开发一个简单的部署脚本。所有这些机器都应该运行以jar形式提供的Java应用程序。 这是安装Java,将jar从本地计算机复制到远程计算机然后启动应用程序的脚本的相关部分: 通过java_installation.sh脚本的安装成功,scp命令也是如此。尝试通过ssh执行java_start_jar.sh中的命令时,会发生问题。java_start_

  • 我正在试验的Android信标库,我能够使其工作与苹果兼容的信标监测和测距添加自定义解析器(请参阅这是正确的布局,以检测iBeacons与AltBeacon的Android信标库?) 现在我正在尝试使用此处显示的示例代码编写一个在后台启动的应用程序: http://altbeacon.github.io/android-beacon-library/samples.html 这是我的代码: 不幸的