ibeacon

6966 ワード

まとめ
1.iOS 7.0以降のバージョンでiBeaconのサポートが開始されました.2.ハード面では、iPhone 4 S以降、ipad 3世代以降、ipad Mini以降、ipod 5以降.3.iOS7.1と7.0の上昇は、ios 7.1がアプリケーションがkillによって削除された後、およびデバイスが再起動する後も、iBeaconのエッジトリガおよび点灯トリガ動作を監視し続けることができ、ios 7.0プログラムがkillによって削除された後、およびデバイスが再起動する後、監視を行わない.iBeaconで起動したアプリケーションは、バックグラウンドで10秒しか実行されません.もちろん、beginBackgoundTaskで長時間実行する必要があるタスクを実行することもできます.アプリケーションがバックグラウンドにあるか、killに落ちているかにかかわらず、10秒以内にアプリケーションの状態はバックグラウンドで実行されます.10秒後も理論的にはプログラムはバックグラウンドで実行されていますが、この時もシステムリソースのせいでプログラムを直接killしてしまう可能性があります.5.ios7.1バージョン以降、バックグラウンドおよびkillの落下を監視するには、ユーザーがBluetoothをオンにし、バックグラウンドアプリケーションのリフレッシュ機能をオンにし、位置決めサービスでそのアプリケーションの位置決め機能をオンにする必要がある(この機能をオンにしないとiBeaconのdidRangeメソッドのコールバックができない).didEnterとdidExitの呼び出しは、iBeaconが同じuuid、異なるmajor、および異なるminorを持つことができるため、uuid単位でトリガーされます.A,Bが同じuuid,major,minorの異なる2つのiBeaconデバイスである場合,ユーザはA領域からB領域に移動し,didEnterとdidExitイベントを引き起こすことはない.7.iBeaconのdidEnterとdidExitの呼び出しが正確ではないことがテストで分かった.同じ秒内にdidExitを呼び出してdidEnterメソッドを呼び出すので,この2つのメソッドには信頼性がない.8.良い方法は、システムが起動するとdidRangeを呼び出すので、didRangeに依存してbeaconの統計とコード呼び出しを行うべきである.didRangeでは現在のシステムの状態をとり,フロントに適用された場合をフィルタリングすることができる.9.画面を点灯してアプリケーションを喚起する行為は、点灯した時点で、ユーザの周囲でibeaconデバイスを検出する必要がある.そうしないと、アプリケーションを起動する操作はトリガーされない.10.領域に入ってアプリケーションを起動すると、周囲にiBeaconデバイスがあるに違いないことを示し、領域を終了してアプリケーションを起動し、起動時に周囲にiBeaconデバイスがないことができる.領域に入るイベントと終了イベントの両方がアプリケーションを起動できます.11.ibeaconのエッジトリガはiosデバイスが移動しているか、ibeaconデバイスが移動しているかである.12.ibeaconデバイスのスキャンをiosプログラムで直接Bluetooth機能を使用して行い、Bluetoothがオフの場合、プロンプトがポップアップします.ヒントユーザー:「Bluetoothを開き、「XXXアプリケーション」をアクセサリに接続できるようにするヒントは、多くのユーザーがこのヒントを見て、どのようなアプリケーションなのか心配していると信じています.最善の方法は、プログラムでibeaconを使用し、ibeaconが使用できる場合、Bluetooth機能は必ずオンになります.ibeaconが使用できない場合は、バックグラウンドのリフレッシュがオンになっているかどうか、ユーザーが許可しているかどうかを判断し、問題がなければ、Bluetoothがオンになっていない可能性があります.しかし、Bluetoothが開いていないとは確信できません.13.ibeaconが離れたエリアをテストするには約15メートルで、障害物があることが望ましい.携帯電話とibeaconを直接見せることはできない.14.現在のiosデバイスをiBeaconデバイスにシミュレートする必要がない場合は、Targetのbackground modeを開いて設定する必要はありません.(ネット上では何も説明されていない文章が多く、これを開くように直接伝えられ、ブルートゥースなどを設定したり、location updateなどを設定したりしています.これを開くとホームキーを押した後、バックグラウンドに入って長い間稼働し続け、テストでは最長25分程度稼働できることがわかりました.このようなアプリケーションは、アップルが厳しく審査している場合は難しいです監査に合格する.)
UIAppDelegate
import UIKit
import CoreLocation
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate ,CLLocationManagerDelegate{
    let manager = CLLocationManager()
    
    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        window = UIWindow(frame: UIScreen.mainScreen().bounds)
        window?.backgroundColor = UIColor.whiteColor()
        let na = UINavigationController(rootViewController: ViewController())
        window?.rootViewController = na
        manager.delegate = self
        return true
    }
    //    
    func locationManager(manager: CLLocationManager, didEnterRegion region: CLRegion) {
        if region.isKindOfClass(CLBeaconRegion) {
            let no = UILocalNotification()
            no.alertBody = "    "
            no.soundName = UILocalNotificationDefaultSoundName
            UIApplication.sharedApplication().scheduleLocalNotification(no)
        }
    }
    //    
    func locationManager(manager: CLLocationManager, didExitRegion region: CLRegion) {
        if region.isKindOfClass(CLBeaconRegion) {
            let no  = UILocalNotification()
            no.alertBody = "    "
            no.soundName = UILocalNotificationDefaultSoundName
            UIApplication.sharedApplication().scheduleLocalNotification(no)
        }
    }
}

