使用CLLocation进行AFNetworking会出错

时间:2016-09-19 06:17:04

标签: ios objective-c cllocationmanager cllocation afnetworking-3

我正在使用AFNetworking 3.0和CLLocation for weather app。

当我点击按钮时,API必须随位置更新。但它在更新位置后给我错误。

我正在使用世界天气 api来获取天气详情。

错误是,

  

错误Domain = com.alamofire.error.serialization.response Code = -1011   "请求失败:禁止(403)"   UserInfo = {com.alamofire.serialization.response.error.response = {URL:   http://api.worldweatheronline.com/free/v1/weather.ashx?format=json&key=1b8c4f157aec499cba0120254161609&num_of_days=5&q=19.017615%2C72.856164} {状态代码:403,headers {       "访问控制允许来源" =" *&#34 ;;       年龄= 0;       "缓存控制" =" public,max-age = 120&#34 ;;       连接="保持活力&#34 ;;       "内容编码" = gzip;       " Content-Length的" = 96;       "内容类型" =" application / json;字符集= UTF-8&#34 ;;       日期="星期一,2016年9月19日05:53:12 GMT&#34 ;;       Expires =" Mon,2016年9月19日05:55:13 GMT&#34 ;;       Vary =" Accept-Encoding&#34 ;;       Via = WebCelerate;       " X - 高速缓存" = MISS;       " X供电-通过" =" ASP.NET&#34 ;;       " X-Webcelerate" =" WebCelerate - www.ukfast.co.uk/web-acceleration.html" ;;       " X-节点" =" zfdl_api_01&#34 ;;       "访问控制 - 允许报头" ="内容类型&#34 ;; ,NSErrorFailingURLKey = http://api.worldweatheronline.com/free/v1/weather.ashx?format=json&key=1b8c4f157aec499cba0120254161609&num_of_days=5&q=19.017615%2C72.856164,   com.alamofire.serialization.response.error.data =< 7b202264 61746122   3a207b20 22657272 6f72223a 205b207b 226d7367 223a2022 41504920   6b657920 646f6573 206e6f74 20686176 65206163 63657373 20746f20   74686520 7265736f 75726365 2e22207d 205d207d 7d>,   NSLocalizedDescription =请求失败:禁止(403)}

我已经在网上引用了所有文章,但找不到合适的答案。

我有一些方法可以执行此功能,

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{NSLog(@"location updated");
    // Last object contains the most recent location
    CLLocation *newLocation = [locations lastObject];

    // If the location is more than 5 minutes old, ignore it
    if([newLocation.timestamp timeIntervalSinceNow] > 300)
        return;

    [self.locationManager stopUpdatingLocation];

    WeatherHTTPClient *client = [WeatherHTTPClient sharedWeatherHTTPClient];
    client.delegate = self;
    [client updateWeatherAtLocation:newLocation forNumberOfDays:5];
}

- (void)weatherHTTPClient:(WeatherHTTPClient *)client didUpdateWithWeather:(id)weather
{
    self.weather = weather;
    self.title = @"API Updated";
    [self.tableView reloadData];
    NSLog(@"API updated");
}

- (void)weatherHTTPClient:(WeatherHTTPClient *)client didFailWithError:(NSError *)error
{
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error Retrieving Weather"
                                                        message:[NSString stringWithFormat:@"%@",error]
                                                       delegate:nil
                                              cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alertView show];
    NSLog(@"error - %@", error);
}

当我点击名为API的按钮时,此方法调用。并更新位置并在tableview中提供数据。但它不起作用。

按钮方法是:

- (IBAction)apiTapped:(id)sender
{
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate=self;
    self.locationManager.desiredAccuracy=kCLLocationAccuracyBest;
    self.locationManager.distanceFilter=kCLDistanceFilterNone;
    [self.locationManager requestWhenInUseAuthorization];
    [self.locationManager startMonitoringSignificantLocationChanges];
    [self.locationManager startUpdatingLocation];
    NSLog(@"apiTapped");
}

我将此教程用于AFNetworking演示,

https://www.raywenderlich.com/59255/afnetworking-2-0-tutorial

根据该教程,AFNetworking 2.0中的所有内容都可以正常使用,但不适合我。

那么我的代码中的问题是什么?

2 个答案:

答案 0 :(得分:1)

您的客户收到了DATE,表示

  

请求是有效请求,但服务器拒绝响应   它。用户可能已登录但没有必要   资源的权限。

请检查您的授权状态。有关详情,请查看链接https://en.wikipedia.org/wiki/HTTP_403

答案 1 :(得分:1)

我已经解决了这个问题。

问题在于访问权限。我在免费用户的世界天气帐户。和api url是,

  

http://api.worldweatheronline.com/free/v1/

因此,通过免费帐户,他们无法提供对api的访问权限。

我将网址更改为,

  

http://api.worldweatheronline.com/premium/v1/

所以现在他们允许访问api,错误现在已经消失。