OAuthTwitterEngine integration?

I successfully added SA_OAuthTwitterEngine in my app but I got a very strange issue. When I login in to Twitter my app will crash in:

- (void) OAuthTwitterController: (SA_OAuthTwitterController *) controller authenticatedWithUsername: (NSString *) username 
{
    [_engine sendUpdate:[NSString stringWithFormat:@"This Tweet for testing!"]];
    NSLog(@"Authenicated for %@", username);
}

The app crashes on [_engine sendUpdate:[NSString stringWithFormat:@"This Tweet for testing!"]]; . If I use [_engine sendUpdate:nil]; instead then it will work without crash but tweet cannot be sent from my account.

When I am trying to trace on sendUpdate method then I got actual problem on [theRequest prepare]; statement in following function,

- (NSString *)_sendRequestWithMethod:(NSString *)method path:(NSString *)path queryParameters:(NSDictionary *)params body:(NSString *)body requestType:(MGTwitterRequestType)requestType responseType:(MGTwitterResponseType)responseType
{
    NSString *fullPath = path;
    NSString *urlString = [NSString stringWithFormat:@"%@://%@/%@", (_secureConnection) ? @"https" : @"http", _APIDomain, fullPath];
    NSURL *finalURL = [NSURL URLWithString:urlString];
    if (!finalURL) {
        return nil;
    }
OAMutableURLRequest *theRequest = [[OAMutableURLRequest alloc] initWithURL:finalURL consumer:self.consumer  token:_accessToken realm: nil signatureProvider:nil];
    if (method) {
        [theRequest setHTTPMethod:method];
    }
    [theRequest setHTTPShouldHandleCookies:NO];

    // Set headers for client information, for tracking purposes at Twitter.
    [theRequest setValue:_clientName    forHTTPHeaderField:@"X-Twitter-Client"];
    [theRequest setValue:_clientVersion forHTTPHeaderField:@"X-Twitter-Client-Version"];
    [theRequest setValue:_clientURL     forHTTPHeaderField:@"X-Twitter-Client-URL"];

    // Set the request body if this is a POST request.
    BOOL isPOST = (method && [method isEqualToString:@"POST"]);
    if (isPOST) {
        // Set request body, if specified (hopefully so), with 'source' parameter if appropriate.
        NSString *finalBody = @"";
        if (body) {
            finalBody = [finalBody stringByAppendingString:body];
        }
        if (_clientSourceToken) {
            finalBody = [finalBody stringByAppendingString:[NSString stringWithFormat:@"%@source=%@", (body) ? @"&" : @"?" , _clientSourceToken]];
        }

        if (finalBody) {
            [theRequest setHTTPBody:[finalBody dataUsingEncoding:NSUTF8StringEncoding]];
        }
    }
    [theRequest prepare];

    // Create a connection using this request, with the default timeout and caching policy, 
    // and appropriate Twitter request and response types for parsing and error reporting.
    MGTwitterHTTPURLConnection *connection;
    connection = [[MGTwitterHTTPURLConnection alloc] initWithRequest:theRequest delegate:self requestType:requestType responseType:responseType];

    if (!connection) {
        return nil;
    } else {
        [_connections setObject:connection forKey:[connection identifier]];
    }

    return [connection identifier];
}

The crash report is,

0  0x01f023ef in CFRelease ()
1  0x0008d04c in -[OAMutableURLRequest URLEncodedString:] (self=0x7bc673b0,       _cmd=0x9ee5f, string=0x0) at /Users/ben/Dropbox/Dev/External Projects/Twitter-OAuth-iPhone/OAuthConsumeriPhoneLib/OAuthConsumerSrc/OAMutableURLRequest.m:287
2  0x0008bbe3 in -[OAMutableURLRequest prepare] (self=0x7bc673b0, _cmd=0x978cc) at /Users/ben/Dropbox/Dev/External Projects/Twitter-OAuth-iPhone/OAuthConsumeriPhoneLib/OAuthConsumerSrc/OAMutableURLRequest.m:131
3  0x00088460 in -[SA_OAuthTwitterEngine _sendRequestWithMethod:path:queryParameters:body:requestType:responseType:] (_cmd=0x96833, method=0xc0250, body=0x7b971210, requestType=<value temporarily unavailable, due to optimizations>) at SA_OAuthTwitterEngine.m:315

4  0x0007f673 in -[MGTwitterEngine sendUpdate:inReplyTo:] (self=<value temporarily unavailable, due to optimizations>, _cmd=0x96914, updateID=2073243024) at MGTwitterEngine.m:1019

