2016-08-22 18 views
14

ユーザーが停留所に近づいたときにバスの到着時間を取得しようとしていますが、その地域が基本的なローカル通知を送信して正しくトリガーされていることをテストしました。私のWebサービスコールが正常に動作していることを確認します。動的ロケーションベースのローカル通知Swift iOS

しかし、情報を取得して通知を送信するのが苦労しています。それが送信されない理由

var bgTask: UIBackgroundTaskIdentifier = UIBackgroundTaskIdentifier() 

    bgTask = UIApplication.shared().beginBackgroundTask { 

     self.webService?.getStopEstimates(routeStopIds: stopRouteIdSet, routeNameDict: routeNameDict, completion: { (result) in 

      if result == "error" { 
       return 
      } 

      let notification = UILocalNotification() 
      notification.fireDate = Date(timeIntervalSinceNow: 1) 
      notification.alertTitle = region.identifier + " Stop Details" 
      notification.alertBody = result 
      notification.soundName = UILocalNotificationDefaultSoundName 
      UIApplication.shared().scheduleLocalNotification(notification) 
     }) 

     UIApplication.shared().endBackgroundTask(bgTask) 
    } 

いずれかを参照してください。ここで

は私のコードですか?バックグラウンドフェッチとロケーションサービスを有効にしました。これは内部にあります didEnterRegion

+1

をSwift 3を使用すると、新しいUserNotificationsフレームワークがあることがわかります。 – tktsubota

+0

ファンドアプリケーション(UIApplication、didFinishLaunchingWithOptions launchOptions:[UIApplicationLaunchOptionsKey:Any]?)に通知するために登録することを忘れている可能性がありますか?登録コード:let notificationSettings = UIUserNotificationSettings(種類:.alert、categories:nil) application.registerUserNotificationSettings(notificationSettings) – Ramis

+0

どのようにテストしていますか? Xcodeで?要求が送受信されたかどうかを確認するログをいくつか追加します。エラーはありますか? – Wain

答えて

3

チェックthis example on GitHubここでの問題は、バックグラウンドタスクの処理方法です。 Webサービスコールに時間がかかりすぎると、バックグラウンドタスクは無効になります。上記の例では、ObjCをどれくらいうまく知っているのかわかりませんが、これを処理するBackgroundTaskManagerクラスがあります。あなたが確信している作るべき

もの:

  1. 背景には、ターゲット設定(背景モードのセクション)で取得が ONです。
  2. 「常に」承認を求めて取得しました(plistで)
  3. ターゲット設定(バックグラウンドモードのセクション)の場所の更新がオンです。
  4. アプリケーションデリゲートのappDidFinishLaunchingでユーザー通知用に登録されています。
  5. サービスが長時間かかる場合、有効期限が切れたバックグラウンドタスクを更新します。あなたのアプリがバックグラウンドで動作している一方で、CoreLocationはまだアプリの位置情報の更新を開始することで応答しますが、システムはもはやあなたのためのアサーションを保持していないだろう、とあなたのアプリが中断されますstartUpdatingLocationを呼び出した場合

バックグラウンドで許可された時間が費やされると、この時間は(現在)10秒です。しかし、実際にはあなたのアプリは現在中断されており、更新を受け取ることはできません。この期間を(現在)最大3分まで延長する方法がありますbeginBackgroundTaskWithExpirationHandler:read more about it in Apple's CoreLocation Documentation

この延長時間が十分かどうかは、アプリケーションによって異なります。

重要な位置情報変更サービスは非常に効率的です。 アプリがフォアグラウンドにあるときに位置情報の更新を開始し、アプリがバックグラウンドのときに位置更新を延期することができます。あなたはalso read Apple's documentation about Significant Location Change

5

私は同じことをしました(ユーザが割引を持っている店に近づくと、通知されます)。

まず、すべてのデータをダウンロードし、Core DataまたはSQLiteに保存することをお勧めします。

次に、重要なロケーションの変更hereを見てください。あなたが移動している場合、それはあなたの場所をバックグラウンドで更新し、didUpdateLocationの代わりにたくさんのバッテリーを節約します。

第3回SLCを使用した後、コアデータまたはSQLiteから現在の場所の20近い場所をフェッチし、監視のために追加します(Haversineを使用して、現在地からのすべての地点の距離を計算し、 20番近い)。 SCLが呼び出されるたびに、あなたが監視している地域を更新します(オフラインでデータを保存することはオプションではありません。ここであなたのWebサービスでリクエストを送信することをお勧めします。

didEnterRegionが呼び出されたときに、データがダウンロードされていることを確認してから、ローカル通知を作成します。

は、あなたがより詳細

PSが必要な場合は、私に教えてください。多くのリソースを消費している場合は、アプリがシステムによって終了することがあります(バックグラウンドで)。その場合、あなたはデータを引き出し、表示のためにあなたが必要なすべてを再初期化する必要がある(ネットワーク要求、ロケーションマネージャなど)アプリが原因AppDelegateのdidFinisingLaunchingWithOptionsにおけるロケーション・イベントのリニューアルことを検出することができます:あなたのことを考えると

if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) {} 
関連する問題