web-dev-qa-db-ja.com

Xcode / iOSシミュレーター:手動で重要な場所の変更をトリガーします

この通知に登録されているアプリケーションを起動する重要な位置変更通知をディスパッチするようにデバイスに手動で指示する方法はありますか?これはテスト専用であり、このプライベートAPI呼び出しはアプリストアへの送信時に拒否されることを認識しています。

75
Nick

だから2つの答え:

A)電車に乗る:-)

B)シミュレーターを使用します。 iOS 5.xシミュレーターには、ロケーションサブメニューを持つデバッグメニューがあります。高速道路ドライブを選択します。これにより、北カリフォルニアの風光明媚な280を下る想像上の旅でシミュレーターが起動します。ビュー以外のすべてが提供されます。アプリは重要な場所の変更の更新を取得し、中断されている場合はバックグラウンドで起動を取得します。

実際に移動していることを確認するには、シミュレーターでsafariを起動し、maps.google.comに移動して、[現在地を追跡]ボタンをクリックします。移動する必要があります。

驚くばかり!次に、システムによって起動されるライフサイクルの問題をデバッグする方法は?簡単!アプリが起動してデバッグを開始するまでxCodeを待機させます。 [スキーム]メニューから、[スキームの編集]を選択します。 [スキームの実行]および[情報]タブで、[起動]設定として[My.appの起動を待つ]を選択します。

シミュレーターでアプリを1回実行して、位置情報の更新の監視を開始し、強制的に終了して中断します。 ブレークポイントの追加アプリケーションで関数の起動が完了し、待機しました。シミュレーターが十分に機能し始めるとすぐに、アプリケーションが起動され、ブレークポイントがヒットし、お金を稼ぎます。

しかし、本当に、電車に乗るのはもっと楽しいです。

189
MagicSeth

さて、飛行機モードやWiFiのオンとオフを切り替えることでこれができることがわかりました。おそらく、機内モードのデバイスでアプリを起動してから、アプリを閉じて機内モードをオフにします。これにより、GPSがオンになり、位置の更新が強制的に送信されます。

17
Chris

また、大幅な変更の監視を使用する終了したアプリの再起動をテストしたかったのです。起動オプションディクショナリのロケーションキーによって起動されたときにローカル通知を表示するように、コードを記述しました。

シミュレータでアプリを実行しました。それからマルチタスクバーからそれを殺しました。次に、iOSシミュレーターの場所をカスタムの場所に設定します。シミュレーターを終了し、再び開始しました。私のアプリは重要な場所の更新を受け取り、ローカル通知を表示しました。

4
aslisabanci

私は同じ問題、「startMonitoringSignificantLocationChanges」をテストし、中断したときにアプリが位置情報の更新を受信して​​いるかどうかを確認する方法に苦労していました。

ブレークポイントで実行をキャッチすることはできませんでしたが、新しいロケーションデータをサーバーに送信することで、実装の結果を確認できました。

フロー全体:-「startMonitoringSignificantLocationChanges」および場所の緯度と経度を更新するためのサーバーへのAPI呼び出しで実装-場所更新バックグラウンドモード機能をtrueに設定-ロケーションマネージャーが開始され、アプリがリッスンしているようにアプリを実行場所の変更-アプリを強制的に閉じます-シミュレータのデバッグ->場所を高速道路ドライブに設定します-場所が変更されているかどうかを確認するためにマップを開きます-場所の更新を確認するためにサーバーで待機し、約3分ごとに新しい結果を取得していました

しかし、実際のデバイスでこれで十分かどうかはまだわかりません。

Xcodeバージョン6.0.1(6A317)に取り組んでいます。 Simulator iPhone 5s(8.0)でテスト済み。

3
Bardh Lohaj

シナリオに応じて、2つのソリューションを提案します。

  1. StopMonitoringSignificantLocationChangesに続いてstartMonitoringSignificantLocationChangesを定期的に呼び出すTimerまたはLocalNotificationを使用します。これにより、新しい場所がコードに送信されるようになります(以前と同じLocationになる場合があります)。

  2. デバッグビルドで開始し、CLLocationManagerと同じデリゲートメソッドを呼び出す独自のGPSシミュレーターをビルドします。

1
sliver

MagicSethの答えに加えて、シミュレータではなく実際のデバイスでこれをテストする必要がある場合、[設定]アプリの[全般]> [プライバシー]画面で位置情報サービスを無効にして再度有効にすることで、UIApplication.LaunchOptionsKey.locationキーでバックグラウンド起動をトリガーできます。

1
Eugene Tulushev

IOS 7およびXcode 5.1.1で気づいたことの1つ-SLCイベントがアプリをバックグラウンドモードで起動することを期待している場合、設定したブレークポイントにヒットする場合とヒットしない場合があります。私にとっては、NSLogメッセージが表示されないこともあります。

その場合は、システムログからNSLog出力を表示できます。 iOSシミュレータの[デバッグ]メニューからシステムログを開くことができます。

1
Ke Sun

IOS 4では、場所の大幅な変更に登録できます。 Apple docs:このサービスでは、ロケーションの更新はユーザーのロケーションが大幅に変更された場合にのみ生成されます。したがって、ソーシャルアプリケーションや、クリティカルではないロケーション関連のユーザーを提供するアプリケーションに最適です更新が発生したときにアプリケーションが中断された場合、システムは更新を処理するためにバックグラウンドで起動します。アプリケーションがこのサービスを開始して終了した場合、システムは新しい場所が利用可能になると自動的にアプリケーションを再起動します。このサービスはiOS 4以降で利用でき、携帯無線を含むデバイスでのみ利用できます。

Apple docs here および here を参照してください。

位置情報の更新を登録するためのサンプルコードを次に示します。

- (void)startSignificantChangeUpdates {

// Create the location manager if it doesn't exist
if (nil == locationManager)
    locationManager = [[CLLocationManager alloc] init];

locationManager.delegate = self;
[locationManager startMonitoringSignificantLocationChanges];

}

ドキュメントによると、このサービスを実行したままにしてアプリケーションを一時停止または終了すると、新しい位置データが到着したときにサービスがアプリケーションを自動的に起動します。ウェイクアップ時に、アプリケーションはバックグラウンドに置かれ、位置データを処理するためのわずかな時間が与えられます。アプリケーションはバックグラウンドにあるため、最小限の作業を行い、割り当てられた時間が経過する前に戻ることを妨げる可能性のあるタスク(ネットワークへのクエリなど)を避ける必要があります。そうでない場合、アプリケーションは終了する可能性があります。

0
Jane Sales

高速道路ドライブ

enter image description here

// MARK: - MKMapViewDelegate

  func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
    guard let location = userLocation.location else { return }

    print(location.speed)
  }
0
onmyway133