是否可以在非越狱设备上使用私有API挂钩iOS中的系统函数调用?根据我所看到的,使用MobileSubstrate MSHook
在越狱设备上可行。
我想要完成的是让应用程序在控制中心(http://i.stack.imgur.com/NfbGw.png)切换设备方向锁时拦截系统调用并调用CTRegistrationSetCellularDataIsEnabled
以便切换蜂窝数据的使用。
到目前为止,我设法创建了一个iOS 8通知中心小部件,但是从控制中心切换3G是不是很好?
显然,该应用程序仅供我个人使用。
答案 0 :(得分:5)
在按照你描述它的方式完成这项任务...... 没有时,我认为如果没有越狱,我们就没有办法做到这一点。
您可以在个人使用的非越狱应用中使用method swizzling 挂钩 iOS方法。但是,这限制了您挂钩从您的应用程序调用的代码。换句话说,如果您的应用程序调用iOS框架,您可以通过这种方式调整方法。
但是,控制中心和SpringBoard不属于您的应用。 Mobile Substrate(Cydia Substrate)的优点在于它允许您将钩子注入到未在应用程序进程内运行的代码中。但是,如果没有越狱,它就无法使用。
Interposition也是用于挂钩C API的类似技术,但同样需要越狱。
就您是否可以成功调用CTRegistrationSetCellularDataIsEnabled
而言,这可能是值得自己提出的问题。我猜你可以通过动态打开CoreTelephony.framework来调用它,就像许多私有API一样。 (See here for what looks to be a sample)
但是,即使您可以调用它,如果受entitlement保护,则该呼叫可能不会成功,这是您越狱时无法获得的另一件事。
注意:我也尝试过调查iOS是否会生成任何Darwin通知,您可以在方向锁定切换时拦截这些通知,以及是否有任何属性可以键入值 - 观察更改锁定状态......但是,没有找到任何可以替代解决问题的方法。
答案 1 :(得分:0)
您可以访问该功能,但调用似乎无法切换细胞数据。
void *ctPath = dlopen("/System/Library/PrivateFrameworks/CoreTelephony.framework/CoreTelephony", RTLD_LAZY);
void (*CTRegistrationSetCellularDataIsEnabled)(BOOL) = dlsym(ctPath, "CTRegistrationSetCellularDataIsEnabled");
if (CTRegistrationSetCellularDataIsEnabled) {
CTRegistrationSetCellularDataIsEnabled(YES);
}