2017-09-20 10 views
2

임 iOS 프로그래밍에 상당히 익숙하며 스위프트 3의 코어 블루투스로 연결하여 데이터를 특정 (맞춤형) 주변 장치에 연결하고 교환합니다.백그라운드에서 IOS (신속한) 앱에서 BLE 주변 장치로 데이터를 전송하는 방법은 무엇입니까?

사용자가 응용 프로그램에서 특정 모드를 선택하면 사용자가 다른 응용 프로그램을 열거 나 화면을 켜더라도 일정 기간 (매분) 또는 특정 시간에 장치에 데이터 (특성 쓰기)를 보내야합니다 떨어져서. 응용 프로그램이 활성화되어 있으면 scheduledTimer를 사용하여이 작업을 수행 할 수 있지만 응용 프로그램이 비활성 상태가되면 즉시 중지됩니다. 앱이 포 그라운드로 이동하면 주변 기기로 데이터를 계속 전송할 수있는 방법이 있습니까? 이것이 가능한가?

편집

이 (디팍 Tagadiya에 의해 설명 된대로) 내 배경 모드입니다 :

class MyDevice: UIViewController { 

var centralManager: CBCentralManager? 
var selectedPeripheral: CBPeripheral? 
var mRXCharacteristic: CBCharacteristic? 
var mTXCharacteristic: CBCharacteristic? 
var auto_timer = Timer() 


@IBOutlet weak var AutoSwitch: UISwitch! 
@IBAction func AutoSwitch(_ sender: UISwitch) { 
     if(sender.isOn == true){ 
      activateAutoModeTask() 
     } else { 
      disableAutoModeTask() 
     } 

} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    centralManager = CBCentralManager(delegate: self, queue: nil) 
    (…) 
} 

func activateAutoModeTask(){ 


    auto_timer.invalidate() // just in case this button is tapped multiple times 

    // start the timer 
    auto_timer = Timer.scheduledTimer(timeInterval: 20, target: self, selector: #selector(updateTask), userInfo: nil, repeats: true) 

} 

func disableAutoModeTask(){ 
    auto_timer.invalidate() 
} 

func updateTask(){ 
    let new_value = getNewValue() //function that get the new value 


    send(text: new_value) 
} 

func send(text aText : String) { 
    (…) 
    self.selectedPeripheral?.writeValue(data, for: self.mRXCharacteristic!, type: .withResponse) 
} 

}

: Background Modes

그리고 내 컨트롤러에서 일부 코드 아래 확장 MyDevice : CBCentralManagerDelegate {

func centralManagerDidUpdateState(_ central: CBCentralManager) { 
    (…) 
} 

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { 
    (…) 
    peripheral.delegate = self 
    selectedPeripheral = peripheral 
} 

}

확장 MyDevice : CBPeripheralDelegate {

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) { 
    (...) 
} 


func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) { 
    (…) 
} 

func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) { 
    (…) 
} 

func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) { 
    (…) 

    responseReceived(response: response_text) 
} 

} 응용 프로그램이 활성화 된 경우 만 앱을 이동하지 않을 경우

그래서 내가 주변에 쓸 수 있어요 (예를 들어 내가 홈 버튼을 클릭하면) 백그라운드로 이동합니다. 어쩌면 뭔가가 여전히 누락되었습니다 ...

미리 감사드립니다!

+0

아니요, 백그라운드에서 일정 시간에 중앙 (앱)에서 전송을 시작할 수 없습니다. 주변 장치가 매분 알림을 보내 앱을 실행시켜 값을 쓸 수 있습니다. – Paulw11

+0

3 분 후에 앱이 활성 모드가 아니므로 불가능합니다. –

+0

@ Paulw11 저에게 anwser를 지원하는 정보를 찾을 수있는 몇 가지 문서 또는 뭔가를 제공 할 수 있습니까? – sergio32

답변

2

나는 또한 똑같은 문제에 직면하여 이것을 해결했다. 요구 사항에 따라 백그라운드 모드 기능을 사용 가능하게 설정하십시오. 이 당신을 도울 것입니다

enter image description here

희망. 단계 아래

+0

죄송합니다 Pooja 굽타하지만 좀 더 구체적으로 알려주시겠습니까? 나는 이미 "블루투스 LE 액세서리를 사용"을위한 BackgroundMode를 활성화했기 때문에 주변 장치가 예를 들어 알림을 전송하면 (앱을 깨울 수 있음) 다른 방향으로는 작동하지 않는다고 생각합니다. – sergio32

0

따라

  1. 프로젝트 열기.
  2. 대상 선택 (프로젝트 아래).
  3. '기능'탭으로 이동하십시오.
  4. '배경 모드'선택 (기본값은 꺼짐)
  5. '블루투스 LE 액세서리 사용'및 '블루투스 LE 액세서리로 사용'(둘 다)을 선택하십시오.
  6. 프로젝트를 실행하십시오. enter image description here
+0

안녕 Deepak, 귀하의 anwser 주셔서 감사합니다하지만 난 아직도 붙어있어. 내 질문을 업데이트했습니다. 제발 의견 좀주세요. – sergio32

0

예, 주변 장치를 제어 할 때만 특별한 단계가 있습니다. 다음 깨우기까지 지연 정보가있는 주변 장치에 메시지를 보냅니다.

전경에서 당신은 peripheral = wakeme=30s 으로 보내십시오. 앱이 배경을 기다리고 기다립니다. 30 초 후 주변 장치가 데이터를 요청하고 다음 데이터를 더한 데이터를 보냅니다.