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 之外运行。所以这是关闭的。