在Swift中使用LSApplicationWorkspace

时间:2016-03-04 23:11:50

标签: ios swift xcode frameworks iphone-privateapi

我已将MobileCoreServices.framework添加到我的Xcode项目中,并在我的文件顶部添加了import MobileCoreServices语句。

我有代码行

let test = LSApplicationWorkspace.defaultWorkSpace()

xcode说Unresolved Identifier LSApplicationWorkspace

我尝试过清理和重建项目。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

Swift编译器告诉你它不知道一个名为LSApplicationWorkspace的类。这是因为它是一个私有类,没有在作为第三方开发人员可用的任何标题中描述。如果您在App Store审核期间使用LSApplicationWorkspace API被捕获,您的提交将被拒绝。鉴于此类包含在OS版本之间更改的API(由于未记录和私有),以及出于良好隐私原因而不能供第三方开发人员使用的API,使用它几乎肯定是一个非常糟糕的主意,即使您在技术上能够使用以下任一方法完成此操作。

  1. 创建私有模块映射文件where you import a header you somehow acquired for the private framework that contains LSApplicationWorkspace。这种调用LSApplicationWorkspace的方式(或者实际上任何涉及使用Mobile CoreServices标头的方法 - 即除了下面提到的performSelector之外的任何方法)几乎肯定会从App Store审核中启动您的应用程序提交,因为这种方法(最终)目标 - 静态分析方法可以看到C方法调用Apple在您的代码上运行,作为App Store审核的一部分。

  2. 使用NSClassFromString:

  3. let LSApplicationWorkspace_class:AnyObject = NSClassFromString("LSApplicationWorkspace")! as AnyObject
    let workspace = LSApplicationWorkspace_class.perform(NSSelectorFromString("defaultWorkspace"))! as AnyObject 
    

    使用上面的代码,您现在可以获得一个LSApplicationWorkspace实例,您可以使用performSelector执行代码 - 如果您知道它所响应的选择器(...在您运行的特定操作系统版本中)。但是,对LSApplicationWorkspace做任何事情都可能是一个坏主意。

答案 1 :(得分:4)

第1点: LSApplicationWorkspace是私有API,因此如果您使用此API并将您的应用上传到应用商店,则会被拒绝。

第2点:如果您有任何内部应用,但仍希望在您的应用中使用此功能,则可以使用以下内容。

  1. 在您的包中添加MobileCoreServices框架
  2. 创建LSApplicationWorkspace.h文件,其代码与此处提供的代码完全相同" https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/MobileCoreServices.framework/LSApplicationWorkspace.h"。
  3. 现在将此LSApplicationWorkspace.h文件添加到您的包中
  4. 为您的swift应用创建桥接标题
  5. 在您的桥接标题中添加#import "LSApplicationWorkspace.h"
  6. 现在在当前文件中添加import MobileCoreServices并添加代码let test = LSApplicationWorkspace.defaultWorkSpace(),它会正常工作。
  7. 注意:要使用任何私有标头,您必须在代码中包含其.h文件。您可以通过搜索"运行时标头"找到任何私有标头。在谷歌。您将获得所有运行时标头。要在swift代码中包含该标题,您需要通过bridging-header。