因此,我的应用程序(iOS,Swift 2.2,Xcode 7.3)被Beta App Review团队拒绝了,因为它在发布时很糟糕。
更新从App Review团队得到答案......它只是在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测试(没有任何更改)。我的测试人员中只有一人(总共约300人)在启动时报告了类似的崩溃。
在Sigtrap断点上进行了大量的Google搜索,但没有发现任何与我遇到的相似的内容。所以,我真的很茫然。我无法重现它,崩溃日志并没有指出我可以调查的任何方向。
更新:以下是我从App Review团队获得的完整(符号化)崩溃报告。 (不包括Binary Images,那里看起来都很好)。也许在那里(其他线程可能?)为某人敲响了钟声。任何帮助或建议将不胜感激。
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(), opacity: nil, cornerRadius: 12, borderColor: theme.okGreenColor, borderWidth: theme.borderWidth, 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, 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
)
}
答案 0 :(得分:4)
- @ RJE ...这是你的评论让我仔细检查我是否强行打开一个可选项。如果你想获得赏金,请发一个答案,我会把它分配给你!谢谢! - guido 5小时前“ -
赏金总是很重要,
无论如何,知道什么是 SIGTRAP 意味着非常重要。它基本上是一个运行时异常而不是错误。因此,如果您无法真正找到问题,则必须检查是否有任何可以排除异常的地方。 (特别是Swift可选类型)
通常它可以是数组索引超出绑定或展开nil或任何类似的东西。此外,如果它仅在某些设备上或仅在某些设备上出现,则可能由于UI动画的各种延迟而出现问题。(例如,带有动画的presentViewController并在完成之前尝试一些事情。)
但老实说,我没有看到您的原始代码有任何问题。它不应该崩溃。
除非Storyboard的初始点是UINavigationController,否则您忘记将其类设置为 CustomNavigationController 。然后它将在下面的代码崩溃。 (预计在斯威夫特)。
let navController = window!.rootViewController as! CustomNavigationController
但我认为这不是问题。因为它每次都应该在任何设备上崩溃。
并且当时 applicationDidBecomeActive 被称为窗口不会是零。因此,在此之后,您可以使用navController进行其他操作。
或者可能是Apple的审核小组在有故障的设备上测试了您的应用:)
答案 1 :(得分:2)
我得到了批准。
<强>更新强>
虽然我获得批准,但应用程序的下一个版本再次被拒绝,同样的原因,同样的崩溃报告,再次指向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
}
我现在的理论是我发现了一个Apple Bug:
我正在使用故事板,我的rootViewController非常(非常)沉重。很多UIVIews,UILabels,MapView,按钮,搜索器,嵌入式TableView等我的猜测是它崩溃了,因为当调用viewDidLoad时,并非所有的storyboard元素都被初始化了。
如果确实如此(时间将告诉我何时提交更多构建以供审核)我想我在iOS中发现了一个错误(因为我应该能够在我的viewDidLoad中从故事板中引用IBOutlets)或者差异在与运行应用程序的实际设备相比,运行应用程序的审核流程(因为我和我的400 beta测试人员都没有遇到此崩溃)。
END OF UPDATE
根据RJE的评论,我再看看我的AppDelegate,看看我是否有力地展开了一些东西。我是,但据我所知,这些价值永远不会是零,所以当我第一次编码时,我没有再给它一个想法。我想我应该有。
在最终获得批准的构建中,有3件事与前一件没有获得批准的东西不同。
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
}
applicationDidBecomeActive
中,我强行打开window
(在我的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
}
}
现在,我认为这不是让我的应用程序崩溃的第三点App App团队,否则它会在所有设备上崩溃,也对我来说。
因此,它必须是数字1,数字2或两者。老实说,我不知道,我仍然有点困惑,为什么这些价值观在任何情况下都是零。如果有更多的见解......我很乐意听到它们。
答案 2 :(得分:0)
我有一个类似的问题。我的测试设备没有崩溃,但苹果表示他们无法启动该应用程序。
我给解决中心的审核小组发了消息。他们再次开始了审核过程,无法重现崩溃。终于我的应用程序被接受了:)