如何触发应用程序通过REST服务获取数据?

我正在寻找一种方法来触发应用程序从远程REST服务获取数据。 该方法不应要求轮询。

iOS推送通知似乎不是一个选项,因为它可以被用户停用。 但是,我可能错了。

完成这项工作是否有最佳做法?

实际上推送通知是要走的路。

在ios8及更高版本中,默认情况下会启用推送通知,因为您需要此function。 您无法向用户显示某些内容(意味着不会显示包含带警报的json的推送),但您的应用程序正在获取有效负载,并且可以在收到推送后启动操作。

从文档 :

用户的通知设置仅控制系统是否在屏幕上显示本地或远程通知。 无论通知设置如何,本地和远程通知都会在适当的时间发送到您的应用程序

从宁静的服务中获取数据

嘿@Scholle,这可以通过多种方式完成
1. NSURLRequest:通过对NSURLRequest进行网络调用并确认NSURLConnetionDelegate协议方法。 然后序列化JSON响应。
在NSUrlConnectionDidReceiveData方法中

NSError *error = nil; NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:myNSData options:kNilOptions error:&error]; if (error != nil) { NSLog(@"Error parsing JSON."); } else { NSLog(@"Array: %@", jsonArray); } 

2. AFNetworking只需在您的项目中导入最新的afnetworking 3.0。 并使用以下代码进行带有参数列表的网络调用。

 - (void)requestWithURL:(NSString *)url parameterDictionary:(NSMutableDictionary *)data requestType:(NSString *)reqType handler:(NSObject *)handler selector:(SEL)selector{ // Request Type is GET or POST // handler is set to be self if we want to handle response in selector method defined in same viewController NSError *error; AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:reqType URLString:[NSString stringWithFormat:@"%@",url] parameters:nil error:nil]; req.timeoutInterval= [[[NSUserDefaults standardUserDefaults] valueForKey:@"timeoutInterval"] longValue]; [req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [req setValue:@"application/json" forHTTPHeaderField:@"Accept"]; if (data != nil) { NSLog(@"Data is not nil"); NSData *jsonData = [NSJSONSerialization dataWithJSONObject:data options:0 error:&error]; NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; [req setHTTPBody:[jsonString dataUsingEncoding:NSUTF8StringEncoding]]; }else{ NSLog(@"Data is nil"); } [[manager dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { if (!error) { // NSLog(@"Reply JSON: %@", responseObject); [handler performSelector:selector withObject:responseObject]; if ([responseObject isKindOfClass:[NSDictionary class]]) { //blah blah } } else { NSLog(@"Error: %@, %@, %@", error, response, responseObject); [handler performSelector:selector withObject:responseObject]; } }] resume]; } 

在iOS的早期,背景提取是不可能的。 随着时间的推移,Apple已经放松了一点,但最终他们希望Apps成为执行重点任务的低能耗软件。

我相信它是iOS 5或6,Apple推出了一项增强function,用户使用最多的应用程序可以保持更长时间。 如果应用程序执行后台提取(对于用户最常用的应用程序),系统也可以更新多任务轮播中的应用程序预览。

需要定期检查新内容的应用可以要求系统将其唤醒,以便他们可以启动该内容的获取操作。 要支持此模式,请从Xcode项目的Capabilities选项卡的Background modes部分启用Background fetch选项。 (您还可以通过在应用程序的Info.plist文件中包含带有提取值的UIBackgroundModes键来启用此支持。) 启用此模式并不能保证系统会随时为您的应用程序执行后台提取。 系统必须平衡您的应用程序根据其他应用程序和系统本身的需求获取内容的需求。 在评估该信息后,系统会在有良好机会的情况下为应用程序提供时间。

查看文档以了解如何使用beginBackgroundTaskWithName实现后台获取:expirationHandler:

由于你不能使用轮询和套接字,我认为无法预测事件时间,我想你能做的最好的事情是使用通知并经常警告用户启用它们,应用程序应该应对通知的事实可能没有启用。

如果提取对于应用程序是必不可少的,我不会放弃轮询,我会使用先前方法的通知,如果它们被禁用则回退到轮询。