如何在xcode(swift)和phonegap中将iPhone作为背景灯光运行

我设法创build了一个应用程序,将手机变成信标发射器。

它在xcode(Swift)和phonegap上工作正常。

对我来说,下一步就是让它在后台作为信号灯工作(我正在为iOS 10开发)。

我发现这个在线类似的问题,但所有这些都过时了,即老ios,objective-c和outdate插件

真的很感激,如果有人可以提供我一个工作的例子,或指导我在我的代码中更改xcode(wift)和phonegap

Xcode(Swift 3)

import UIKit import CoreLocation import CoreBluetooth class ViewController: UIViewController,CLLocationManagerDelegate,CBPeripheralManagerDelegate,UITextFieldDelegate{ var locationManager = CLLocationManager() var startLocation: CLLocation! var localBeacon: CLBeaconRegion! var beaconPeripheralData: NSDictionary! var peripheralManager: CBPeripheralManager! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. locationManager.delegate = self locationManager.requestAlwaysAuthorization() bleSwitch.addTarget(self, action: #selector(ViewController.bleSwitchUpdated(_:)), for: UIControlEvents.valueChanged) major.delegate=self minor.delegate=self txPower.delegate=self } @IBOutlet weak var minor: UITextField! @IBOutlet weak var major: UITextField! @IBOutlet weak var txPower: UITextField! @IBOutlet weak var bleSwitch: UISwitch! @IBOutlet weak var bleView: UIView! @IBAction func bleSwitchUpdated(_ sender: UISwitch) { if bleSwitch.isOn { initLocalBeacon() bleView.isHidden = false; //bleSwitch.setOn(true, animated: false) } else { stopLocalBeacon() bleView.isHidden = true; } } func initLocalBeacon() { if localBeacon != nil { stopLocalBeacon() } let localBeaconUUID = "5A4BCFCE-174E-4BAC-A814-092E77F6B7E5" let localBeaconMajor: CLBeaconMajorValue = UInt16(major.text!)! let localBeaconMinor: CLBeaconMinorValue = UInt16(minor.text!)! let uuid = UUID(uuidString: localBeaconUUID)! localBeacon = CLBeaconRegion(proximityUUID: uuid, major: localBeaconMajor, minor: localBeaconMinor, identifier: "Your private identifer here") beaconPeripheralData = localBeacon.peripheralData(withMeasuredPower: -59) peripheralManager = CBPeripheralManager(delegate: self, queue: nil, options: nil) } func stopLocalBeacon() { peripheralManager.stopAdvertising() peripheralManager = nil beaconPeripheralData = nil localBeacon = nil } func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) { if peripheral.state == .poweredOn { peripheralManager.startAdvertising(beaconPeripheralData as! [String: AnyObject]!) } else if peripheral.state == .poweredOff { peripheralManager.stopAdvertising() } } func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { self.view.endEditing(true) if bleSwitch.isOn == true{ stopLocalBeacon() initLocalBeacon() } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } 

PhoneGap的

  var app = (function() { // Application object. var app = {}; // Background flag. var mAppInBackground = false; app.initialize = function() { document.addEventListener('deviceready', onDeviceReady, false); document.addEventListener('pause', onAppToBackground, false); document.addEventListener('resume', onAppToForeground, false); }; function onDeviceReady() { startMonitoringAndRanging(); startNearestBeaconDisplayTimer(); displayRegionEvents(); } function onAppToBackground() { mAppInBackground = true; stopNearestBeaconDisplayTimer(); } function onAppToForeground() { mAppInBackground = false; startNearestBeaconDisplayTimer(); displayRegionEvents(); } function startMonitoringAndRanging() { // Request permission from user to access location info. cordova.plugins.locationManager.requestAlwaysAuthorization(); BleconOn(); } function BleconOn(){ var uuid = '00000000-0000-0000-0000-000000000000'; var identifier = 'advertisedBeacon'; var minor = 2000; var major = 5; var beaconRegion = new cordova.plugins.locationManager.BeaconRegion(identifier, uuid, major, minor); var delegate = new cordova.plugins.locationManager.Delegate(); delegate.peripheralManagerDidStartAdvertising = function(pluginResult) { console.log('peripheralManagerDidStartAdvertising: '+ JSON.stringify(pluginResult.region)); }; // Event when bluetooth transmission state changes // If 'state' is not set to BluetoothManagerStatePoweredOn when advertising cannot start delegate.peripheralManagerDidUpdateState = function(pluginResult) { console.log('peripheralManagerDidUpdateState: '+ pluginResult.state); }; cordova.plugins.locationManager.setDelegate(delegate); // Verify the platform supports transmitting as a beacon cordova.plugins.locationManager.isAdvertisingAvailable() .then(function(isSupported){ if (isSupported) { cordova.plugins.locationManager.startAdvertising(beaconRegion) .fail(conole.error) .done(); } else { console.log("Advertising not supported"); } }) .fail(function(e) { console.error(e); }) .done(); } function BleconOff(){ cordova.plugins.locationManager.stopAdvertising() .fail(console.error) .done(); } return app; })(); app.initialize(); 

对于这两个代码,在目标的后台function中检查位置更新和背景获取。 而且,隐私 – 位置总是使用说明被添加到两个播放列表中

不幸的是,苹果阻止了在iOS上作为背景传输信号的能力。 所有CoreBluetooth标准广告实际上都被封锁了,因为广告位是有限的资源,后台的多个应用程序会很快耗尽这些资源。

苹果公司有一个专有的备份系统,在后台使用一个特殊的溢出区域来包含服务标识符。 但是,虽然这个计划在后台广告蓝牙服务的作品,它不适用于广告信标,因为它打破了格式。

底线:iOS上的背景灯塔广告只是不起作用。 抱歉。