2017-06-23 11 views
0

私はジオフェンシングを行うアプリを持っています。私がSimulator(Xcode 8.3.3とXcode 9)でそれを実行すると、私のCLLocationManager didEnterRegionが呼び出されないという例外を除いてすべてが機能するようです。locationManager didEnterRegionがXCode 9シミュレータで呼び出されていません

実際の世界で(地域を入力して)、または場所シミュレーションを介してXcodeでアプリを実行したとき、それはちょうどいいと呼ばれています。

これはなぜでしょうか?

私が発見した1つの違いは、使用時にシミュレータがモニタリング位置をサポートするだけなので、plistファイルに両方の許可文字列を持つように設定する必要があったが、それ以外は困惑している。

私は(それはあまりにも複雑で、私のアプリで配布です)、私はシミュレータで働いているものに注意しましょうコードを提供していないよので:私のアプリのスキームでは

  1. 、私がしている「場所を許可しますSimulation 'がチェックされており、監視している場所にいくつかの.gpxファイルが追加されています。私はデフォルトの場所を設定しています。

  2. 私の起動時に私のロケーションマネージャデリゲートが呼び出されています。私はシミュレータで認証され、常に電話で承認されます。

  3. locationManager(:didUpdateLocations :)は、場所が変更されたときに呼び出されます。

  4. didUpdateLocationsが呼び出されると、私は次のようにします。

    for r in manager.monitoredRegions { 
        if let cr = r as? CLCircularRegion { 
         if cr.contains(location.coordinate) { 
          log.debug("Am in the region!") 
         } else { 
          let crLoc = CLLocation(latitude: cr.center.latitude, 
                longitude: cr.center.longitude) 
          log.debug("distance is: \(location.distance(from: crLoc))") 
         } 
    } 
    

    、それが動作します。だから、私の地域は監視されていると私の場所は、私はそれがすべきだと思うところです。

  5. 最後に、私のlocationManagerデリゲートのmonitoringDidFailForとdidFailWithErrorが呼び出されていません。彼らは今までになかったことではなく、開発中に持っていますが、今はありません。

だから私は困惑しています。再び、それは電話ではうまく動作し、シミュレータではうまく動作しません。

私は間違っていますか?

答えて

5

[OK]を、私は問題を発見しました。

iOS11で彼ら サポート必ず、認可場合、すべてのアプリケーションがWhenInUse許可をサポートしている必要があります:まず、私はアップルにバグを提出し、次を受けていたXcodeの9/iOSの11のために必要な変更があります。この変更により、ロケーションサービスの使用 の説明キーが変更されました。アプリケーションが常に にプロンプ​​トを表示するには、アプリケーションのInfo.plistにNSLocationAlwaysAndWhenInUseUsageDescriptionと NSLocationWhenInUseUsageDescriptionの両方が必要です。

呼び出しているのであれば:locationManager.requestAlwaysAuthorization()、iOSの11のために、あなたはNSLocationAlwaysAndWhenInUseUsageDescriptionNSLocationWhenInUseUsageDescriptionの両方を持っている必要があります。アプリがiOS 11以前でも動作するようにしたい場合は、NSLocationAlwaysUsageDescriptionのままにしておく必要がありますので、3つのキーがあります。

私はこれを、Kuhncjが参照しているRay Wenderlichのチュートリアルで確認しました。つまり、Xcode 9では動作しませんが、Xcode 8では動作します。

私の問題は私の間違いでした。私は3つの正しいキーを持っていますが、私は権限を求めたところ、しかし見直しで、私は次のように持っていた:

var permission : Permission = SimulatorPlatform.isSimulator ? .locationWhenInUse : .locationAlways

だから私は基本的には、デバイス対シミュレータごとに異なるコードを実行していました。それを変更した後、私のアプリは、監視領域に到着呼び出されますでした。 iOSの11はあなたのInfo.plistに、次の使用のために

0

シミュレータはリージョンモニタリングをサポートしていますが、私はあなたの2番目の問題が問題だと思います。変更してみてください。あなたが更新を見ていなくても.authorizedAlwaysにauthorizedWhenInUseを使用してください。私は首尾よくRay Wenderlichの "Geofencing Tutorial with Core Location"を使用して、シミュレータで領域モニタリングを再現しました。サンプルプロジェクトをチェックしたいかもしれません。 Appleは言う:

承認ステータスがkCLAuthorizationStatusAuthorizedある場合は、あなたの アプリは、それが 登録された地域のための境界横断通知を受け取ることができます。承認ステータスがで、他の値がに設定されている場合は、 アプリにはが届きません。

なお:

kCLAuthorizationStatusAuthorized = kCLAuthorizationStatusAuthorizedAlways

シミュレータがalwaysAuthorizationに設定されているときに、アップデートが表示されないことをその奇妙な。私はシミュレータがタイミングの面で大きく乱れることがあることを経験しました。

iOSシミュレータまたは デバイス上のお住まいの地域の監視コードをテストする場合、 領域の境界を超えた後に地域のイベントがすぐに発生しないことを実現:でも、Appleはテスト時に合併症があることを指摘しています。偽の通知を防止するため、iOS は特定のしきい値 の条件が満たされるまで地域通知を配信しません。具体的には、ユーザーの所在地は 地域の境界線を越え、境界から最小距離 まで移動し、通知が報告される前に少なくとも20秒間その最小距離に留まる必要があります。

特定のしきい値の距離は、ハードウェアと現在利用可能な位置情報技術によって決定されます。たとえば、 Wi-Fiが無効になっている場合、地域の監視はかなり正確です 。ただし、テスト目的では、 の最小距離は約200メートルと想定できます。

すべてのリンゴの言及から: https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/LocationAwarenessPG/RegionMonitoring/RegionMonitoring.html#//apple_ref/doc/uid/TP40009497-CH9-SW1

レイのチュートリアルは動作するようです: https://www.raywenderlich.com/136165/core-location-geofencing-tutorial

+0

こんにちはKuhncjを、ヒントをありがとうございました。その上で、私はバックレイWenderlichチュートリアルに行き、私はXcodeの8が表示のですかことがわかっはなく、Xcodeの9とXcodeの9はあなたのために働いていますか?私はついにそれを働かせましたが、変化があります。私は解決策をフォローアップします。 – markand

+0

は、私は – kuhncj

+0

[OK]をXcodeの8.3.3で動作するようには思えないのXcode 9に取り組んで簡単にそれを取得することができ波平、私たちは、同じ結果を取得しています。あなたはそれがXcodeの9上で動作するようになって試してみたい場合は、ソースコードモードでplistファイルを開いてみてください - とに次のキーを追加します - 影響は3つのキーの一つ、これを思い出すことができないというのplistエディタにはバグがあります' NSLocationAlwaysAndWhenInUseUsageDescription \t Geotifyは、ジオフェンスに入ったり出たりするときに通知するために携帯電話の場所にアクセスする必要があります。 ' – markand

0

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key> 
    <string>Need Location</string> 

    <key>NSLocationAlwaysUsageDescription</key> 
    <string>Need Location</string> 

    <key>NSLocationWhenInUseUsageDescription</key> 
    <string>Access For Location</string> 
関連する問題