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

Ios 如何触发应用程序通过REST服务获取数据?,ios,rest,mobile,Ios,Rest,Mobile,我正在寻找一种触发应用程序从远程REST服务获取数据的方法。这种方法不需要轮询 iOS推送通知似乎不是一个选项,因为用户可以停用它。然而,我可能错了 是否有最佳实践来完成此任务?从restful服务获取数据 嘿@schole,这可以通过很多方式来完成1NSURLRequest:通过对NSURLRequest进行网络调用并确认NSURLConnetionElegate协议方法。然后序列化JSON响应。在NSURLConnectiondReceiveData方法中 NSError *error =

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

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


是否有最佳实践来完成此任务?

从restful服务获取数据

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

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早期,背景获取是不可能的。随着时间的推移,苹果已经放松了一点,但最终他们希望应用程序是低能耗的软件,能够执行重点任务

我相信苹果是在iOS5或iOS6上推出了一项增强功能,让用户使用最多的应用程序能够保持更长的运行时间。此外,如果应用程序执行后台提取(对于用户使用最多的应用程序),则系统可以更新多任务转盘中应用程序的预览

需要定期检查新内容的应用程序可以询问 系统来唤醒它们,以便它们可以为 那就是内容。要支持此模式,请启用后台提取选项 从“功能”选项卡的“后台模式”部分 Xcode项目。(您还可以通过包括 UIBackgroundModes键和应用程序Info.plist中的fetch值 启用此模式并不能保证系统将提供 您的应用程序可以随时执行后台抓取。系统必须 平衡您的应用程序获取内容的需要与其他应用程序的需要 以及系统本身。在评估了这些信息之后,系统 当有很好的机会时,为应用程序留出时间


查看以了解如何使用beginBackgroundTaskWithName:expirationHandler:

实现后台抓取,因为您不能使用轮询或套接字,并且我假设无法预测事件时间,我想您最好使用通知并经常警告用户启用它们,应用程序应该处理通知可能未启用的事实


如果抓取对应用程序至关重要,我不会放弃轮询,我会使用前一种方法的通知,如果它们被禁用,我会返回轮询。

实际上推送通知是一种方法

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

:

用户的通知设置仅控制系统是否 在屏幕上显示本地或远程通知不考虑 通知设置、本地和远程通知将传递到 在适当的时间启动应用程序


您是否可以订阅用户事件?假设该应用程序是一个简单的消息应用程序,因此用户a发送消息(通过将其上载到服务器),那么用户B必须调用REST服务来下载消息。因此,用户事件将是“MessageSend”。因为我没有套接字连接(如果我愿意的话,那么很清楚如何解决这个问题),所以我看不到有发布/订阅模式的方法。你有Restfull web API吗?你想构建聊天应用程序吗?这个问题实在太广泛了,无法给出答案,尤其是在不了解您试图在应用程序中构建的功能和行为的完整上下文的情况下。但归根结底,关于如何将数据更新到应用程序中,您实际上只有两个选择。您必须将数据推送到应用程序中(由于对应用程序背景的担忧,这类移动应用程序必然需要依赖操作系统/环境提供的功能),或者必须从远程服务(轮询)中提取信息。谢谢,无论最终用户如何配置通知设置,应用程序都会收到推送通知,这是我需要的提示…欢迎@Scholle。请记住,这是为iOS 8及更高版本设计的!