Mac 应用在 运行 在 Xcode 中工作正常,但部署版本崩溃
Mac app works fine while running in Xcode, but deployment version crashes
我最近更新了一个自 2012 年以来发布的应用程序。我的最新版本在 xcode 中完美运行,但是当我存档以创建分发时,该应用程序将启动,但在打开文件时它每次都会崩溃。我在 MacOS big sur 11.1 上。这是崩溃报告的摘录。
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: EXC_ARM_BREAKPOINT at 0x00000001027ec49c (brk 1)
Exception Note: EXC_CORPSE_NOTIFY
Termination Signal: Trace/BPT trap: 5
Termination Reason: Namespace SIGNAL, Code 0x5
Terminating Process: exc handler [20456]
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 JoshLevy.ReasonSync2 0x00000001027ec49c Swift runtime failure: Unexpectedly found nil while implicitly unwrapping an Optional value + 0 (Document.swift:39) [inlined]
1 JoshLevy.ReasonSync2 0x00000001027ec49c Document.makeWindowControllers() + 628 (Document.swift:39)
2 JoshLevy.ReasonSync2 0x00000001027ec3ec ViewController.playerView.getter + 24 [inlined]
3 JoshLevy.ReasonSync2 0x00000001027ec3ec Document.makeWindowControllers() + 452 (Document.swift:39)
4 JoshLevy.ReasonSync2 0x00000001027ec4c0 @objc Document.makeWindowControllers() + 28
5 com.apple.AppKit 0x0000000198cdfa98 __80-[NSDocumentController openDocumentWithContentsOfURL:display:completionHandler:]_block_invoke.841 + 168
6 com.apple.AppKit 0x0000000198ce920c ___NSMainRunLoopPerformBlockInModes_block_invoke + 44
7 com.apple.CoreFoundation 0x0000000195f8b6c0 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 28
8 com.apple.CoreFoundation 0x0000000195f8b534 __CFRunLoopDoBlocks + 408
9 com.apple.CoreFoundation 0x0000000195f8a1d0 __CFRunLoopRun + 804
10 com.apple.CoreFoundation 0x0000000195f89740 CFRunLoopRunSpecific + 600
11 com.apple.HIToolbox 0x000000019daa6678 RunCurrentEventLoopInMode + 292
12 com.apple.HIToolbox 0x000000019daa64a8 ReceiveNextEventCommon + 688
13 com.apple.HIToolbox 0x000000019daa61d8 _BlockUntilNextEventMatchingListInModeWithFilter + 76
14 com.apple.AppKit 0x0000000198761da4 _DPSNextEvent + 868
15 com.apple.AppKit 0x0000000198760724 -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1312
16 com.apple.AppKit 0x000000019875260c -[NSApplication run] + 600
17 com.apple.AppKit 0x0000000198723db0 NSApplicationMain + 1064
18 JoshLevy.ReasonSync2 0x00000001027eaf30 main + 12 (AppDelegate.swift:12)
19 libdyld.dylib 0x0000000195eacf34 start + 4
我在解决这个问题时遇到了很多麻烦 - 我确切地知道它在代码中崩溃的位置 - 当它试图使用 URL 打开文件时。但是因为我无法在 xcode 内复制它,所以我真的不知道如何修复它。违规代码似乎是:
self.videoPlayer=AVPlayer.init(url: url)
...在整个 class:
import Cocoa
import AVKit
import AVFoundation
class Document: NSDocument {
var videoPlayer: AVPlayer!
var lag1 = 0.0
override init() {
super.init()
}
override class var autosavesInPlace: Bool {
return true
}
override func makeWindowControllers() {
NSLog("%@", "makeWindowControllers")
// Returns the Storyboard that contains your Document window.
let storyboard = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: nil)
let windowController = storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("Document Window Controller")) as! NSWindowController
self.addWindowController(windowController)
let vc = windowController.contentViewController as! ViewController
vc.playerView.player = self.videoPlayer
vc.playerView.videoGravity = AVLayerVideoGravity.resizeAspectFill
}
override func data(ofType typeName: String) throws -> Data {
// Insert code here to write your document to data of the specified type, throwing an error in case of failure.
// Alternatively, you could remove this method and override fileWrapper(ofType:), write(to:ofType:), or write(to:ofType:for:originalContentsURL:) instead.
throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
}
override func read(from url: URL, ofType typeName: String) throws {
self.videoPlayer=AVPlayer.init(url: url)
UserDefaults.standard.set(url, forKey: "lastURL")
Swift.print("opening",url,typeName)
}
}
...在 xcode 中工作得非常好...我为沙盒、用户选择的文件设置了权利 read/write。 (我也试过去掉沙箱,还是一样的问题)
任何 ideas/help 将不胜感激。
嗯,这很尴尬 - 但出于某种原因,AVKit 和 AVFoundation 库从“构建阶段”窗格中消失了。我只是在尝试复制项目后才注意到这一点——基本上是从头开始。出于某种原因,这并没有在 xcode.
内停止来自 运行 的应用程序
添加 2 个库后,该应用程序也可以在 xcode 之外运行。所以这是关闭的。
我最近更新了一个自 2012 年以来发布的应用程序。我的最新版本在 xcode 中完美运行,但是当我存档以创建分发时,该应用程序将启动,但在打开文件时它每次都会崩溃。我在 MacOS big sur 11.1 上。这是崩溃报告的摘录。
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: EXC_ARM_BREAKPOINT at 0x00000001027ec49c (brk 1)
Exception Note: EXC_CORPSE_NOTIFY
Termination Signal: Trace/BPT trap: 5
Termination Reason: Namespace SIGNAL, Code 0x5
Terminating Process: exc handler [20456]
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 JoshLevy.ReasonSync2 0x00000001027ec49c Swift runtime failure: Unexpectedly found nil while implicitly unwrapping an Optional value + 0 (Document.swift:39) [inlined]
1 JoshLevy.ReasonSync2 0x00000001027ec49c Document.makeWindowControllers() + 628 (Document.swift:39)
2 JoshLevy.ReasonSync2 0x00000001027ec3ec ViewController.playerView.getter + 24 [inlined]
3 JoshLevy.ReasonSync2 0x00000001027ec3ec Document.makeWindowControllers() + 452 (Document.swift:39)
4 JoshLevy.ReasonSync2 0x00000001027ec4c0 @objc Document.makeWindowControllers() + 28
5 com.apple.AppKit 0x0000000198cdfa98 __80-[NSDocumentController openDocumentWithContentsOfURL:display:completionHandler:]_block_invoke.841 + 168
6 com.apple.AppKit 0x0000000198ce920c ___NSMainRunLoopPerformBlockInModes_block_invoke + 44
7 com.apple.CoreFoundation 0x0000000195f8b6c0 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 28
8 com.apple.CoreFoundation 0x0000000195f8b534 __CFRunLoopDoBlocks + 408
9 com.apple.CoreFoundation 0x0000000195f8a1d0 __CFRunLoopRun + 804
10 com.apple.CoreFoundation 0x0000000195f89740 CFRunLoopRunSpecific + 600
11 com.apple.HIToolbox 0x000000019daa6678 RunCurrentEventLoopInMode + 292
12 com.apple.HIToolbox 0x000000019daa64a8 ReceiveNextEventCommon + 688
13 com.apple.HIToolbox 0x000000019daa61d8 _BlockUntilNextEventMatchingListInModeWithFilter + 76
14 com.apple.AppKit 0x0000000198761da4 _DPSNextEvent + 868
15 com.apple.AppKit 0x0000000198760724 -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1312
16 com.apple.AppKit 0x000000019875260c -[NSApplication run] + 600
17 com.apple.AppKit 0x0000000198723db0 NSApplicationMain + 1064
18 JoshLevy.ReasonSync2 0x00000001027eaf30 main + 12 (AppDelegate.swift:12)
19 libdyld.dylib 0x0000000195eacf34 start + 4
我在解决这个问题时遇到了很多麻烦 - 我确切地知道它在代码中崩溃的位置 - 当它试图使用 URL 打开文件时。但是因为我无法在 xcode 内复制它,所以我真的不知道如何修复它。违规代码似乎是:
self.videoPlayer=AVPlayer.init(url: url)
...在整个 class:
import Cocoa
import AVKit
import AVFoundation
class Document: NSDocument {
var videoPlayer: AVPlayer!
var lag1 = 0.0
override init() {
super.init()
}
override class var autosavesInPlace: Bool {
return true
}
override func makeWindowControllers() {
NSLog("%@", "makeWindowControllers")
// Returns the Storyboard that contains your Document window.
let storyboard = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: nil)
let windowController = storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("Document Window Controller")) as! NSWindowController
self.addWindowController(windowController)
let vc = windowController.contentViewController as! ViewController
vc.playerView.player = self.videoPlayer
vc.playerView.videoGravity = AVLayerVideoGravity.resizeAspectFill
}
override func data(ofType typeName: String) throws -> Data {
// Insert code here to write your document to data of the specified type, throwing an error in case of failure.
// Alternatively, you could remove this method and override fileWrapper(ofType:), write(to:ofType:), or write(to:ofType:for:originalContentsURL:) instead.
throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
}
override func read(from url: URL, ofType typeName: String) throws {
self.videoPlayer=AVPlayer.init(url: url)
UserDefaults.standard.set(url, forKey: "lastURL")
Swift.print("opening",url,typeName)
}
}
...在 xcode 中工作得非常好...我为沙盒、用户选择的文件设置了权利 read/write。 (我也试过去掉沙箱,还是一样的问题)
任何 ideas/help 将不胜感激。
嗯,这很尴尬 - 但出于某种原因,AVKit 和 AVFoundation 库从“构建阶段”窗格中消失了。我只是在尝试复制项目后才注意到这一点——基本上是从头开始。出于某种原因,这并没有在 xcode.
内停止来自 运行 的应用程序添加 2 个库后,该应用程序也可以在 xcode 之外运行。所以这是关闭的。