【发布时间】:2014-04-17 20:58:14
【问题描述】:
如何在不强制用户打开应用的情况下设置本地通知。 我需要我的应用程序为日出和日落设置本地通知,但我不想要求人们打开应用程序。 我知道我可以通过 scheduleLocalNotification 获得最多 64 条通知,但我需要将其设置为一年,这样我才能在后台运行应用程序并在后台为未来的日出和日落设置警报。
【问题讨论】:
标签: ios cocoa-touch localnotification
如何在不强制用户打开应用的情况下设置本地通知。 我需要我的应用程序为日出和日落设置本地通知,但我不想要求人们打开应用程序。 我知道我可以通过 scheduleLocalNotification 获得最多 64 条通知,但我需要将其设置为一年,这样我才能在后台运行应用程序并在后台为未来的日出和日落设置警报。
【问题讨论】:
标签: ios cocoa-touch localnotification
简单的答案是你不能。您的应用程序无法随时在后台运行;它无法安排一个计时器来唤醒自己以在到期时发布更多通知。
您可以接近这种情况的唯一方法是让服务器在需要发布新一批 64 条通知时向您的应用发送后台推送通知作为唤醒电话。 但是,这将取决于用户不会终止您的应用这一事实。如果用户这样做了,那么您必须向用户发送非后台推送通知,并希望他们点击它来启动您的应用。
【讨论】:
Android Awareness API 具有 recently announced 新功能,可为您的用例提供简单的解决方案(避免您必须明确管理位置请求或计算日出时间)。实现您想要做的事情的方法是创建并注册一个相对于日出/日落指定的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 code snippets 文档了解如何添加您的自定义应用逻辑。
【讨论】: