【问题标题】:How to change "Call Waiting" programmatically in iOS (jailbreak device)?如何在 iOS(越狱设备)中以编程方式更改“呼叫等待”?
【发布时间】:2014-08-24 06:07:02
【问题描述】:

我不想以编程方式打开/关闭 iPhone 的呼叫等待功能(可以在 Settings > Phone > Call Waiting 找到)。

我发现手机设置从PhoneSettingsCallWaitingController 类找到here 调用-setCallWaitingEnabled:specifier: 方法。我在/System/Library/PreferenceBundles/MobilePhoneSettings.bundle/Call Waiting.plist找到它:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>id</key>
    <string>com.apple.preferences.phone.call-waiting</string>
    <key>items</key>
    <array>
        <dict>
            <key>cell</key>
            <string>PSGroupCell</string>
        </dict>
        <dict>
            <key>cell</key>
            <string>PSSwitchCell</string>
            <key>get</key>
            <string>callWaitingEnabled:</string>
            <key>label</key>
            <string>Call Waiting</string>
            <key>set</key>
            <string>setCallWaitingEnabled:specifier:</string>
        </dict>
    </array>
    <key>title</key>
    <string>Call Waiting</string>
</dict>
</plist>

我手动加载了包并初始化了上面的类并调用了我说的方法,但没有任何反应。代码如下:

NSBundle *b = [NSBundle bundleWithPath:@"/System/Library/PreferenceBundles/MobilePhoneSettings.bundle"];
BOOL success = [b load];
if (success)
{

    NSLog(@"\n\n\n\n Bundle load successfull! \n\n\n\n ");
    Class PhoneSettingsCallWaitingController = NSClassFromString(@"PhoneSettingsCallWaitingController");
    id tc = [[PhoneSettingsCallWaitingController alloc] init];

    [tc setCallWaitingEnabled:0 specifier:0];

} else NSLog(@"\n\n\n\n Bundle load failure! \n\n\n\n ");

我不知道我是否走在正确的道路上。还有其他方法可以打开/关闭呼叫等待设置吗?

【问题讨论】:

  • 这看起来像一个 UI 控制器,由从网络获取的数据驱动。要禁用呼叫等待,您需要使用 SS 代码。完整的代码列表位于:etsi.org/deliver/etsi_ts/122000_122099/122030/10.00.00_60/…
  • @Petesh 感谢您的回答。我找不到任何关于运行 SS 代码的信息。你知道怎么做吗?
  • 不知道,可能是通过调制解调器接口。

标签: ios iphone jailbreak cydia-substrate


【解决方案1】:

CoreTelephony.framework 私有 API 的声明

CF_EXTERN_C_BEGIN

CF_EXPORT CFNotificationCenterRef CTTelephonyCenterGetDefault();
CF_EXPORT void CTTelephonyCenterAddObserver(CFNotificationCenterRef center, const void *observer, CFNotificationCallback callBack, CFStringRef name, const void *object, CFNotificationSuspensionBehavior suspensionBehavior);

CF_EXPORT void CTSettingRequest(NSDictionary* dict);
CF_EXPORT void CTSettingSave(NSDictionary* dict);

CF_EXPORT NSString* kCTSettingCallClassVoice;
CF_EXPORT NSString* kCTSettingTypeCallWaiting;
CF_EXPORT NSString* kCTSettingType;
CF_EXPORT NSString* kCTSettingCallClass;
CF_EXPORT NSString* kCTSettingEnabled;

CF_EXTERN_C_END

设置请求和保存是异步完成的。结果将发送到电话中心回拨:

void SettingCallback(CFNotificationCallback center, void* observer, NSString* name, const void* objec, NSDictionary* userInfo)
{
    if ([name isEqualToString:@"kCTSettingRequestSuccessNotification"])
    {
        //Setting request results are in 'userInfo' argument
    }
    else if ([name isEqualToString:@"kCTSettingRequestErrorNotification"])
    {
        //Setting request error
    }
    else if ([name isEqualToString:@"kCTSettingSaveSuccessNotification"])
    {
        //Setting saved
    }
    else if ([name isEqualToString:@"kCTSettingSaveErrorNotification"])
    {
        //Setting save error
    }
}

...

CTTelephonyCenterAddObserver(CTTelephonyCenterGetDefault(), NULL, SettingCallback, NULL, NULL, CFNotificationSuspensionBehaviorHold);

请求呼叫等待设置:

CTSettingRequest(@{@"STSettingTypeUniqueIdentifier" : kCTSettingTypeCallWaiting,
                   kCTSettingCallClass : kCTSettingCallClassVoice, 
                   kCTSettingType : kCTSettingTypeCallWaiting});

保存呼叫等待设置(在本例中为启用):

CTSettingSave(@{@"STSettingTypeUniqueIdentifier" : kCTSettingTypeCallWaiting,
                kCTSettingCallClass : kCTSettingCallClassVoice, 
                kCTSettingType : kCTSettingTypeCallWaiting, 
                kCTSettingEnabled : @YES});

【讨论】:

  • @creker 非常感谢。我觉得你的回答有点问题。我认为您的答案中 CoreTelephony 声明的前 4 行之前应该有 extern "C"
  • 我也有一个问题:如何找到其他字符串来更改其他设置?您是如何找到这些函数的?
  • 只有在使用来自 obj-c++ 代码的声明时才需要 extern "C"。否则不需要。
  • 我使用反汇编您在问题中提到的首选项包编写了该代码。
  • @creker谢谢!我正在使用 objc(我正在使用 Xcode 和 iOSOpenDev 进行编译,所以我猜它是 objc!)如果我不输入 extern "C" 它会给我一个错误。你知道在 iOS 中开始反汇编有什么好的参考吗?
猜你喜欢
  • 1970-01-01
  • 2014-05-16
  • 2023-04-11
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
相关资源
最近更新 更多