升級到iOS5後ASIHttpRequest庫問題及解決方法

安迪潘發表於2011-11-03

最近iOS5出來以後,我把Xcode也更新到最新版本,執行一下以前的程式,發現很多都編譯不通過,有些專案中用到ASIHttpRequest庫,網上有高手發現這個類庫在5.0的SDK下有問題,並給出了以下解決方案

原因是這樣的:

ASIAuthenticationDialog這個內建對話方塊在網路有代理的情況下出現,然後無論點cancle或是login都不能dismiss。在4.3的SDK中完全沒問題,在5.0的SDK中就會在Console中看到輸出:

Unbalanced calls to begin/end appearance transitions for <ASIAutorotatingViewController:>

很明顯示在sdk5中, 用這個庫有問題,還有在停止調式的時候,程式會有異常產生。


於是很明顯示是SDK5的變化影響了ASIHttpRequest的正常使用。於是我要fix這個問題,經過我研究發現,dismiss不起作用是由於UIViewController的parentViewController不再返回正確值了,返回的是nil,而在SDK5中被presentingViewController取代了。於是在ASIAuthenticationDialog.m中找到+(void)dismiss這個方法並修改為:


+ (void)dismiss  
{  
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_4_3  
    UIViewController *theViewController = [sharedDialog presentingViewController];  
    [theViewController dismissModalViewControllerAnimated:YES];  
#else  
    UIViewController *theViewController = [sharedDialog parentViewController];  
    [theViewController dismissModalViewControllerAnimated:YES];  
#endif  
}

還有上面那個Console的錯誤提示,解決方法是,在ASIAuthenticationDialog.m中找到-(void)show這個方法,並把最後一行程式碼


[[self presentingController] presentModalViewController:self animated:YES];  

修改為:

UIViewController *theController = [self presentingController];  
      
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_4_3  
    SEL theSelector = NSSelectorFromString(@"presentModalViewController:animated:");  
    NSInvocation *anInvocation = [NSInvocation invocationWithMethodSignature:[[theController class] instanceMethodSignatureForSelector:theSelector]];  
      
    [anInvocation setSelector:theSelector];  
    [anInvocation setTarget:theController];  
      
    BOOL               anim = YES;  
    UIViewController   *val = self;  
    [anInvocation setArgument:&val atIndex:2];  
    [anInvocation setArgument:&anim atIndex:3];  
      
    [anInvocation performSelector:@selector(invoke) withObject:nil afterDelay:1];  
#else  
      
    [theController presentModalViewController:self animated:YES];  
#endif  

這下就可以正常執行了喲, 我的問題也解決了。關於ASIHttpRequest的其它方面,到目前為止還沒發現問題。

相關文章