如何在Swift中访问iOS私有API?

时间:2015-01-27 15:52:24

标签: ios objective-c swift iphone-privateapi quartz-core

如何调用非公共iOS函数并从Swift访问非公共属性?具体来说,我想在QuartzCore框架中使用一个非公共类。

我想到的一个解决方案是创建"桥接" Objective-C项目将这个非公共API包装成公共API,而不是从Swift调用这个Objective-C函数。但是,我的解决方案现在是纯粹的Swift,我宁愿保持这种方式。有没有更坚定的方式? (例如,向Objective-C bridging header file添加内容)

注意:我知道你在想什么,私有API是私有的,因为它们不应该被使用。我知道风险,我知道所有的烦恼,应用程序商店的限制等。经过仔细考虑和大量的研究,不幸的是,这似乎仍然是这种特殊情况的最佳方式。

2 个答案:

答案 0 :(得分:17)

你可以采用与项目所在时相同的技巧 目标C

创建一个头文件并在类上放置一个类别的声明,以及您希望公开的私有方法的声明。然后,告诉Swift编译器导入这个桥接头。

出于演示目的,我将在NSBigMutableString的内部NSMutableString_isMarkedAsImmutable的私有子类中进行搜索,我将调用其(Private)方法。

请注意,这里整个类本身都是私有的,因此我必须首先将其声明为其真实超类的子类。因此,我可以在类本身的声明中声明方法;但是,它不会证明使用#import <Foundation/Foundation.h> @interface NSMutableString (Private) - (BOOL)_isMarkedAsImmutable; // this is a lie @end @interface NSBigMutableString : NSMutableString @end 技巧类别。

如果你的课程是公开的,那么显然你只需要这个类别,而你不需要(重新)宣布课程本身。

Bridge.h:

let s = NSBigMutableString()
println(s._isMarkedAsImmutable())

s.swift:

$ xcrun -sdk macosx swiftc -o foo -import-objc-header Bridge.h s.swift
$ ./foo
false
$

编译并运行:

{{1}}

答案 1 :(得分:7)

您可以使用NSClassFromString:获取私人课程,并使用performSelector与他们互动。