iOS 7:如何通过私有API获取自己的号码?

0x8*_*00D 14 phone-number core-telephony ios7

旧方法不再起作用:

//方式1

void *lib = dlopen("/Symbols/System/Library/Framework/CoreTelephony.framework/CoreTelephony", RTLD_LAZY);
NSString* (*getPhoneNumber)() = dlsym(lib, "CTSettingCopyMyPhoneNumber");

if (getPhoneNumber == nil) {
    NSLog(@"getPhoneNumber is nil");
    return nil;
}
NSString* ownPhoneNumber = getPhoneNumber();
Run Code Online (Sandbox Code Playgroud)

//方式2

extern NSString* CTSettingCopyMyPhoneNumber();
NSString *phone = CTSettingCopyMyPhoneNumber();
Run Code Online (Sandbox Code Playgroud)

相关问题:

是否可以在iOS中检测设备的电话号码?

[UPDATE]

提供的方法适用于不带JB的iOS 6.1.4和带有JB的iOS 7.1.2

感谢用户creker提示!

要获得号码,您必须使用以下方式:

1.代码

-(NSString*) getMyNumber {
    NSLog(@"Open CoreTelephony");
    void *lib = dlopen("/Symbols/System/Library/Framework/CoreTelephony.framework/CoreTelephony",RTLD_LAZY);
    NSLog(@"Get CTSettingCopyMyPhoneNumber from CoreTelephony");
    NSString* (*pCTSettingCopyMyPhoneNumber)() = dlsym(lib, "CTSettingCopyMyPhoneNumber");
    NSLog(@"Get CTSettingCopyMyPhoneNumber from CoreTelephony");

    if (pCTSettingCopyMyPhoneNumber == nil) {
        NSLog(@"pCTSettingCopyMyPhoneNumber is nil");
        return nil;
    }
    NSString* ownPhoneNumber = pCTSettingCopyMyPhoneNumber();
    dlclose(lib);
    return ownPhoneNumber;
}
Run Code Online (Sandbox Code Playgroud)

2.无需签名即构建应用程序 在此输入图像描述

3.使用以下内容创建xml文件(entitlements.xml):

<?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>com.apple.coretelephony.Calls.allow</key>
        <true/>
        <key>com.apple.coretelephony.Identity.get</key>
        <true/>
    </dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

哪里:

com.apple.coretelephony.Calls.allow - 用于通话

com.apple.coretelephony.Identity.get - 获取自己的号码

4.使用entitlements.xml唱出应用程序将文件复制到一个文件夹中:

./FolderForRunSinging/
    YourApp.app
    entitlements.xml
Run Code Online (Sandbox Code Playgroud)

entitlements.xml - 创建的xml

YourApp.app - 从XCode文件复制的应用程序的二进制文件要查找可以使用的二进制文件命令:

$ls -la ~/Library/Developer/Xcode/DerivedData/ | grep YourApp
Run Code Online (Sandbox Code Playgroud)

路径应该是这样的:

/Users/username/Library/Developer/Xcode/DerivedData/YourApp-cktasembftvbmqaaiiunvljdwocs/Build/Products/Debug-iphoneos/YourApp.app
Run Code Online (Sandbox Code Playgroud)

跑唱歌命令:

$codesign --sign='iPhone Developer: FirstName  SecondName (XXXXXXXX)’
--entitlements entitlements.xml YourApp.app
Run Code Online (Sandbox Code Playgroud)

'iPhone Developer:FirstName SecondName(XXXXXXXX)' - 钥匙串中证书的名称

在此输入图像描述

5. 使用ssh to folder 将应用程序YourApp.app复制到您的设备上

/Applications
Run Code Online (Sandbox Code Playgroud)

6.重新启动跳板(在设备上运行):

$su mobile -c uicache 1>/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

工作样本可以在github上找到

iOS 7.1.2上的结果(需要JB!):

在此输入图像描述

结果在iOS 6.1.3上(没有JB工作,没有特殊的签名只是构建和运行)

在此输入图像描述

cre*_*ker 9

要使用此API,您需要com.apple.coretelephony.Identity.get使用布尔值设置为true的权利对您的应用进行签名.

  • 仅供参考,以防万一其他人有兴趣在企业应用程序中使用此私有 API 权利,furgeddaboutit。您可以创建一个权利 plist 并将其添加到项目中,但您无法将 com.apple.coretelephony.Identity.get 添加到配置文件中(您无法将自定义权利添加到配置文件中),因此应用程序将构建,但在以下情况下会崩溃尝试在ios上运行。 (2认同)