0

在我的应用程序中,我使用 CLLocation 管理器来查找当前位置。根据当前位置,我想获得我所在位置的日出和日落时间。

例如:如果当前位置是旧金山,那么日出时间和日落时间就是旧金山的时间。至此,我成功了。但是,如果当前时间等于日出时间,即使我的应用程序在后台,我也想每天触发警报。

我搜索了很多方法,但没有一个让我满意。我是 iOS 开发的新手。

applicationDidEnterBackground 方法在终止应用程序之前运行了一段时间。

4

2 回答 2

2

您可能希望在 plist 中设置后台位置模式,以使其即使在后台也能响应位置更新。然后在位置更新回调中获取日落时间并在该时间安排本地通知。

此外,最好管理通知并禁用不适当的通知(更改位置 = > 新通知)。

更新: 在您的特定情况下,不需要连续的位置数据流,重要的位置变化跟踪就可以了。这种方法不需要 plist 中请求的后台定位模式,并且不会以光速耗尽电池。您可以在这里找到信息:- (void)startMonitoringSignificantLocationChanges。请注意,即使使用后台位置模式应用程序不会在后台连续运行,它也只会被调用以执行位置更新回调。

所以一开始你:

[locationManager startMonitoringSignificantLocationChanges];

然后在位置更新回调中:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    // check location
    // get time of sunset

    // schedule UILocalNotification
}

刚刚为您找到一篇文章:在 iOS 4.Objective-C 中使用 UILocalNotification 设置提醒。还要检查这个:在后台执行代码+在日期安排警报

于 2012-10-16T13:17:39.317 回答
0

Android Awareness API最近发布了新功能,可为您的用例提供简单的解决方案。实现您想要做的事情的方法是创建和注册一个相对于日出/日落指定的 TimeFence。

例如:

// Create TimeFence
AwarenessFence sunriseFence =
    TimeFence.aroundTimeInstant(TimeFence.TIME_INSTANT_SUNRISE,
        0, 5 * ONE_MINUTE_MILLIS);

// Register fence with Awareness.
Awareness.FenceApi.updateFences(
    mGoogleApiClient,
    new FenceUpdateRequest.Builder()
        .addFence("fenceKey", sunriseFence, myPendingIntent)
        .build())
    .setResultCallback(new ResultCallback<Status>() {
        @Override
        public void onResult(@NonNull Status status) {
            if (status.isSuccess()) {
                Log.i(TAG, "Fence was successfully registered.");
            } else {
                Log.e(TAG, "Fence could not be registered: " + status);
            }
        }
    });

当栅栏在日出时评估为 TRUE 时,以及在日出后 5 分钟评估回 FALSE 时,您将收到回调。

请查看Fence API 代码片段文档以了解如何添加您的自定义应用程序逻辑。

于 2017-09-01T02:33:31.823 回答