更新从应用程序审查小组得到一个答案…它只是在iPad上崩溃,而不是在iPhone上.
事情是,我不能重现这个崩溃.即使在我的3个物理设备(iPhone 4S,iPhone6和iPad Air)上进行测试,也可以通过TestFlight内部测试进行干净安装或更新(与App Review Team正在审核的完全相同的构建和存档)
提取崩溃日志(从App Review Team收到)(符号):
Exception Type: EXC_BREAKPOINT (SIGTRAP) Exception Codes: 0x0000000000000001,0x000000010032ced8 Triggered by Thread: 0 Filtered syslog: None found Thread 0 name: Dispatch queue: com.apple.main-thread Thread 0 Crashed: 0 AppName 0x000000010032ced8 MapViewController.viewDidLoad() -> () (MapViewController.swift:210) 1 AppName 0x000000010032cf2c @objc MapViewController.viewDidLoad() -> () (MapViewController.swift:0) 2 UIKit 0x0000000187394b40 -[UIViewController loadViewIfrequired] + 996
MapViewController是UINavigationController的rootViewController,第210行包含:self.view.backgroundColor = UIColor.blackColor()
更新:
删除该行并提交另一个构建.相同的崩溃日志,现在崩溃在下一行:imageview.hidden = true
试图直接从我的设备上的Xcode“释放”配置运行,希望它会崩溃并指向正确的方向,但是,不会崩溃: – /
另外,非常有趣的是,我在同一个应用程序的前一个版本中也是一样的(也被拒绝).我向审查小组发送了类似于这个故事的回复,他们批准了它进行外部beta测试(没有任何变化).只有我的一个beta测试人员(总共aprox 300)在启动时报告了类似的崩溃.
在Sigtrap断点上进行了大量的搜索,但没有发现任何类似于我正在经历的事情.所以,我真的在这里亏损.我不能重现它,而崩溃日志并不指出我可以调查的任何方向.
更新:这是从App Review团队获得的完整的(象征性的)崩溃报告. (不包括二进制图像,所有看起来都很好).也许某些东西(其他线程可能吗?)为某人敲响钟.任何帮助或建议将不胜感激.
Incident Identifier: 5A47A678-EDD0-400B-873F-4BF466E13218 CrashReporter Key: 31c74ad5c3da4b8205dc32464f9bc6fde2f4edea Hardware Model: xxx Process: AppName [2081] Path: /private/var/containers/Bundle/Application/065CA51D-8981-419B-BEB8-3BD5255073E8/AppName.app/AppName Identifier: com.pinguido.scenic Version: 1 (1.08) Code Type: ARM-64 (Native) Parent Process: launchd [1] Date/Time: 2016-05-06 20:56:49.49 -0700 Launch Time: 2016-05-06 20:56:49.49 -0700 OS Version: iOS 9.3.1 (13E238) Report Version: 105 Exception Type: EXC_BREAKPOINT (SIGTRAP) Exception Codes: 0x0000000000000001,0x000000010032d7fc Triggered by Thread: 0 Filtered syslog: None found Thread 0 name: Dispatch queue: com.apple.main-thread Thread 0 Crashed: 0 AppName 0x000000010032d7fc MapViewController.viewDidLoad() -> () (MapViewController.swift:216) 1 AppName 0x000000010032d850 @objc MapViewController.viewDidLoad() -> () (MapViewController.swift:0) 2 UIKit 0x0000000187520b40 -[UIViewController loadViewIfrequired] + 996 3 UIKit 0x00000001875e1118 -[UINavigationController _layoutViewController:] + 72 4 UIKit 0x00000001875e0ff0 -[UINavigationController _updateScrollViewFromViewController:toViewController:] + 416 5 UIKit 0x00000001875e0238 -[UINavigationController _startTransition:fromViewController:toViewController:] + 144 6 UIKit 0x00000001875dfddc -[UINavigationController _startDeferredTransitionIfNeeded:] + 868 7 UIKit 0x00000001875dfa04 -[UINavigationController __viewWillLayoutSubviews] + 60 8 UIKit 0x00000001875df96c -[UILayoutContainerView layoutSubviews] + 208 9 UIKit 0x000000018751c0e4 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 656 10 QuartzCore 0x0000000184ec2a28 -[CALayer layoutSublayers] + 148 11 QuartzCore 0x0000000184ebd634 CA::Layer::layout_if_needed(CA::Transaction*) + 292 12 QuartzCore 0x0000000184ebd4f4 CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 32 13 QuartzCore 0x0000000184ebcb24 CA::Context::commit_transaction(CA::Transaction*) + 252 14 QuartzCore 0x0000000184ebc86c CA::Transaction::commit() + 512 15 QuartzCore 0x0000000184eb5dd8 CA::Transaction::observer_callback(__CFRunLoopObserver*,unsigned long,void*) + 80 16 CoreFoundation 0x00000001823947b0 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32 17 CoreFoundation 0x0000000182392554 __CFRunLoopDoObservers + 372 18 CoreFoundation 0x00000001822bcd30 CFRunLoopRunSpecific + 416 19 UIKit 0x000000018758f834 -[UIApplication _run] + 460 20 UIKit 0x0000000187589f70 UIApplicationMain + 204 21 AppName 0x000000010042be50 main (AppDelegate.swift:16) 22 libdyld.dylib 0x0000000181e5a8b8 start + 4 Thread 1: 0 libsystem_kernel.dylib 0x0000000181f78b48 __workq_kernreturn + 8 1 libsystem_pthread.dylib 0x0000000182041530 _pthread_wqthread + 1284 2 libsystem_pthread.dylib 0x0000000182041020 start_wqthread + 4 Thread 2 name: Dispatch queue: com.apple.libdispatch-manager Thread 2: 0 libsystem_kernel.dylib 0x0000000181f794d8 kevent_qos + 8 1 libdispatch.dylib 0x0000000181e3c7d8 _dispatch_mgr_invoke + 232 2 libdispatch.dylib 0x0000000181e2b648 _dispatch_source_invoke + 0 Thread 3: 0 libsystem_kernel.dylib 0x0000000181f78b48 __workq_kernreturn + 8 1 libsystem_pthread.dylib 0x0000000182041530 _pthread_wqthread + 1284 2 libsystem_pthread.dylib 0x0000000182041020 start_wqthread + 4 Thread 4: 0 libsystem_kernel.dylib 0x0000000181f78b48 __workq_kernreturn + 8 1 libsystem_pthread.dylib 0x0000000182041530 _pthread_wqthread + 1284 2 libsystem_pthread.dylib 0x0000000182041020 start_wqthread + 4 Thread 5: 0 libsystem_kernel.dylib 0x0000000181f7841c __semwait_signal + 8 1 libsystem_c.dylib 0x0000000181e9522c nanosleep + 212 2 libsystem_c.dylib 0x0000000181e9514c usleep + 68 3 AppName 0x000000010086ac48 recvTimeout + 196 4 AppName 0x000000010086f864 ConnectionWrapper::recv() + 192 5 AppName 0x000000010086fed4 HttpUtils::readHttpStatusLine(ConnectionWrapper&,unsigned short&) + 68 6 AppName 0x000000010086de90 skobbler::HTTP::HttpRequest::receiveAnswerImpl(bool) + 64 7 AppName 0x000000010086d878 skobbler::HTTP::HttpRequest::receiveAnswer(bool) + 44 8 AppName 0x000000010086c4ec skobbler::HTTP::HttpManager::HttpWorkerThread::processRequest() + 88 9 AppName 0x000000010086c938 skobbler::HTTP::HttpManager::HttpWorkerThread::runHelper(void*) + 48 10 libsystem_pthread.dylib 0x0000000182043b28 _pthread_body + 156 11 libsystem_pthread.dylib 0x0000000182043a8c _pthread_body + 0 12 libsystem_pthread.dylib 0x0000000182041028 thread_start + 4 Thread 6: 0 libsystem_kernel.dylib 0x0000000181f77f24 __psynch_cvwait + 8 1 libsystem_pthread.dylib 0x0000000182042ce8 _pthread_cond_wait + 648 2 AppName 0x000000010080b7ec RouteManager::run() + 2588 3 AppName 0x0000000100807d74 RouteManager::runHelper(void*) + 12 4 libsystem_pthread.dylib 0x0000000182043b28 _pthread_body + 156 5 libsystem_pthread.dylib 0x0000000182043a8c _pthread_body + 0 6 libsystem_pthread.dylib 0x0000000182041028 thread_start + 4 Thread 7: 0 libsystem_kernel.dylib 0x0000000181f7841c __semwait_signal + 8 1 libsystem_c.dylib 0x0000000181e9522c nanosleep + 212 2 libsystem_c.dylib 0x0000000181e9514c usleep + 68 3 AppName 0x000000010086ac48 recvTimeout + 196 4 AppName 0x000000010086f864 ConnectionWrapper::recv() + 192 5 AppName 0x000000010086fed4 HttpUtils::readHttpStatusLine(ConnectionWrapper&,unsigned short&) + 68 6 AppName 0x000000010086de90 skobbler::HTTP::HttpRequest::receiveAnswerImpl(bool) + 64 7 AppName 0x000000010086d878 skobbler::HTTP::HttpRequest::receiveAnswer(bool) + 44 8 AppName 0x000000010086c4ec skobbler::HTTP::HttpManager::HttpWorkerThread::processRequest() + 88 9 AppName 0x000000010086c938 skobbler::HTTP::HttpManager::HttpWorkerThread::runHelper(void*) + 48 10 libsystem_pthread.dylib 0x0000000182043b28 _pthread_body + 156 11 libsystem_pthread.dylib 0x0000000182043a8c _pthread_body + 0 12 libsystem_pthread.dylib 0x0000000182041028 thread_start + 4 Thread 8: 0 libsystem_kernel.dylib 0x0000000181f77f24 __psynch_cvwait + 8 1 libsystem_pthread.dylib 0x0000000182042d20 _pthread_cond_wait + 704 2 AppName 0x00000001007b64e4 SkTimer<MapMatcher,&(MapMatcher::positioningRoutineWrapper(MapMatcher*))>::entryPoint(void*) + 120 3 libsystem_pthread.dylib 0x0000000182043b28 _pthread_body + 156 4 libsystem_pthread.dylib 0x0000000182043a8c _pthread_body + 0 5 libsystem_pthread.dylib 0x0000000182041028 thread_start + 4 Thread 9: 0 libsystem_kernel.dylib 0x0000000181f77f24 __psynch_cvwait + 8 1 libsystem_pthread.dylib 0x0000000182042ce8 _pthread_cond_wait + 648 2 AppName 0x00000001006d1354 ThreadWorker::run() + 72 3 AppName 0x000000010080107c RunInThread::runHelper(void*) + 28 4 libsystem_pthread.dylib 0x0000000182043b28 _pthread_body + 156 5 libsystem_pthread.dylib 0x0000000182043a8c _pthread_body + 0 6 libsystem_pthread.dylib 0x0000000182041028 thread_start + 4 Thread 10: 0 libsystem_kernel.dylib 0x0000000181f77f24 __psynch_cvwait + 8 1 libsystem_pthread.dylib 0x0000000182042ce8 _pthread_cond_wait + 648 2 AppName 0x0000000100622cf0 TileLoader<MapRenderer>::run() + 2512 3 AppName 0x0000000100770974 TileLoader<MapRenderer>::runHelper(void*) + 12 4 libsystem_pthread.dylib 0x0000000182043b28 _pthread_body + 156 5 libsystem_pthread.dylib 0x0000000182043a8c _pthread_body + 0 6 libsystem_pthread.dylib 0x0000000182041028 thread_start + 4 Thread 11: 0 libsystem_kernel.dylib 0x0000000181f77f24 __psynch_cvwait + 8 1 libsystem_pthread.dylib 0x0000000182042d20 _pthread_cond_wait + 704 2 AppName 0x00000001007748c4 SkTimer<ReRenderTimer,&(ReRenderTimer::reRenderRoutine(ReRenderTimer*))>::entryPoint(void*) + 120 3 libsystem_pthread.dylib 0x0000000182043b28 _pthread_body + 156 4 libsystem_pthread.dylib 0x0000000182043a8c _pthread_body + 0 5 libsystem_pthread.dylib 0x0000000182041028 thread_start + 4 Thread 12: 0 libsystem_kernel.dylib 0x0000000181f77f24 __psynch_cvwait + 8 1 libsystem_pthread.dylib 0x0000000182042d20 _pthread_cond_wait + 704 2 AppName 0x00000001007747f0 SkTimer<AnimationTimer,&(AnimationTimer::animationTimerRoutine(AnimationTimer*))>::entryPoint(void*) + 120 3 libsystem_pthread.dylib 0x0000000182043b28 _pthread_body + 156 4 libsystem_pthread.dylib 0x0000000182043a8c _pthread_body + 0 5 libsystem_pthread.dylib 0x0000000182041028 thread_start + 4 Thread 13: 0 libsystem_kernel.dylib 0x0000000181f77f24 __psynch_cvwait + 8 1 libsystem_pthread.dylib 0x0000000182042ce8 _pthread_cond_wait + 648 2 AppName 0x00000001006a46c4 WorldTextures::WorkerThreadRoutine(void*) + 100 3 libsystem_pthread.dylib 0x0000000182043b28 _pthread_body + 156 4 libsystem_pthread.dylib 0x0000000182043a8c _pthread_body + 0 5 libsystem_pthread.dylib 0x0000000182041028 thread_start + 4 Thread 14: 0 libsystem_kernel.dylib 0x0000000181f77f24 __psynch_cvwait + 8 1 libsystem_pthread.dylib 0x0000000182042ce8 _pthread_cond_wait + 648 2 AppName 0x00000001006aa2ac EarthSphere::WorkerThreadRoutine(void*) + 120 3 libsystem_pthread.dylib 0x0000000182043b28 _pthread_body + 156 4 libsystem_pthread.dylib 0x0000000182043a8c _pthread_body + 0 5 libsystem_pthread.dylib 0x0000000182041028 thread_start + 4 Thread 15: 0 libsystem_kernel.dylib 0x0000000181f77f24 __psynch_cvwait + 8 1 libsystem_pthread.dylib 0x0000000182042ce8 _pthread_cond_wait + 648 2 AppName 0x00000001006e2fdc MapSearch::runLoop(void*) + 128 3 libsystem_pthread.dylib 0x0000000182043b28 _pthread_body + 156 4 libsystem_pthread.dylib 0x0000000182043a8c _pthread_body + 0 5 libsystem_pthread.dylib 0x0000000182041028 thread_start + 4 Thread 16: 0 libsystem_kernel.dylib 0x0000000181f77f24 __psynch_cvwait + 8 1 libsystem_pthread.dylib 0x0000000182042d20 _pthread_cond_wait + 704 2 AppName 0x000000010077fa34 SkTimer<FcdCollector,&(FcdCollector::timerRoutineWrapper(FcdCollector*))>::entryPoint(void*) + 120 3 libsystem_pthread.dylib 0x0000000182043b28 _pthread_body + 156 4 libsystem_pthread.dylib 0x0000000182043a8c _pthread_body + 0 5 libsystem_pthread.dylib 0x0000000182041028 thread_start + 4 Thread 17: 0 libsystem_kernel.dylib 0x0000000181f7841c __semwait_signal + 8 1 libsystem_c.dylib 0x0000000181e9522c nanosleep + 212 2 libsystem_c.dylib 0x0000000181efe09c sleep + 44 3 AppName 0x00000001008010a4 TimerTarget::run() + 20 4 AppName 0x000000010080107c RunInThread::runHelper(void*) + 28 5 libsystem_pthread.dylib 0x0000000182043b28 _pthread_body + 156 6 libsystem_pthread.dylib 0x0000000182043a8c _pthread_body + 0 7 libsystem_pthread.dylib 0x0000000182041028 thread_start + 4 Thread 18: 0 libsystem_kernel.dylib 0x0000000181f78b48 __workq_kernreturn + 8 1 libsystem_pthread.dylib 0x0000000182041530 _pthread_wqthread + 1284 2 libsystem_pthread.dylib 0x0000000182041020 start_wqthread + 4 Thread 19: 0 libsystem_kernel.dylib 0x0000000181f78b48 __workq_kernreturn + 8 1 libsystem_pthread.dylib 0x0000000182041530 _pthread_wqthread + 1284 2 libsystem_pthread.dylib 0x0000000182041020 start_wqthread + 4
编辑
正如有些人在评论中提到的,这里是我AppDelegate的didFinishLaunchingWithOptions和我的rootVC的viewDidLoad中的代码正如我所提到的,我不认为我的viewDidLoad中的任何东西,因为它总是在viewDidLoad的第一行崩溃.我猜这是我的AppDel中的东西,或者是全局的东西,也就是在我的rootVC的viewDidLoad之前执行的东西.
func application(application: UIApplication,didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool { print("APPDEL: applicationDidFinishLaunching") appWasCompletelyClosed = true // Set SKMaps API Key & Light Map let initSettings: SKMapsInitSettings = SKMapsInitSettings() initSettings.mapDetailLevel = SKMapDetailLevel.Light initSettings.showConsoleLogs = false SKMapsService.sharedInstance().initializeSKMapsWithAPIKey(SKMapsAPIKey,settings: initSettings) if UD.appVersion == nil || UD.appVersion != "\(NSBundle.mainBundle().infoDictionary!["CFBundleVersion"]!)" { startClean() UD.appVersion = "\(NSBundle.mainBundle().infoDictionary!["CFBundleVersion"]!)" } // Get IAP Products & Prices IAPHelper.sharedInstance.requestProducts(){(success) -> Void in if !success { printError("Error getting IAP Products") } } if UD.userID == nil { print("First Launch") copyCleanDBtoApplicationsFolder() MagicalRecord.setupCoreDataStackWithStoreNamed("scenic.sqlite") LastSync.resetAll() firstLaunch = true UD.userID = NSUUID().UUIDString print(UD.userID) let newUser = User.MR_createEntity() newUser.id = UD.userID newUser.addedOn = NSDate() newUser.lastChanged = NSDate() newUser.points = 0 newUser.pointsToNextLevel = 5 newUser.level = 0 newUser.rankWorld = 0 newUser.rankCountry = 0 #if DEBUG newUser.offlineMapCredits = 100 #else newUser.offlineMapCredits = 5 #endif saveContext() self.setUserDefaultsForFirstTime() self.createSubDirs() Sync.user() {(error) -> Void in if error { print("There was an error creating the new user on the server. Will try again before next sync action.") } else { print("User succesfully created on the server.") UD.userUploadedFirstTime = true } } } else { MagicalRecord.setupCoreDataStackWithStoreNamed("scenic.sqlite") } // Initialize cache with offline map regions SKMapsService.sharedInstance().mapsVersioningManager.delegate = self SKTDownloadManager.sharedInstance() //cachedMapRegions = Array<MapRegion>() // Set Map to Offline if "Get Map Data Online" is set to No setMapConnectivityMode() if TripLogger.sharedInstance.logFileExists() { appClosedDuringTrip = true } print("APPDEL: end of applicationDidFinishLaunching") return true }
viewDidLoad中:
override func viewDidLoad() { super.viewDidLoad() print("MAPVC: viewDidLoad") //self.view.backgroundColor = UIColor.blackColor() // UI Stuff profilePicImageView.hidden = true profilePicShadowView.hidden = true profilePicImageViewTopConstraint.constant -= 30 profilePicShadowViewTopConstraint.constant -= 30 searchBar.hidden = true searchBarTopConstraint.constant -= 30 settingsButton.hidden = true settingsButtonTopConstraint.constant -= 30 centerOnCurrentLocationButton.hidden = true centerOnCurrentLocationButtonLeadingConstraint.constant -= 30 locationsButton.hidden = true locationsButtonLeadingConstraint.constant -= 30 startButton.hidden = true startButtonBottomConstraint.constant -= 30 routesButton.hidden = true routesButtonTrailingConstraint.constant -= 30 locationsMenuWidth.constant = 0 locationsMenuHeight.constant = 0 routesMenuWidth.constant = 0 routesMenuHeight.constant = 0 self.view.layoutIfNeeded() routesMenu.hidden = true locationsMenu.hidden = true centerOnCurrentLocationButtonIsHidden = centerOnCurrentLocationButton.hidden navInfoView.hidden = true searchResultsTableView.hidden = true cancelSearchButton.hidden = true profileTableView.hidden = true profileTableView.layer.cornerRadius = theme.cornerRadius profileTableView.layer.masksToBounds = false profileTableView.backgroundColor = theme.buttonBackgroundColor profileTableView.clipsToBounds = true searchResultsTableView.hidden = true searchResultsTableView.layer.cornerRadius = theme.cornerRadius searchResultsTableView.layer.masksToBounds = false searchResultsTableView.backgroundColor = theme.buttonBackgroundColor searchResultsTableView.clipsToBounds = true // ForceTouchRecognizer let forceTouches: Array<DFContinuousForceTouchGestureRecognizer> = [forceTouchRoutesButton,forceTouchLocationsButton] for f in forceTouches { f.timeout = 0.5 f.forceTouchDelay = 0.3 f.baseForceTouchPressure = 3.0 f.triggeringForceTouchPressure = 6.0 f.delegate = self } locationsButton.addGestureRecognizer(forceTouchLocationsButton) routesButton.addGestureRecognizer(forceTouchRoutesButton) // Search Bar HNKGooglePlacesAutocompleteQuery.setupSharedQueryWithAPIKey(GooglePlacesAPIKey) searchBar.delegate = self searchResultsTableView.delegate = self searchResultsTableView.dataSource = self self.automaticallyAdjustsScrollViewInsets = false searchBar.setBackgroundImage(UIImage(),forBarPosition: .Any,barMetrics: .Default) searchBar.barTintColor = UIColor.clearColor() // Vehicle TableViewSlider vehiclesImageSliderView = PRSlideView() vehiclesImageSliderView.delegate = self vehiclesImageSliderView.dataSource = self vehiclesImageSliderView.scrollDirection = .Horizontal vehiclesImageSliderView.infiniteScrollingEnabled = false vehiclesImageSliderView.registerClass( PRAlbumPage.self,identifier: PRAlbumPage.description() ) // Browse Routes routesInMapAreaView.hidden = true filterView.hidden = true configureFilters() // Profile TableView tvc = UITableViewController() tvc.tableView = self.profileTableView profileTableView.delegate = self profileTableView.dataSource = self let refreshControl = UIRefreshControl() refreshControl.frameHeight = 40 refreshControl.attributedTitle = NSAttributedString(string: String.localizedStringWithFormat(NSLocalizedString("Last update: %@",comment:"Refreshcontrol subtitle"),LastSync.users.timeAgoSinceNowOrNever()),attributes: [NSForegroundColorAttributeName:theme.textColor]) weak var weakSelf: MapViewController? = self refreshControl.addTarget(weakSelf,action: #selector(MapViewController.tableRefresh),forControlEvents: UIControlEvents.ValueChanged) tvc.refreshControl = refreshControl let appDelegate = UIApplication.sharedApplication().delegate! as! AppDelegate if appDelegate.appWasCompletelyClosed && UD.mapUnfolding! { foldMapOpen() } else { switch CLLocationManager.authorizationStatus() { case CLAuthorizationStatus.NotDetermined: self.locManager = CLLocationManager() self.locManager.delegate = self self.locManager.requestAlwaysAuthorization() case CLAuthorizationStatus.Denied: dispatch_async(dispatch_get_main_queue()) { self.initializeAndAnimateMap(false) } default: dispatch_async(dispatch_get_main_queue()) { self.initializeAndAnimateMap(true) } } } let subMenuButtons: Array<UIButton> = [favoriteRoutesButton,createRouteButton,importRoutesButton,showRoutesButton,favoriteLocationsButton,createLocationButton,importLocationButton] for subMenuButton in subMenuButtons { subMenuButton.setLayerProperties(backgroundColor: UIColor.clearColor(),opacity: nil,cornerRadius: 12,borderColor: theme.tintColor,borderWidth: theme.borderWidth,shadowOffset: nil) } myTripsButton.setLayerProperties(backgroundColor: UIColor.clearColor(),borderColor: theme.okGreenColor,shadowOffset: nil) let closeButtons: Array<UIButton> = [closeNavInfoButton,closeRoutesInMapAreaButton,closeFilterViewButton] for button in closeButtons { button.layer.cornerRadius = 10 button.setTitle("✕",forState: .Normal) button.titleLabel?.textAlignment = NSTextAlignment.Center button.titleEdgeInsets = UIEdgeInsetsMake(0,0) button.titleLabel?.font = UIFont(name: "HelveticaNeue-Bold",size: 14) button.backgroundColor = theme.tintColor } routeAvoidanceSelector = WLHorizontalSegmentedControl(items: ["avoid Tolls","avoid Highway","avoid Ferries"]) routeAvoidanceSelector.allowsMultiSelection = true routeAvoidanceSelector.addTarget(weakSelf,action: #selector(MapViewController.routeAvoidanceChanged),forControlEvents: UIControlEvents.ValueChanged) let segControlFont = UIFont.systemFontOfSize(11,weight: UIFontWeightMedium) let attr = Dictionary(dictionaryLiteral: (NSFontAttributeName,segControlFont)) routeModeSelector.setTitleTextAttributes(attr,forState: UIControlState.Normal) routeModeSelector.selectedSegmentIndex = UD.routeMode!.rawValue vehicleTypeSelector.selectedSegmentIndex = UD.vehicleType!.rawValue setSelectedRouteAvoidances() routeAvoidanceSelector.tintColor = theme.tintColor guidanceToStartSwitch.setOn(UD.guideToStart!,animated: false) navInfoView.layer.masksToBounds = true vehicleTypeImageView.roundCorners(UIRectCorner.BottomRight,radius: theme.textViewCornerRadius) vehicleTypeImageView.roundCorners([UIRectCorner.TopLeft,UIRectCorner.BottomRight],radius: theme.textViewCornerRadius) vehicleTypeImageView.layer.masksToBounds = true NSNotificationCenter.defaultCenter().addObserver( self,selector: #selector(MapViewController.resigningActive),name: UIApplicationWillResignActiveNotification,object: nil ) NSNotificationCenter.defaultCenter().addObserver( self,selector: #selector(MapViewController.becomeActive),name: UIApplicationDidBecomeActiveNotification,object: nil ) NSNotificationCenter.defaultCenter().addObserver( self,selector: #selector(MapViewController.deviceRotated),name: UIDeviceOrientationDidChangeNotification,object: nil ) }
解决方法
UPDATE
当我获得批准后,应用程序的下一个版本被再次拒绝,同样的原因,同样的崩溃报告,再次指向viewDidLoad方法的第一行.
然后我将所有我的代码从viewDidLoad抛出到viewWillAppear中,如下所示:
var viewLoaded = false override func viewDidLoad() { super.viewDidLoad() // Do nothing } override func viewWillAppear(animated: Bool) { if !viewLoaded { // viewDidLoad code viewLoaded = true } // viewWillAppear code }
我的理论现在是我发现了一个苹果Bug:
我正在使用storyboards,我的rootViewController非常(非常)沉重.许多UIVIews,UILabels,MapView,按钮,搜索器,嵌入式TableView等.我的猜测是它崩溃了,因为在调用viewDidLoad时并不是所有的storyboard元素都被初始化.
如果这是真的(时间会告诉我什么时候提交更多的构建以供审查)我想我在iOS中发现了一个错误(因为我应该能够从我的viewDidLoad中的故事板引用IBOutlets)或在审核过程中运行的差异该应用程序与运行该应用程序的实际设备相比(既不是我也不是我的400个测试版测试人员遇到此次崩溃).
更新结束
根据RJE的评论,我再次看看我的AppDelegate,看看我是否强力解开一些东西.我是,但据我所知,这些价值观永远不会是零,所以当我第一次编码它时,我没有给它另一个想法.我想我应该有
在最后得到批准的建设中,3件与前一件不同,没有得到批准.
>在我的AppDelegate didFinishLaunchingWithOptions我被强制展开NSBundle.mainBundle().infoDictionary![“CFBundleVersion”]!
我变了
if UD.appVersion == nil || UD.appVersion != "\(NSBundle.mainBundle().infoDictionary!["CFBundleVersion"]!)" { startClean() UD.appVersion = "\(NSBundle.mainBundle().infoDictionary!["CFBundleVersion"]!)" }
到这个
var versionInInfoDictionary = "dummy" if let infoDict = NSBundle.mainBundle().infoDictionary { if let bundleVersion = infoDict["CFBundleVersion"] as? String{ versionInInfoDictionary = bundleVersion } else { printError("bundleVersion nil") } } else { printError("infoDic nil") } if UD.appVersion == nil || UD.appVersion != versionInInfoDictionary { startClean() UD.appVersion = versionInInfoDictionary }
>在我的AppDelegate applicationDidBecomeActive中,我强制解开窗口(在AppDelegate类中定义为var window:UIWindow?)
我变了
func applicationDidBecomeActive(application: UIApplication) { // some code let navController = window!.rootViewController as! CustomNavigationController // some code }
到这个
func applicationDidBecomeActive(application: UIApplication) { // some code self.continueDidBecomeActive() } func continueDidBecomeActive() { guard window != nil else { printError("Window still nil") NSTimer.scheduledTimerWithTimeInterval(0.3,target: self,selector: #selector(AppDelegate.continueDidBecomeActive),userInfo: nil,repeats: false) return } if let navController = window!.rootViewController as? CustomNavigationController { // some code } }
>最后在我的构建设置中,我将“发布”的代码签名身份设置为iOS开发人员.我改为iOS分发.
现在,我不认为这是第三点,使我的应用程序崩溃的应用程序审查小组,否则它会崩溃在所有设备,也为我.
所以,它必须是1号,2号或两者.老实说,我不知道,我还是有点困惑,为什么这些价值观在任何情况下都是零.如果有更多的见解…我很乐意听到他们的话.