5714


バックグランドで実行させたいiPhoneアプリを作っているのですが、方法がよく分かりません。  
考えているアプリの動作方法としては、

１.一度そのアプリを起動させ、一旦閉じる

２.画面がホーム画面や他のアプリを起動している時に、バックグラウンドで加速度センサーとジャイロセンサー を使ってデバイスの揺れ、傾きを検出する。

３.検出した値に条件を絞ってバナーに通知を出す（LINEの通知のような感じで）。

以上の方法を教えてください。


CC BY-SA 3.0
2015-02-01T08:08:35.270
5689
2015-02-04T03:01:40.220
7996
question
objective-c swift xcode
iPhoneAppでバックグランドで常時実行する方法はありませんか？


フォアグラウンドで問題無く動作しているのであれば、info.Plistの設定の問題と思います。

`info.plist` -> `Required background modes`(＋から追加)

追記  
②について  
認識不足でしたがCoreMotionのみではbackgroundでの傾き等へ検出出来ないようです。  
ですので、CoreLocationと組み合わせて実装することで、動作することを確認しました。  
iOS8でテストしましたので、info.plistで`NSLocationAlwaysUsageDescription`の追加も必要です。  
swiftですが、codeを記載します。  
環境  
Xcode6.1.1  
iOS8.1  
iPhone6

[code]

    import UIKit
    import CoreMotion
    import CoreLocation
    
    class ViewController: UIViewController,CLLocationManagerDelegate{
    
        var myMotionManager: CMMotionManager!
        var locManager: CLLocationManager?
    
        override func viewDidLoad() {
    
            super.viewDidLoad()
    
            self.locManager = CLLocationManager();
            self.locManager!.delegate = self;
            if (!CLLocationManager.locationServicesEnabled()) {
                println("Location services are not enabled");
            }
            self.locManager!.requestAlwaysAuthorization();
            self.locManager!.pausesLocationUpdatesAutomatically = false;
            self.locManager!.startUpdatingLocation()
    
            // MotionManagerを生成.
            myMotionManager = CMMotionManager()
    
            // 更新周期を設定.
            myMotionManager.accelerometerUpdateInterval = 0.5
    
            // 加速度の取得を開始.
            myMotionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue(), withHandler: {(accelerometerData:CMAccelerometerData!, error:NSError!) -> Void in
                println(accelerometerData.acceleration.x)
            })
    
        }
    
        func locationManager(manager: CLLocationManager!, didUpdateToLocation newLocation: CLLocation!, fromLocation oldLocation: CLLocation!) {
            //println(newLocation.timestamp)
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    }
    
[/code]

[参考 独立型戦闘支援ブログ様](http://tanakahiroki.com/?p=371)


CC BY-SA 3.0
2015-02-02T00:58:54.850
5714
2015-02-04T03:01:40.220
2015-02-04T03:01:40.220
4551
4551
5689
answer