当前时间等于日出时间甚至在后台应用时触发警报

时间:2012-10-16 09:40:13

标签: iphone ios xcode

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

例如: 如果当前位置是旧金山,则日出时间和日落时间是旧金山的。直到这一点,我成功了。 但是如果当前时间等于日出时间,即使我的应用程序处于后台,我也想每天触发警报。

我已经搜索了很多方法,但连一个人都不满意。我是iOS开发的新手。

在终止应用程序之前,

applicationDidEnterBackground方法会运行一段时间。

2 个答案:

答案 0 :(得分: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
}

刚刚为您找到了一篇文章:Setting a reminder using UILocalNotification in iOS 4. Objective-C.另请查看:Executing code in background +schedule alarm on date

答案 1 :(得分:0)

recently announced具有Fence API code snippets个新功能,可为您的用例提供简单的解决方案。实现您要做的事情的方法是创建并注册相对于日出/日落指定的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时,您将收到回调。

请查看{{3}}个文档,了解如何添加自定义应用逻辑。