【问题标题】:Error in NSURLSessionDownloadTaskNSURLSessionDownloadTask 中的错误
【发布时间】:2014-05-13 11:53:46
【问题描述】:

即使应用程序在后台,我也在尝试更新用户在后台的位置,因此我触发了调用以下 php 脚本的位置更新:

-(void)locateUserAtLocation:(CLLocation*)location{
NSDictionary* dict=[self getCurrentAppAndUrlDictionary];
NSString* app=[dict objectForKey:@"app"];
float latitude=location.coordinate.latitude;
float longitude=location.coordinate.longitude;
NSString* language=[[NSLocale currentLocale] localeIdentifier];
NSString* nickName=[[NSUserDefaults standardUserDefaults] objectForKey:@"nickname"];
NSString* myUdid= [udid sharedUdid];
NSString *insertUrlString =[NSString stringWithFormat: @"http://www.miafoto.it/iPhone/inarrivo/taxi/insertUserNew.php?udid=%@&token=%@&nickname=%@&app=%@&language=%@&Latitude=%f&Longitude=%f&new=1",myUdid, token, nickName, app, language, latitude, longitude];
NSLog(@"url=%@", insertUrlString);

 NSURLSessionDownloadTask *insertTask = [[self backgroundSession] downloadTaskWithURL:    [NSURL URLWithString:insertUrlString]];
[insertTask resume];
}

但我得到错误: 后台下载的 URL 方案无效:(null)。有效的方案是 http 或 http 并且在前台或后台都没有发送 url。我在网上搜索我发现没有解决这个问题的命中。我还将问题提交给 Apple 支持。

【问题讨论】:

  • 顺便说一句,虽然问题可能出在 URL 上,但顺便说一句,我原以为您想创建一个 POST 请求(该请求是为提交数据以供 Web 处理时设计的服务)。此外,如果您在未来某个日期切换到 https,这将使 udid、令牌等比GET 请求更安全。
  • 是的,当然。我被错误信息欺骗了。现在它起作用了,但我发现了一个有趣的方面。似乎只有在连接到 wifi 时才会发送 url,而不是在蜂窝连接时发送,尽管我显然设置了:configuration.allowsCellularAccess = YES;在后台会话配置中。

标签: xcode ios7.1 nsurlsessiondownloadtask


【解决方案1】:

您可能有一些保留字符阻止NSURL 对象正确实例化,即URLWithString 可能返回nil

NSString *insertUrlString =[NSString stringWithFormat: @"http://www.miafoto.it/iPhone/inarrivo/taxi/insertUserNew.php?udid=%@&token=%@&nickname=%@&app=%@&language=%@&Latitude=%f&Longitude=%f&new=1",myUdid, token, nickName, app, language, latitude, longitude];

您可以通过查看NSURL 来确认这一点:

NSURL *url = [NSURL URLWithString:insertUrlString];
NSAssert(url, @"problem instantiating NSURL: %@", insertUrlString);

这些字符串中是否有空格或其他保留字符?百分比转义这些值总是更安全。就个人而言,我将参数添加到字典中,然后有一个函数可以百分比转义值,例如:

NSDictionary *parameters = @{@"udid"      : myUdid,
                             @"token"     : token,
                             @"nickname"  : nickName,
                             @"app"       : app,
                             @"language"  : language,
                             @"Latitude"  : @(latitude),
                             @"Longitude" : @(longitude),
                             @"new"       : @"1"};

NSString *insertUrlString = [NSString stringWithFormat: @"http://www.miafoto.it/iPhone/inarrivo/taxi/insertUserNew.php?%@", [self encodeParameters:parameters]];

NSURL *url = [NSURL URLWithString:insertUrlString];
NSAssert(url, @"problem instantiating NSURL: %@", insertUrlString);

地点:

- (NSString *)encodeParameters:(NSDictionary *)parameters
{
    NSMutableArray *parameterArray = [NSMutableArray arrayWithCapacity:[parameters count]];

    for (NSString *key in parameters) {
        NSString *string;
        id value = parameters[key];

        if ([value isKindOfClass:[NSData class]]) {
            string = [[NSString alloc] initWithData:value encoding:NSUTF8StringEncoding];
        } else if ([value isKindOfClass:[NSString class]]) {
            string = value;
        } else if ([value isKindOfClass:[NSNumber class]]) {
            string = [value stringValue];
        } else {                         // if you want to handle other data types, add that here
            string = [value description];
        }
        [parameterArray addObject:[NSString stringWithFormat:@"%@=%@", key, [self percentEscapeString:string]]];
    }

    return [parameterArray componentsJoinedByString:@"&"];
}

- (NSString *)percentEscapeString:(NSString *)string
{
    NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                                                 (CFStringRef)string,
                                                                                 (CFStringRef)@" ",
                                                                                 (CFStringRef)@":/?@!$&'()*+,;=",
                                                                                 kCFStringEncodingUTF8));
    return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"];
}

【讨论】:

  • @FabrizioBartolomucci 仅供参考,有时 Web 服务对键的大小写敏感,因此您可能需要确保您的真正意思是 LatitudeLongitude 而不是 latitude 和 @987654332 @。我保留了您在问题中提供的内容,但您可能需要仔细检查这些键。
  • 谢谢,但这是我自己的 REST 服务器中的 url,所以我可以称它们为 MickeyMouse 和 DonaldDuck :-) 我的问题是当应用程序处于 wifi 覆盖时发送 url,而在蜂窝网络上则不然。尽管有会话配置。如何检查 Session 是否实际配置正确?
  • 我不知道您所说的“正确配置”是什么意思。唯一会影响 wifi v 蜂窝,AFAIK 的事情是(a)allowsCellularAccess 设置; (b) 如果您有一些自定义可达性代码根据连接类型做任何有条件的事情; (c) 您正在连接到 LAN 上无法通过 Internet 访问的某些服务器;或者 (d) 您正在使用一些非常短的超时设置,这些设置对于 LAN 来说已经足够了,但对于蜂窝网络来说是不够的。
【解决方案2】:

这里是更简单的解决方案

 NSURL *url = [NSURL URLWithString: [[yourURLinString
 stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]
 stringByTrimmingCharactersInSet:[NSCharacterSet
 whitespaceAndNewlineCharacterSet]]];

以这种方式解析您的字符串 url,它应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-12
    • 2014-06-28
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 2014-06-24
    相关资源
    最近更新 更多