菜鸟教程小白 发表于 2022-12-13 06:04:51

ios - 在 iOS App 中使用位置服务时如何确定确切的应用重新启动原因?


                                            <p><p>我在我的 iOS 应用中使用定位服务,它包括 <code>SignificantLocationChanges</code> 和 <code>Geofence</code>。</p>

<p>当用户移动一段距离时,iOS 正在唤醒我的应用。我在 AppDelegate 中使用“<code>UIApplicationLaunchOptionsLocationKey</code>”来识别应用启动,如下所示。</p>

<pre><code>if (launchOptions) {
    NSLog(@&#34;App relaunched because of new location events.&#34;);
} else {
    NSLog(@&#34;Normal app open&#34;);
}
</code></pre>

<p>但我无法确定是 <code>SignificantLocationChanges</code> 还是 <code>Geofence</code>。</p>

<p>我们是否可以使用“<code>UIApplicationLaunchOptionsLocationKey</code>”来确定应用重新启动的确切原因。</p>

<p>我知道以下地理围栏的委托(delegate)方法:</p>

<pre><code>- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLCircularRegion *)region {
}
</code></pre>

<p>但是由于某种原因,这个方法没有被触发。</p>

<p>我正在寻找方法来确定确切的应用重新启动原因(SLC 或地理围栏)。</p>

<p>有什么建议吗?</p>

<p>提前致谢。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我不完全确定,你在问什么,但我会尽力而为。
您是使用地理围栏还是使用核心位置区域监控?</p>

<p>如果您想知道您的应用是否被 <strong>didEnterRegion</strong>/<strong>didExitRegion</strong> 或 <strong>didUpdateLocations</strong> 唤醒
我想您可以让 locationManager 委托(delegate)方法使用以下方式显示本地通知:</p>

<pre><code>-(void)showBackgroundNotification:(NSString *) message {
    if (app.applicationState == UIApplicationStateBackground &amp;&amp; .types != UIUserNotificationTypeNone){
      UILocalNotification *note = [ init];
      note.alertBody = message;
      note.soundName = UILocalNotificationDefaultSoundName;
      note.fireDate = ;
      ;
    }
}
</code></pre>

<p>通过在每个委托(delegate)函数中使用不同的字符串消息调用该函数。</p>

<p>如果我理解正确,情况是应用程序处于终止状态,即关闭。然后它得到一个位置更新并唤醒。然后发生了一些事情。</p>

<p>你得到 didEnterRegion 但没有 didExitregion 吗?问题可能是您没有按照应有的方式手动开启定位服务。</p>

<p>我在我的 AppDelegate.m 中使用它</p>

<pre><code>- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //for wake from terminated on location updates
    if () {
      GeoFence *fence = ;
      ;
    }
}
</code></pre>

<p>我的地理围栏类是单例。除了 locationManager 委托(delegate)函数之外,还有两个重要的函数:</p>

<pre><code>//singleton
+ (GeoFence*) sharedInstance {
    static GeoFence *_sharedInstance = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&amp;oncePredicate, ^{
      _sharedInstance = [ init];
    });
    return _sharedInstance;
}

- (instancetype)init{
    self = ;
    if (self) {
      self.locationManager = [ init];
      locationManager.delegate = self;

      //get authorization
      if () {
            ;
      }
      ;
      }

    }
    return self;
}
</code></pre>

<p>我真的希望你可以使用它。如果您需要进一步的帮助,请告诉我。
记得在头文件中声明 + (GeoFence*) sharedInstance 。</p>

<p>此外,请务必记住,区域监控不依赖于位置更新。文档对此并不清楚,但您可以关闭显着的ChangeLocationUpdates 并仍然获取您的区域边界事件。但那是另一回事了。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在 iOS App 中使用位置服务时如何确定确切的应用重新启动原因?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/29225913/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/29225913/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在 iOS App 中使用位置服务时如何确定确切的应用重新启动原因?