0

我在用

NSString *url_string = [NSString stringWithFormat:@"https://graph.facebook.com/oauth/authorize?client_id=%@&redirect_uri=%@&scope=%@&type=user_agent&display=touch", facebookClientID, redirectUri, extended_permissions];

这个 URL 在FbGraph.m文件中用于访问令牌,在 2013 年 10 月之前我在这里得到它

- (void)webViewDidFinishLoad:(UIWebView *)_webView {

    //get the url string

    NSString *url_string = [((_webView.request).URL) absoluteString];

    //looking for "access_token="

    NSRange access_token_range = [url_string rangeOfString:@"access_token="];

但现在我无法得到它。

请建议我

谢谢

4

2 回答 2

1

尝试这个

-(void)webViewDidFinishLoad:(UIWebView *)_webView {


if (!appDelegate.fbviewcancelled) {

    /**
     * Since there's some server side redirecting involved, this method/function will be called several times
     * we're only interested when we see a url like:  http://www.facebook.com/connect/login_success.html#access_token=..........
     */

    NSString *url_string = [((_webView.request).URL) absoluteString];
    NSLog(@"the data url=%@",url_string);


    //looking for "access_token="
    NSRange access_token_range = [url_string rangeOfString:@"access_token="];

    //looking for "error_reason=user_denied"
    NSRange cancel_range = [url_string rangeOfString:@"error_reason=user_denied"];

    //it exists?  coolio, we have a token, now let's parse it out....
    if (access_token_range.length > 0) {

        //we want everything after the 'access_token=' thus the position where it starts + it's length
        int from_index = access_token_range.location + access_token_range.length;
        NSString *access_token = [url_string substringFromIndex:from_index];

        //finally we have to url decode the access token
        access_token = [access_token stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        //remove everything '&' (inclusive) onward...
        NSRange period_range = [access_token rangeOfString:@"&"];

        //move beyond the .
        access_token = [access_token substringToIndex:period_range.location];

        //store our request token....
        self.accessToken = access_token;
        //store accesstoken from here...
        NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
        [defaults setObject:@"linked" forKey:@"facebookstatus"];
        [defaults setObject:self.accessToken forKey:@"facebookatoken"];

        NSLog(@"NSUser Defulats updated.. facebookstatus=%@ and facebookatoken=%@",[defaults objectForKey:@"facebookstatus"],[defaults objectForKey:@"facebookatoken"]);


        //remove our window
        UIWindow* window = [UIApplication sharedApplication].keyWindow;
        if (!window) {
            window = [[UIApplication sharedApplication].windows objectAtIndex:0];
        }

        [self.webView removeFromSuperview];

        //tell our callback function that we're done logging in :)
        if ( (callbackObject != nil) && (callbackSelector != nil) ) {
            [callbackObject performSelector:callbackSelector];
        }

        //the user pressed cancel
    } else if (cancel_range.length > 0) {
        //remove our window
        UIWindow* window = [UIApplication sharedApplication].keyWindow;
        if (!window) {
            window = [[UIApplication sharedApplication].windows objectAtIndex:0];
        }

        [self.webView removeFromSuperview];

        //tell our callback function that we're done logging in :)
        if ( (callbackObject != nil) && (callbackSelector != nil) ) {
            [callbackObject performSelector:callbackSelector];
        }
    }
}
}
于 2013-10-08T11:48:32.147 回答
0

添加剪切代码webViewDidFinishLoad并粘贴shouldStartLoadWithRequest其中是UIWebView委托方法:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
   // code from webViewDidFinishLoad
}

注意:这对我有用。

于 2013-11-16T04:04:27.553 回答