繁体   English   中英

应用程序崩溃尝试在iOS 7中加载Web视图时

[英]App Crashes When trying to load a web view in iOS 7

我正在使用swift 2.2并开发了一个具有表格视图的应用程序。 在一个特定的行上,我正在加载一个Web视图..一切看起来都很完美,并且在iOS 9上运行的ipad上运行完美。 当我尝试加载相同的应用程序并尝试在iOS 7设备上加载Web视图时,应用程序崩溃。 代码是

class AppCatalogViewController: UIViewController , UIWebViewDelegate {

var alertView = UIAlertView()

override func viewDidLoad() {
    super.viewDidLoad()
    NSLog("enetered the webView view controller")
    self.title = NSLocalizedString("mdm.agent.common.appCatalog", comment : "")
    self.view.autoresizesSubviews = true
    alertView = UIAlertView(title: NSLocalizedString("mdm.agent.common.loadingData", comment: ""), message: "", delegate: nil, cancelButtonTitle: nil, otherButtonTitles: "")
    let actInd : UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
    actInd.startAnimating()
   actInd.frame = CGRectMake(125, 60, 37, 37)
    alertView.addSubview(actInd)
    //Change self.view.bounds to a smaller CGRect if you don't want it to take up the whole screen
    NSLog("setting the frame of the webview")
    let webView : UIWebView = UIWebView(frame: self.view.bounds)

    webView.autoresizingMask = UIViewAutoresizing.FlexibleWidth
    webView.scalesPageToFit = true
    webView.autoresizesSubviews = true
    webView.delegate = self



    let persist = Persistence()
    let url : String = "https://\(persist.getObject(mdmiosagent_Constants.SERVERNAMEKEY)):\(persist.getObject(mdmiosagent_Constants.SERVERPORTKEY))/showAppsList.mobapps?udid=\(persist.getObject(mdmiosagent_Constants.UDIDKEY))&isNativeAgent=true&authtoken=\(defaults.authToken)&SCOPE=\(defaults.scope)"

    let request : NSMutableURLRequest = NSMutableURLRequest(URL: NSURL(string: url)!)
    request.timeoutInterval = 10
    var userAgent : String = ""
    if(UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Phone) {
        userAgent = "iPhone"
    } else {
        userAgent = "iPad"
    }

    request.setValue(userAgent, forHTTPHeaderField: "User-Agent")

    webView.loadRequest(request)

    self.view.addSubview(webView)
    alertView.show()

}

func webViewDidStartLoad(webView: UIWebView) {

}
func webViewDidFinishLoad(webView: UIWebView) {

    alertView.dismissWithClickedButtonIndex(-1, animated: true)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func showError(error : NSString) {
    let alert : UIAlertView = UIAlertView(title: NSLocalizedString("mdm.agent.common.error", comment: ""), message: error as String, delegate: nil, cancelButtonTitle: "mdm.agent.common.okay", otherButtonTitles: "", "")
    alert.show()
}
// method to check authentication
func connection(connection: NSURLConnection, didReceiveAuthenticationChallenge challenge: NSURLAuthenticationChallenge) {

    if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
        challenge.sender!.useCredential(NSURLCredential(forTrust: (challenge.protectionSpace.serverTrust!)), forAuthenticationChallenge: challenge)
    }
    challenge.sender?.continueWithoutCredentialForAuthenticationChallenge(challenge)
}

这在iOS 9设备上完美运行..并且在iOS 7设备的日志中显示的错误是

May 13 12:58:38 iPhone mdm.ios[1040] <Error>: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
*** First throw call stack:
(0x2fc3bf83 0x3a3ecccf 0x2fb75f0d 0x328f21af 0x328f2f75 0x328f352b 0xdcd84 0xdce24 0x3245d4ab 0x3245d269 0x325e936b 0x32506d63 0x32506b6d 0x32506b05 0x32458d59 0x320d662b 0x320d1e3b 0x320d1ccd 0x320d16df 0x320d14ef 0x320cb21d 0x2fc07255 0x2fc04bf9 0x2fc04f3b 0x2fb6febf 0x2fb6fca3 0x34a75663 0x324bc14d 0xc1318 0x3a8f9ab7). 

任何人都可以找出可能是什么原因?

我试过你的代码,效果很好。 例外情况说:

[__NSArrayM insertObject:atIndex:]:object不能为nil'

可能是因为你试图本地化一个字符串,例如你的文件Localizable.strings已经存在但尚未本地化。

当您的应用程序的旧版本已启动到您的iOS7设备或模拟器设备,并且您重新运行新版本但这个未本地化的文件仍驻留在应用程序包中的资源文件夹中时,会发生这种情况。

当您构建运行时,新版本的应用程序未使用的文件将不会被删除,因此最好的方法是从模拟器或真实设备中完全删除应用程序,清除缓存并再次构建运行。

此外,正如您通过评论解释的那样,通过应用程序目录的更新情况会导致此类崩溃。 避免此类事情的最佳方法是使用let或guard条件保护您的本地化。

从iOS 7开始,我相信你可以创建字符串文件UTF-8而不是UTF-16。

来自Apple官方文档

注意:建议您使用UTF-8编码保存字符串文件,这是标准字符串文件的默认编码。 当它们被复制到产品中时,Xcode会自动将字符串文件从UTF-8转码为UTF-16。 有关标准字符串文件格式的详细信息,请参阅创建字符串资源文件。 有关Unicode及其文本编码的更多信息,请访问http://www.unicode.org/http://en.wikipedia.org/wiki/Unicode

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM