0

アプリがバックグラウンドにあるときでも、バックオフィスでユーザーの位置を更新しようとしているので、次の 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 は送信されません。Web で検索したところ、この問題に対処するヒットは見つかりませんでした。また、問題を Apple サポートに提出しました。

4

2 に答える 2

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:@"+"];
}
于 2014-05-13T15:21:41.853 に答える