2013년에 Apple Inc.는 다음과 같은 기술을 도입했습니다. 아이비콘 로 알려진 블루투스 4.0 프로토콜 위에서 실행됩니다. 블루투스 저에너지 또는 BLE. 블루투스 지원 디바이스는 스스로를 식별할 수 있지만, 일반적으로 스마트폰과 블루투스 헤드셋을 페어링하는 것처럼 호스트가 디바이스와 1대1로 페어링하는 방식으로 이루어집니다. 아이비콘은 미리 구성된 몇 가지 정보를 전송하는 브로드캐스트 서비스일 뿐이며 다른 블루투스 서비스와 병렬로 실행할 수 있습니다. 논의를 위해 다음과 같은 솔루션에서 비콘 애플리케이션을 만들 때 관심 있는 네 가지 매개 변수는 다음과 같습니다. Estimote 또는 짐벌 는 UUID 문자열, 주 16비트 숫자, 부 16비트 숫자, 신호 강도 값입니다.
iOS7에서 Apple은 아이비콘 작업을 위한 라이브러리 기능을 제공하며, 3rd 다른 플랫폼용 파티 라이브러리를 소개하지만, 여기 블로그에서는 iOS에 초점을 맞출 것입니다. 카우치베이스 모바일 기술을 결합한 에드 아렌버그와 EPage 팀 는 iBeacon을 많이 활용하고 로컬 스토리지에 Couchbase Lite를 활용하는 동시에 Couchbase Sync Gateway를 사용하여 수많은 기기 간에 데이터를 동기화하는 서비스를 개발 중입니다.
이제 이 iBeacon 서비스의 3가지 주요 구성 요소와 Couchbase Mobile 기술을 사용하여 이러한 핵심 기능을 구현하는 방법을 살펴보겠습니다. 모든 코드는 Swift 1.2로 작성되었습니다.
장치에 로컬로 데이터를 Couchbase Lite에 저장하기
이 서비스는 먼저 주변 비콘에서 정보를 수집하고 장치 정보를 데이터베이스에 기록합니다. 탐색을 위해 Apple은 많은 양의 문서 를 참조하여 근처의 아이비콘을 찾고 범위를 지정하는 방법을 알아보세요. 카우치베이스 라이트를 모바일 앱에 통합하려면 다음 링크를 참조하세요. 카우치베이스 모바일 개발자 포털 를 참조하여 샘플 코드를 확인하세요.
ORM 구현
앱이 네이티브 클래스에 객체를 유지하도록 하고 Couchbase 표현에 매핑하는 ORM을 구현할 것입니다. 앱이 iBeacon 그룹을 찾으면 해당 클래스 오브젝트가 생성됩니다. 이 클래스에는 개체를 Couchbase에 저장하고 Couchbase에서 로드하기 위한 코드가 포함되어 있습니다. 다음은 iBeacon을 보유하기 위한 클래스입니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
class Beacon : EntityDocument { var proximityID = “XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" var major : Int? = 0 var minor : Int? = 0 override func save() { let dict = NSMutableDictionary() dict["type"] = "gbeacon" dict["proximityID"] = proximityID dict["major"] = major ?? 0 dict["minor"] = minor ?? 0 super.save(dict) } override func load(document: CBLDocument) { super.load(document) proximityID = document.properties["proximityID"] as! String major = document.properties["major"] as? Int minor = document.properties["minor"] as? Int } } //EntityDocument is a base class for various objects: class EntityDocument { var document : CBLDocument? init () {} func save(dict: NSDictionary) { if document == nil { document = Database.sharedDatabase.createDocument(dict, object:self) } else { var error: NSError? var properties = NSMutableDictionary(dictionary: document!.properties) properties.addEntriesFromDictionary(dict as [NSObject : AnyObject]) if document!.putProperties(properties as [NSObject : AnyObject], error: &error) == nil { NSLog("%@", error!) } } } func load(document: CBLDocument) { self.document = document } func delete() { var error : NSError? if let doc = document { if !doc.deleteDocument(&error) { // Handle Error } } } } //Now can create Beacon object from a discovered 'foundBeacon'(CLBeacon iOS object) and save it simply with: let beacon = Beacon() beacon.proximityID = foundBeacon.proximityUUID beacon.major = foundBeacon.major beacon.minor = foundBeacon.minor beacon.save() } |
비콘 데이터 동기화
네트워크에 연결되면 Couchbase Mobile은 다음을 사용하여 데이터를 동기화합니다. 카우치베이스 동기화 게이트웨이. 푸시 및 풀 복제를 설정하면 이 작업이 자동으로 처리되므로 시스템을 매우 쉽게 조정할 수 있습니다. 옵저버 메서드를 추가하여 푸시 및 풀 작업의 상태를 수신할 수 있습니다. 그러나 각 장치는 조치를 취해야 하는 데이터베이스의 변경 사항을 수신해야 하므로 데이터베이스 변경 알림을 위한 옵저버를 추가할 수 있습니다. 데이터베이스가 변경되면 로컬 네이티브 객체를 업데이트합니다. 카우치베이스 상호 작용을 관리하려면 싱글톤을 인스턴스화하는 데이터베이스 객체를 만듭니다. 주요 개념은 아래 코드에 설명되어 있습니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
private let _DatabaseSharedInstance = Database() class Database { var manager: CBLManager = CBLManager.sharedInstance() var db: CBLDatabase var my_push: CBLReplication var my_pull: CBLReplication class var sharedDatabase: Database { return _DatabaseSharedInstance } init() { var replication_url = NSURL(string: REPLICATION_URL) var error :NSError? db = manager.databaseNamed(DATABASE_NAME, error: &error) let push = db.createPushReplication(replication_url) let pull = db.createPullReplication(replication_url) push?.continuous = true pull?.continuous = true my_push = push my_pull = pull push.start() pull.start() NSNotificationCenter.defaultCenter().addObserver(self, selector: "replicationChanged:", name: kCBLReplicationChangeNotification, object: push) NSNotificationCenter.defaultCenter().addObserver(self, selector: "replicationChanged:", name: kCBLReplicationChangeNotification, object: pull) NSNotificationCenter.defaultCenter().addObserver(self, selector: "databaseChanged:", name: kCBLDatabaseChangeNotification, object: db) } @objc func databaseChanged(notification: NSNotification) { if let changes = notification.userInfo!["changes"] as? [CBLDatabaseChange] { for change in changes { NSLog("%@ changed", change.documentID) updateObject(change.documentID) } } } @objc func replicationChanged(notification: NSNotification) { let active = my_pull.status == CBLReplicationStatus.Active || my_push.status == CBLReplicationStatus.Active NSLog("%@ in replication changed: %@", notification.object!.description, active) // Now show a progress indicator: if active { var progress = 0.0 let total = my_push.changesCount + my_pull.changesCount let completed = my_push.completedChangesCount + my_pull.completedChangesCount if total > 0 { progress = Double(completed) / Double(total); NSLog("progress: %f", progress) } } } } |
이는 모바일 앱이 주변 비콘 모니터링, 로컬 상태 저장, 앱 인스턴스 간의 정보 일관성 조정을 위한 동기화 서비스 설정과 같은 로컬 활동을 실행할 수 있도록 하는 주요 부분입니다. 이를 통해 더 많은 기능을 구축하고 앱 네트워크 전체에서 상태를 동기화할 수 있는 정교한 서비스를 만들 수 있습니다. 다음 블로그에서는 비콘의 사용과 카우치베이스 모바일 기술을 결합하여 네트워크 연결 없이도 작동하는 위치 인식 앱을 제공합니다.