如何在iOS(越狱设备)中以编程方式更改"Call Waiting"?



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

我所发现的是,电话设置调用-setCallWaitingEnabled:specifier:方法从PhoneSettingsCallWaitingController类发现这里。我发现它在/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>

我手动加载了bundle,初始化了上面的类并调用了我说的方法,但是什么也没有发生。下面是代码:

NSBundle *b = [NSBundle bundleWithPath:@"/System/Library/PreferenceBundles/MobilePhoneSettings.bundle"];
BOOL success = [b load];
if (success)
{
    NSLog(@"nnnn Bundle load successfull! nnnn ");
    Class PhoneSettingsCallWaitingController = NSClassFromString(@"PhoneSettingsCallWaitingController");
    id tc = [[PhoneSettingsCallWaitingController alloc] init];
    [tc setCallWaitingEnabled:0 specifier:0];
} else NSLog(@"nnnn Bundle load failure! nnnn ");

我不知道我走的路对不对。有没有其他方法可以开启/关闭呼叫等待设置?

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});

最新更新