首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSURLSessionDownloadTask中的错误

NSURLSessionDownloadTask中的错误
EN

Stack Overflow用户
提问于 2014-05-13 19:53:46
回答 2查看 1.9K关注 0票数 0

我试图在后台更新用户的位置,即使应用程序在后台,所以我调用以下php脚本来触发位置更新:

代码语言:javascript
复制
-(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 support。

EN

回答 2

Stack Overflow用户

发布于 2014-05-13 23:21:42

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

代码语言:javascript
复制
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来确认这一点

代码语言:javascript
复制
NSURL *url = [NSURL URLWithString:insertUrlString];
NSAssert(url, @"problem instantiating NSURL: %@", insertUrlString);

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

代码语言:javascript
复制
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);

其中:

代码语言:javascript
复制
- (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:@"+"];
}
票数 1
EN

Stack Overflow用户

发布于 2016-08-30 19:14:12

这里有一个更简单的解决方案

代码语言:javascript
复制
 NSURL *url = [NSURL URLWithString: [[yourURLinString
 stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]
 stringByTrimmingCharactersInSet:[NSCharacterSet
 whitespaceAndNewlineCharacterSet]]];

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23630541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档