如何使用Swift的私有iOS框架?

时间:2016-03-21 17:04:07

标签: swift

我想在Swift应用程序中使用iOS上的私有框架。我很清楚为什么这是一个坏主意,但它在测试期间会很有用,因此App Store的限制不是问题,我已经详尽地研究了替代方案。

我想做的事情就是这样:

dlopen("/Developer/Library/PrivateFrameworks/UIAutomation.framework/UIAutomation".fileSystemRepresentation,RTLD_LOCAL);

let eventsclass = NSClassFromString("UIASyntheticEvents") as? UIASyntheticEvents.Type
eventGenerator = eventsclass!.sharedEventGenerator() as! UIASyntheticEvents

问题是这会导致链接器错误:

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_UIASyntheticEvents", referenced from:
      type metadata accessor for __ObjC.UIASyntheticEvents in Test.o

如果我直接链接框架而不是使用dlopen(),它将在模拟器上正常工作,但无法为实际设备构建,因为SDK中提供的框架仅用于模拟器,不会链接在设备构建期间。

我尝试在Objective-C中进行这些调用,以防它只是导致问题的.Type强制转换,但这没有用。如果我从Swift访问返回的对象,我仍然会得到同样的错误。

我想我可以在Objective-C中创建一个包装器,直接将所有调用传递给类,但这似乎过多了。这个问题有更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:4)

我找到了一个需要手动工作的解决方案,但是在纯Swift中工作。

诀窍是在Swift中创建一个与Objective-C方法匹配的@objc协议,然后对该协议类型进行不安全的转换。就我而言,协议如下所示:

    dlopen("/Developer/Library/PrivateFrameworks/UIAutomation.framework/UIAutomation".fileSystemRepresentation,RTLD_LOCAL)

    let eventsclass = unsafeBitCast(NSClassFromString("UIASyntheticEvents"), UIASyntheticEvents.Type.self)
    eventGenerator = eventsclass.sharedEventGenerator()

这是从类转储输出手动转换的。如果有人知道更快捷的方式,我很乐意知道。

拥有此协议后,您只需执行以下操作:

float