2015-05-09 5 views
0

Я создаю приложение вокруг API Feedly. Так, в UIWebView используется для входа в систему, я использую следующий код:Segue не работает?

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 
    NSString *URLString = [[request URL] absoluteString]; 

    NSString *urlStart = [URLString substringToIndex:23]; 

    if ([urlStart isEqualToString:@"http://localhost/?code="]) 
    { 
     NSString *haystack = request.URL.absoluteString; 
     [self useURL:haystack]; 
    } 

    return YES; 
} 

Как вы можете видеть, это вызывает метод useURL:

- (void)useURL:(NSString *)haystack { 
    NSString *prefix = @"http://localhost/?code="; 
    NSString *suffix = @"&state=";suffix! 
    NSRange needleRange = NSMakeRange(prefix.length, 
           haystack.length - prefix.length - suffix.length); 
    NSString *needle = [haystack substringWithRange:needleRange]; 
    NSLog(@"needle: %@", needle); 

    NSString *valueToSave = needle; 
    [[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"AuthCode"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 

    NSString *client_id = @"id"; 
    NSString *client_secret = @"secret"; 
    NSString *redirect_uri = @"http://localhost"; 
    NSString *state = @""; 
    NSString *grant_type = @"authorization_code"; 

    NSInteger success = 0; 
    @try { 
     NSString *post =[[NSString alloc] initWithFormat:@"code=%@&client_id=%@&client_secret=%@&redirect_uri=%@&state=%@&grant_type=%@",needle,client_id,client_secret,redirect_uri,state,grant_type]; 
     NSLog(@"PostData: %@",post); 

     NSURL *url=[NSURL URLWithString:@"https://cloud.feedly.com/v3/auth/token"]; 

     NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 

     NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]]; 

     NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
     [request setURL:url]; 
     [request setHTTPMethod:@"POST"]; 
     [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
     [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
     [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
     [request setHTTPBody:postData]; 

     //[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[url host]]; 

     NSError *error = [[NSError alloc] init]; 
     NSHTTPURLResponse *response = nil; 
     NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

     NSLog(@"Response code: %ld", (long)[response statusCode]); 

     if ([response statusCode] >= 200 && [response statusCode] < 300) 
     { 
      NSString *responseData = [[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding]; 
      NSLog(@"Response ==> %@", responseData); 

      NSError *error = nil; 
      NSDictionary *jsonData = [NSJSONSerialization 
           JSONObjectWithData:urlData 
           options:NSJSONReadingMutableContainers 
           error:&error]; 

      NSString *accessToken = jsonData[@"access_token"]; 
      NSString *refreshToken = jsonData[@"refresh_token"]; 

      //[self performSegueWithIdentifier:@"presentNewView" sender:self]; 
      NewViewController *newView = [[NewViewController alloc] init]; 
      [self presentViewController:newView animated:NO completion:nil]; 
     } else { 
      NSLog(@"Failed."); 
     } 
    } 
    @catch (NSException * e) { 
     NSLog(@"Exception: %@", e); 
    } 
} 

Большинство из них штраф в размере до работы до той части, где следующий взгляд должен прийти. Я пробовал это с помощью segue, и я пробовал путь, как здесь видно, но оба продолжают бросать Exception: *** -[NSURL initFileURLWithPath:]: nil string parameter

Что я здесь делаю неправильно?

+0

где происходит эта ошибка? какая линия? – luk2302

+0

@ luk2302 Я не получаю строку, но когда комментирую segue и/или 'presentViewController', я не получаю ошибку. – user4486205

+0

Вызывается ли initFileURLWithPath из вашего NewViewController? Если это так, возможно, вы не передаете строку URL-адреса, прежде чем пытаться ее представить. – Gismay

ответ

0

Как указано в сообщении об ошибке, у вас есть строка nil. Вы можете использовать точки останова внутри класса и LLDB для печати значения указанной строки на протяжении всего жизненного цикла, используя po stringName в отладчике. Найдите, где он теряет ценность, и у вас есть ответ. Вот некоторые полезные ссылки, которые помогут вам сделать это быстро, если вы новичок в LLDB или контрольные точки:

Breakpoints Guide

LLDB Commands

Если вы более комфортно с помощью NSLog, размещая их в объектах жизненный цикл может быть полезен, но я бы пошел с первой рекомендацией.

Смежные вопросы