iOS私有API - 通过Bundle ID启动应用程序

4

一组三个问题,最后一个是期望的目标:

1)是否可以使用GraphicsServices方法并链接私有框架中的二进制文件。为什么不能像SpringBoard SBUIController那样做类似的事情?

2)没有越狱的情况下,有没有办法使用SBUIController?

3)如何在iOS 6上通过bundle ID启动应用程序(通过私有API但不需要越狱)?


看一下这个答案:https://dev59.com/e2bWa4cB1Zd3GeqPYqCQ#11693879。 - Johann Burgess
3个回答

4

应用程序和框架

GraphicServices是一个框架。它专门设计成可以链接到和被第三方应用程序使用。据我记得,SBUIController是Springboard的一部分,它是一个独立的应用程序(不设计为链接到其他应用程序)。

即使在某种情况下,您可以以某种方式链接/加载来自Springboard的代码,该代码也无法工作,因为您缺少与其他服务通信的授权。

授权

Jailbreak允许您将代码注入第三方应用程序(包括Springboard),从而在Springboard中执行代码并具有适当的授权。

实际上,对于越狱设备,您可以向您的代码添加授权并进行签名。但是,您将无法为未越狱的设备执行此操作。

因此,我建议您在未越狱设备上放弃SBUIController方法。

尝试启动应用程序

大约半年前我有同样的问题,并花了很多时间去解决它。我尝试了以下方法,但都没有成功:

  • SBSLaunchApplicationWithIdentifier
  • SBReturnToPreviousAppAtSpecifiedTime
  • 尝试使用BKSWorkspace

还有其他几种方法。

一些额外的想法

如果第三方应用程序处理某些URL方案,则可以使用它来启动该第三方应用程序。


维克多 - 感谢您的澄清。不过我还有一个问题 - 我有一种方法可以在屏幕上指定的位置注入触摸事件/滑动。我总是想调用用户安装的应用程序。有没有办法检测应用程序(bundle ID)的图标位于哪个位置(x,y)?然后我可以人为地注入触摸并调用该应用程序... - TorukMakto
我也有这个想法,但我没有办法知道 Springboard 中每个应用的位置。而且,图标可能在文件夹或另一个屏幕中。因此,这个解决方案不能直接使用。 - Victor Ronin

3
据我所知,只有私有API可以做到这一点。
@interface PrivateApi_LSApplicationWorkspace
- (bool)openApplicationWithBundleID:(id)arg1;
@end

PrivateApi_LSApplicationWorkspace* _workspace;
_workspace = [NSClassFromString(@"LSApplicationWorkspace") new];
[_workspace openApplicationWithBundleID:bundleIdentifier];

您可以查看 https://github.com/wujianguo/iOSAppsInfo

从iOS 11开始,iOSAppsIngo仅在模拟器上运行。在设备上它将显示一个空列表。 - Rivera

0

你可以尝试使用RTLD_LAZYobjc_getClass。我已经在我的非越狱的iPhone 5上使用了这两种方法来访问BluetoothManager


Wrights - 谢谢。我尝试了您在https://dev59.com/e2bWa4cB1Zd3GeqPYqCQ上给出的答案 - 它使用了objc_getClass,但是除非我删除%c,否则我无法编译它。然后它会产生链接器错误... - TorukMakto
你需要导入Objective-C运行时库。 #import <objc/runtime.h> - WrightsCS
好的 - 我有这段代码。SBApplication *app = [[objc_getClass("SBApplicationController") sharedInstance] applicationWithDisplayIdentifier:@"com.apple.MobileAddressBook"]; 执行后我得到了nil的app。(我现在正在iOS 5上执行...)我使用了一个假的声明SBApplication作为@interface SBApplication : NSObject @property(retain, nonatomic) SBProcess *process; -(NSString *)displayName; -(NSString )bundleIdentifier; -(id)applicationWithDisplayIdentifier:(NSString)bundleIdentifier; @end; - TorukMakto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接