【问题标题】:Getting bundle identifier in Swift在 Swift 中获取包标识符
【发布时间】:2016-06-10 23:18:06
【问题描述】:

我正在尝试使用应用程序的目录获取 bundleID,但出现错误: EXC_BAD_ACCESS(代码=1,地址=0xd8)

应用程序.目录!是一个字符串

let startCString = (application.directory! as NSString).UTF8String //Type: UnsafePointer<Int8>
let convertedCString = UnsafePointer<UInt8>(startCString) //CFURLCreateFromFileRepresentation needs <UInt8> pointer
let length = application.directory!.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
let dir = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, convertedCString, length, false)
let bundle = CFBundleCreate(kCFAllocatorDefault, dir)
let result = CFBundleGetIdentifier(bundle)

我在结果行上收到此错误。

我在这里做错了什么?

【问题讨论】:

  • 这是为你自己的应用程序的捆绑标识符吗?为什么这么复杂?看看Obtain bundle identifier programatically in Swift?
  • 不是。这是另一个应用程序的捆绑包。这就是为什么我不在 NSBundle 上使用 .mainBundle().bundleIdentifier。
  • NSBundle(path: ...).bundleIdentifier 呢?
  • 什么鬼!真的吗?这么简单?非常感谢(!)!

标签: swift cocoa foundation


【解决方案1】:

您的代码的一个潜在问题是在

中获得的指针
let startCString = (application.directory! as NSString).UTF8String //Type: UnsafePointer<Int8>

只有在 临时 NSString 存在时才有效。但是那个 转换为 C 字符串可以由编译器“自动”完成 (比较String value to UnsafePointer<UInt8> function parameter behavior),所以是一个工作版本 应该是

let dir = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, path, Int(strlen(path)), false)
let bundle = CFBundleCreate(kCFAllocatorDefault, dir)
let result = CFBundleGetIdentifier(bundle)

但是您可以简单地创建一个NSBundle 从给定路径获取其标识符:

let ident = NSBundle(path: path)!.bundleIdentifier!

添加错误检查的完整示例:

let path = "/Applications/TextEdit.app"

if let bundle = NSBundle(path: path) {
    if let ident = bundle.bundleIdentifier {
        print(ident) // com.apple.TextEdit
    } else {
        print("bundle has no identifier")
    }
} else {
    print("bundle not found")
}

【讨论】:

  • 哇,您甚至想到了更复杂(且不必要)的代码!非常感谢!
【解决方案2】:

如果您尝试以编程方式获取它,您可以使用以下代码行:

目标-C:

NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];

斯威夫特 3.0:

let bundleIdentifier =  Bundle.main.bundleIdentifier

(已更新为最新的 swift 它适用于 iOS 和 Mac 应用程序。)

欲了解更多信息,请点击此处:

苹果文档: https://developer.apple.com/documentation/foundation/bundle#//apple_ref/occ/instm/NSBundle/bundleIdentifier

【讨论】:

  • 似乎他们改进了它的完成方式!好消息!
猜你喜欢
  • 2014-11-11
  • 2020-05-07
  • 1970-01-01
  • 2017-12-05
  • 2019-05-03
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多