ios - 向应用程序发送静默推送通知,更新位置并在后台发送到服务器

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

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

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

- (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 会批准吗,这是否可能以及位置背景提取的位置。

提前致谢。

最佳答案

下面是您可以做些什么来给您一个想法的简要概述。它假设有一个模型类作为单例实现,并且有一些伪代码。

// 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 支持。

关于ios - 向应用程序发送静默推送通知,更新位置并在后台发送到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32636893/

相关文章:

ios - 生成歌曲建议(自动完成)

iOS:当用户向下拖动时拉伸(stretch)/调整 UITableView 标题大小?

ios - PhoneGap 推送插件不注册 iOS 8 设备

ios - 后台推送适用于 iOS7 但不适用于 iOS8

android - 如何使用 phonegap 推送插件通知状态栏

ios - 新的 iPad 布局,但保持 iPhone 大小类布局相同

ios - 当前页面的 UIPageControl 点大小

ios - 在 Swift/iOS 中从 UITableView 删除行并从 NSUserDefaults 更新数组的正确方法

objective-c - 使用 SpriteKit 的 TextureAtlas 并通过 Xcode 命令行构建时,iOS 应用程序崩溃

iphone - 是否可以在 UITableView 上使用其他 UIControl?