【问题标题】:Send silent push notification to app, update location and send to server in background向应用程序发送静默推送通知,更新位置并在后台发送到服务器
【发布时间】:2015-09-17 17:54:11
【问题描述】:

我想向后台应用程序发送静默推送通知,然后获取当前用户位置并将其发送到 Web 服务。

我实现了推送通知方法以及这两个方法:

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSDate *fetchStart = [NSDate date];

    [self sendLocationToServerWithCompletionHandler:^(UIBackgroundFetchResult result) {
        completionHandler(result);

        NSDate *fetchEnd = [NSDate date];
        NSTimeInterval timeElapsed = [fetchEnd timeIntervalSinceDate:fetchStart];
        NSLog(@"Background Fetch Duration: %f seconds", timeElapsed);

    }];
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{

}

我还创建了一个将位置发送到服务器的方法:

- (void)sendLocationToServerWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSDictionary *params = @{
                             @"UserId"      : self.userId,
                             @"Latitude"    : self.latitude,
                             @"Longitude"   : self.longitude
                             }

    ServerManager *manager = [ServerManager sharedManager];
    [manager sendLocationToServerWithCompletion:^(BOOL success) {

        if (success)
        {
            completionHandler(UIBackgroundFetchResultNewData);
        }
        else
        {
            completionHandler(UIBackgroundFetchResultFailed);
        }

    }];
}

我只是不明白它们是如何协同工作的,Apple 是否会批准,是否可能以及位置背景提取进入何处。

提前致谢。

【问题讨论】:

  • 是的,它可能,而且我在应用商店中有一个应用程序正是这样做的,所以是的,Apple 会批准它。但除此之外,尚不清楚您的实际问题是什么。您已经展示了两个完全不同的小段代码,它们彼此之间没有任何关系。您是否要求人们为您完成您的计划?
  • 不,当然不是,我是在请人指导我怎么做,给我看一个教程,如何将我想要的三个后台任务组合在一起,因为我真的很困惑和不知道怎么做。谢谢你的回答。

标签: ios objective-c push-notification background-task background-fetch


【解决方案1】:

这里简要介绍了您可以做些什么来给您一个想法。它假设有一个模型类实现为单例并且有一些伪代码。

// App delegate
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    completionHandler(UIBackgroundFetchResultNewData);
    [[YourModel singleton] pushNotificationReceived: userInfo];
}

// Model
- (void)  pushNotificationReceived:(NSDictionary *) userInfo
{
    [self registerBackgroundTaskHandler];
    get the location here, or start getting the location
    [self sendLocationToServerWithCompletionHandler: your completion handler];
}


- (void) registerBackgroundTaskHandler
{
    __block UIApplication *app = [UIApplication sharedApplication];
    self.backgroundTaskId = [app beginBackgroundTaskWithExpirationHandler:^{
        DDLogInfo(@"BACKGROUND  Background task expiration handler called");
        [app endBackgroundTask:self.backgroundTaskId];
        self.backgroundTaskId = 0;
    }];
}


- (void) endBackgroundTask
{
    if (self.backgroundTaskId)
    {
        UIApplication *app = [UIApplication sharedApplication];
        [app endBackgroundTask:self.backgroundTaskId];
        self.backgroundTaskId = 0;
    }
}

您需要先获取位置,然后才能发送。如果您只是获得一个位置并且您使用的是 iOS9,则可以使用 CLLocationManager:requestLocation: 并且您可以相对轻松地将其放入我所说的“在这里获取位置”。

如果您没有使用 iOS 9(requestLocation 是 iOS 9 的新功能),它会稍微复杂一些。 如何使用位置管理器本身就是一个主题,此处发布的代码太多。在合并之前,您需要阅读和研究有关使用位置管理器的所有信息。 如果您需要位置更新流,它会变得更加复杂,并且它所说的“或开始获取位置”涉及更多内容,然后隐含在伪代码中。

我的建议是,从 iOS9 开始并获取一个位置实例,然后当它工作时,如果需要,添加更多功能或 iOS8 支持。

【讨论】:

  • 嗯,我的问题是我使用的是iOS6到IOS9,所以我需要支持所有这些版本的定位服务,但没关系,我知道该怎么做。我只需要获取一次位置并将其发送到服务器 - 就是这样。我的问题是位置、推送和发送到服务器,但我将创建一个新项目并在明天开始处理它。非常感谢!
  • 不幸的是,如果您立即需要该位置,则整个方法存在问题。从 iOS 6 到 8.1 都可以。但是从 iOS 8.2 开始,Apple 进行了更改,结果是很多时候您的静默推送不会及时交付给您的应用程序,有时会,但通常可能会延迟几个小时。你无法解决这个问题。 (如果您进行实验来检查这一点,请确保您的 iPhone 没有插入任何类型的电缆,包括通过 USB 连接到 Xcode)
  • 这是为什么呢?他们做了哪些改变?
  • 它是为了省电,但他们似乎做得不好,即使设备100%充电,推送通常也会延迟几个小时。我还没有尝试过 iOS 9,但是如果你需要你的应用程序快速获取它,那么在 iOS8 中,静默推送完全无法使用。
猜你喜欢
  • 2022-01-10
  • 1970-01-01
  • 2018-02-17
  • 2015-08-25
  • 2017-08-24
  • 2018-08-15
  • 2012-09-10
  • 2015-01-14
  • 1970-01-01
相关资源
最近更新 更多