2017-09-26 10 views
0

私はジオロケーションアプリを作成しています。毎回座標を送信したサービスの起動を自動的に開始したいと考えていました。閉鎖されたアプリケーションアプリケーションがイベントをトリガーしました:didReceiveRemoteNotification:

私はインターネットを見て、それは技術的には可能ではありませんが、問題を克服する方法がいくつかあります。

私は静かな通知を採用したかったのです。

私はこのメソッドを実装しましたが、アプリがバックゴールードにあるときはすべて動作しますが、デバイスをオンにしてサイレント通知を送信すると、イベント:didReceiveRemoteNotification:がトリガーされません。 や、アプリのスイッチャーからアプリを終了して通知を送信しても、トリガーされません。

私はあなたがそれをすることができれば何か間違いがあるかどうかを知りたいと思っていました。

PS:私が使用している:didReceiveRemoteNotification:なしアプリケーション:didReceiveRemoteNotification:fetchCompletionHandler:(これは問題になる可能性が?)AppDelegateで

マイコード:私のFinishedLaunchingで

public override async void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> 
    completionHandler) 
     { 

      await Manager.SendPosition(completionHandler); 
     } 

if (Convert.ToInt16(UIDevice.CurrentDevice.SystemVersion.Split('.')[0].ToString()) < 8) 
      { 
       UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | 
       UIRemoteNotificationType.Sound; 
       UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(notificationTypes); 
      } 
      else 
      { 
       UIUserNotificationType notificationTypes = UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound; 
       var settings = UIUserNotificationSettings.GetSettingsForTypes(notificationTypes, new NSSet(new string[] { })); 
       UIApplication.SharedApplication.RegisterUserNotificationSettings(settings); 
       UIApplication.SharedApplication.RegisterForRemoteNotifications(); 
      } 

、私のするinfo.plistで:

<key>UIBackgroundModes</key> 
     <array> 
     <string>location</string> 
     <string>remote-notification</string> 
     </array> 

UPDATE:

public async Task<bool> SendPosition(Action<UIBackgroundFetchResult> completionHandler = null) 
     { 
      StartLocationUpdates(); 
      var setting = ConnectDb()?.Table<Settings>().FirstOrDefault() ?? new Settings(); 
      _currentLong = 14.52538; 
      _currentLat = 36.82842; 
      if (_currentLong != 0 && _currentLat != 0)// && setting.TimeNotification != 0) 
      { 
       var objectSend = new 
       { 
        unique_key = setting.UniqueKey, 
        lat = _currentLat, 
        lng = _currentLong, 
        idPlayerOneSignal = setting.IdPlayerOneSignal, 
        token = "" 
       }; 

       var client = new HttpClient { BaseAddress = new Uri("http://amywebservice.com/") }; 
       var data = JsonConvert.SerializeObject(objectSend); 

       var content = new StringContent(data, Encoding.UTF8, "application/json"); 
       var response = await client.PostAsync("api/setPosition", content); 
       if (response.IsSuccessStatusCode) 
       { 
        var successResult = response.Content.ReadAsStringAsync().Result; 
        Debug.WriteLine("k", successResult); 
        if (completionHandler != null) 
        { 
         completionHandler(UIBackgroundFetchResult.NoData); 
        } 
        return true; 
       } 
       else 
       { 
        var failureResulr = response.Content.ReadAsStringAsync().Result; 
        Debug.WriteLine("f", failureResulr); 
        if (completionHandler != null) 
        { 
         completionHandler(UIBackgroundFetchResult.NoData); 
        } 
        return false; 
       } 
      } 
      return false; 
     } 

ではなく、仕事私はサイレント通知を送信する場合、私は唯一の第1のフライを実行して、アプリがbackgorundにある場合にのみ。

私の電話をオンにして、通知通知が機能しない場合。

答えて

0
DidReceiveRemoteNotificationにXamarinのマニュアルによれば
  1. [MonoTouch.Foundation.Export( "アプリケーション:didReceiveRemoteNotification:fetchCompletionHandler:")] Xamarinに

    DidReceiveRemoteNotificationと同じですネイティブのapplication:didReceiveRemoteNotification:fetchCompletionHandler:。だから、方法は正しいです。

    アプリを強制終了した場合、アプリを再起動したり端末を再起動しない限り、サイレント通知はアプリを起動しません。リモート通知のバックグラウンドモードを有効にした場合

    はまた、システムアプリを起動(またはサスペンド状態からそれをウェイク)とリモート通知が到着したときに、バックグラウンド状態にします:ここではRelated Apple documentationです。ただし、ユーザーが強制終了した場合、システムは自動的にアプリを起動しません。そのような状況では、システムが自動的にアプリを自動的に起動しようとする前に、ユーザーはアプリを再起動したり、デバイスを再起動する必要があります。

  2. 私はここ(オープンアプリ、または他なしでお使いのデバイスのロックを解除?。)デバイスのターンオンについてのご説明で非常に明確ではありませんよ。私は、デバイスの電源を入れたときに

    が、とすぐにproceを終えるようapplication(_:didReceiveRemoteNotification:fetchCompletionHandler:)

    に従ってサイレント通知

    しかしを送信通知を送信するには、handlerパラメータでブロックを呼び出す必要があります。そうしないと、アプリケーションが終了します。あなたのアプリは通知を処理し、指定された完了ハンドラブロックを呼び出すために最大30秒の壁時計時間を持っています。 実際には、通知の処理が終了するとすぐにハンドラブロックを呼び出す必要があります。システムは、アプリのバックグラウンドダウンロードの経過時間、電力使用量、およびデータ費用を追跡します。 プッシュ通知を処理する際に大量の電力を使用するアプリケーションが、将来の通知を処理するために早期に起動するとは限りません。

    通知の処理が完了したら、completionHandlerを実装する必要があります。あなたが欲しいものを手に入れるとき

    • completionHandler(UIBackgroundFetchResult.NewData)

      は、if文と対応する場所でDidReceiveRemoteNotificationcompletionHandler()を追加します。

    • completionHandler(UIBackgroundFetchResult.Failed)データの取得に問題がある場合。
    • completionHandler(UIBackgroundFetchResult.NoData)データがない場合。

    あなたのコードでは見逃しているようですが、これはサイレント通知に影響する可能性があります。

+0

私は電話を切って再起動して通知を送信すると、私は自分のアプリを目覚めさせられません。それは完了のためかもしれませんハンドラ 私はどのように操作完了ハンドラに従うのですか?この類似 –

+0

: 'パブリックオーバーライド非同期ボイドDidReceiveRemoteNotification(のUIApplicationアプリケーション、NSDictionaryのユーザー情報、アクション completionHandler) {completionHandler(UIBackgroundFetchResult.NoData)。 await Manager.SendPosition(); } ' ??? –

+0

@BrunoMandarà、SendPosition()メソッドの終了コールバックのように、位置の送信が完了したら 'completionHandler'を実行します。 –

関連する問題