ViewController
import UIKit
import CoreLocation
class ViewController: UIViewController {
    
    var beaconRegion :CLBeaconRegion?
    let manager = CLLocationManager()
//    let label = UILabel()
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(label)
        
        /**    
         */
        manager.delegate = self
        //Always              ——           ,          。Always(  )   When in Use(        )   iOS 8            。             Always(  ) ,            ,                。
        manager.requestAlwaysAuthorization()
   
        title = "   "
    }
    //MARK:   
    private lazy var label: UILabel = {
        let label = UILabel(frame: CGRect(x: 60, y: 150, width: 200, height: 100))
        label.backgroundColor = UIColor.cyanColor()
        label.numberOfLines = 0
        return label
    }()
}
extension ViewController: CLLocationManagerDelegate{
    func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
        if status == CLAuthorizationStatus.AuthorizedAlways {
            startMonitoring()
        }
    }
    //    
    func startMonitoring(){
        beaconRegion = CLBeaconRegion(proximityUUID: NSUUID(UUIDString: "")!, major: 1, minor: 1, identifier: "code")
        manager.startMonitoringForRegion(beaconRegion!)
        manager.startRangingBeaconsInRegion(beaconRegion!)
        
        NSUserDefaults.standardUserDefaults().setObject(1, forKey: "beaconAwakening")
    }
    //       
    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
        
    }
    
    //     
    func locationManager(manager: CLLocationManager, monitoringDidFailForRegion region: CLRegion?, withError error: NSError) {
        
    }
    //      beacon
       iBeacon     ,       10  ,       beginBackgoundTask               ,           ,    kill , 10  ,            。  
    10  ,                ,                           kill 。 
 func locationManager(manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion) {
        //  //               ,            ,ibeacon    ,          
        //           ,      ,but,        
        myTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({ 
            //        
        })
        //       
        UIApplication.sharedApplication().endBackgroundTask(myTask!)
        myTask = UIBackgroundTaskInvalid
        for  beacon in beacons {
            WLLog("\(beacon)")
        }
        for beacon in beacons {
             
            label.text = "proximity:\(nameForProximity(beacon.proximity))RSSI:\(beacon.rssi)   :\(beacon.accuracy)"
        }
    }
    
    func nameForProximity(proximity: CLProximity) ->String{
        switch proximity {
        case CLProximity.Unknown:
            return "Unknown"
        case CLProximity.Far:
            return "Far"
        case CLProximity.Near:
            return "Near"
        case CLProximity.Immediate:
            return "Immediate"
        }
    }

}

Info.plist Info.plistを開き、Information Property List行の+をクリックしてKey:NSLocationAlwaysUsageDescriptionType:StringValue:"SLC "を追加します.