5  0x0007f496 in -[MGTwitterEngine sendUpdate:] (self=0x7b932d90, _cmd=0x95e02, status=0xc0510) at MGTwitterEngine.m:995

6  0x0007bf3f in -[DMUAppDelegate OAuthTwitterController:authenticatedWithUsername:] (self=0x7b918a20, _cmd=0x96152) at DMUAppDelegate.m:572

7  0x0008503b in -[SA_OAuthTwitterController gotPin:] (_cmd=0x975b4, pin=0x7ae573e0) at SA_OAuthTwitterController.m:125

8  0x00086137 in -[SA_OAuthTwitterController webViewDidFinishLoad:] (self=0x7b944a00, _cmd=0xf070e2, webView=0x7ae46750) at SA_OAuthTwitterController.m:224

9  0x00be036a in -[UIWebView webView:didFinishLoadForFrame:] ()

10 0x00be1956 in -[UIWebViewWebViewDelegate webView:didFinishLoadForFrame:] ()

11 0x01f5c51d in __invoking___ ()

12 0x01f5c437 in -[NSInvocation invoke] ()

13 0x01f8749a in -[NSInvocation invokeWithTarget:] ()

14 0x03462aff in -[_WebSafeForwarder forwardInvocation:] ()
15 0x01f5d0c9 in ___forwarding___ ()
16 0x01f5cce2 in __forwarding_prep_0___ ()

17 0x01f5c51d in __invoking___ ()
18 0x01f5c437 in -[NSInvocation invoke] ()

19 0x04005ae3 in SendMessage ()
20 0x04006115 in HandleDelegateSource ()

21 0x01fca97f in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ ()
22 0x01f2db73 in __CFRunLoopDoSources0 ()
23 0x01f2d454 in __CFRunLoopRun ()
24 0x01f2cdb4 in CFRunLoopRunSpecific ()
25 0x01f2cccb in CFRunLoopRunInMode ()
26 0x01e60879 in GSEventRunModal ()
27 0x01e6093e in GSEventRun ()

28 0x00a29a9b in UIApplicationMain ()
29 0x00040296 in main (argc=1, argv=0xc003c604) at /Users/dhirenshah/Desktop/Projects/Projects/DMU/DMU/main.m:16
(gdb) 

Yes, at last i solve my problem. i Just replacing code,

- (SA_OAuthTwitterEngine *) initOAuthWithDelegate: (NSObject *) delegate 
  {

    if (self = (id) [super initWithDelegate: delegate]) {
       self.requestTokenURL = [NSURL URLWithString: @"https://twitter.com/oauth/request_token"];
       self.accessTokenURL = [NSURL URLWithString: @"https://twitter.com/oauth/access_token"];
       self.authorizeURL = [NSURL URLWithString: @"https://twitter.com/oauth/authorize"];
     }
  return self;
}

Modifying SA_OAuthTwitterEngine.m function. I got help from MGTwitterEngine crash in iOS5, this link.


I'm running iOS 6.1.3 and my device for testing is iPhone 4s. I got the same error/crash that xcode pointed the crash to [theRequest prepare]; method.

My fixed was:

        OAMutableURLRequest *theRequest = [[[OAMutableURLRequest alloc]         
                 initWithURL:finalURL
                 consumer:self.consumer
                 token:_accessToken
                 realm: nil
                 signatureProvider:nil] autorelease];

putting the autorelease on this line and checking again [_engine isAuthorized] before posting tweet:

        if ([_engine isAuthorized])
        {
             NSLog(@"post Tweet");
             . . . . . .
        } else {
             NSLog(@"cant post Tweet");
             . . . . . .
        }

I can't expalin further more, since i'm not yet familiar with this but this works for me.


I have made changes in the above code, because twitter api have been changed so the old one will not work.

And for any new users if they are using the above format with MGTwitterEnginer, it will not work, you will need to replace

self.requestTokenURL = [NSURL URLWithString: @"https://api.twitter.com/oauth/request_token"]; self.accessTokenURL = [NSURL URLWithString: @"https://api.twitter.com/oauth/access_token"]; self.authorizeURL = [NSURL URLWithString: @"https://api.twitter.com/oauth/authorize"];

链接地址: http://www.djcxy.com/p/59588.html

上一篇: 自动比较单个单元测试的Java分析结果

下一篇: OAuthTwitterEngine集成?