web-dev-qa-db-ja.com

アプリがバックグラウンドで実行されている間にローカル通知を送信するSwift 2.0

ユーザーがアプリを最小化したときに(iPhoneのホームボタンをクリックするか、電話をロックすることによって)、ユーザーに「プッシュ通知スタイル」アラートを送信しようとしています。

私のアプリはXMLファイルを継続的に解析し(10秒ごと)、ユーザーがアプリを最小化またはロックした後でも、プログラムで何らかの条件が満たされると、ユーザーにローカル通知を送信するようにアプリを実行し続けたいと考えています。電話。

私はチュートリアルから跳ね返り、誰もが通知を「スケジュール」しているようですが、私の通知は時間ベースではなく、満たされている条件に基づいているため、これは私にとってはうまくいきません。

私がこれまでにしたこと:

AppDelegate.Swift

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil))
    return true
}

MapViewController.Swift

// Some function
func someFunction(delta: Int) {
    if delta < 100 {
        // Send alert to user if app is open
        let alertView = UIAlertController(title: "This is an Alert!", message: "", preferredStyle: UIAlertControllerStyle.Alert)
        alertView.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
        self.presentViewController(alertView, animated: true, completion: nil)

        // Send user a local notification if they have the app running in the bg
        pushTimer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: Selector("pushNotification"), userInfo: nil, repeats: false)
    }
}

// Send user a local notification if they have the app running in the bg
func pushNotification() {
    let notification = UILocalNotification()
    notification.alertAction = "Go back to App"
    notification.alertBody = "This is a Notification!"
    notification.fireDate = NSDate(timeIntervalSinceNow: 1)
    UIApplication.sharedApplication().scheduleLocalNotification(notification)
}

アラートはアプリが開いている間はうまく機能しますが、スマートフォンでアプリを最小化すると通知が表示されません。バックグラウンドでアプリが実行されていないか、この概念をよく理解していないと思います。どんな助けでも大歓迎です。

7
Ivan

デフォルトでは、NSTimerはシミュレーターでのみ機能します。これをAppDelegateファイルに追加してみてください。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: [.Sound, .Alert, .Badge], categories: nil))

application.beginBackgroundTaskWithName("showNotification", expirationHandler: nil)

        return true
    }
10
nadi9