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

14

旧方法已经行不通:

// 方法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();

// 第二种方法

extern NSString* CTSettingCopyMyPhoneNumber();
NSString *phone = CTSettingCopyMyPhoneNumber();

相关问题:

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

[更新]

提供的方法在iOS 6.1.4(未越狱)和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;
}

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>

在哪里:

com.apple.coretelephony.Calls.allow — 用于电话

com.apple.coretelephony.Identity.get — 用于获取自己的号码

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

./FolderForRunSinging/
    YourApp.app
    entitlements.xml

entitlements.xml - 创建的XML文件

YourApp.app - 从XCode文件中复制的您的应用程序二进制文件。 要查找您的二进制文件的位置,可以使用以下命令:

$ls -la ~/Library/Developer/Xcode/DerivedData/ | grep YourApp

路径应该像这样:

/Users/username/Library/Developer/Xcode/DerivedData/YourApp-cktasembftvbmqaaiiunvljdwocs/Build/Products/Debug-iphoneos/YourApp.app

运行唱歌命令:

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

iPhone 开发者:FirstName SecondName(XXXXXXXX)- 在钥匙串中的证书名称

enter image description here

5. 使用ssh将应用程序YourApp.app复制到设备上的文件夹中

'
/Applications

6. 重启SpringBoard(在设备上运行):

$su mobile -c uicache 1>/dev/null 2>&1

可在Github上找到工作示例。

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

输入图像描述

iOS 6.1.3的结果(无需JB和特殊签名,只需构建并运行):

输入图像描述


示例在iOS 8.4中无法工作。它需要进行额外的处理才能在Xcode 6.4中正常工作吗? - Peer Mohamed Thabib
2
这是一个有用的答案,但是应该将“答案”从问题中分离出来,作为真正的答案放在下面。回答自己的问题没有任何问题。甚至可以接受它 :) - Nate
1个回答

9
为了使用此API,您需要使用授权com.apple.coretelephony.Identity.get签署您的应用程序,并将布尔值设置为true。

如何签署权限?您能分享任何获取手机号码的链接吗? - Kittu
2
提供参考,如果有其他人想在企业应用中使用此私有API授权,请忘了它。您可以创建一个授权清单并将其添加到项目中,但是您无法将com.apple.coretelephony.Identity.get添加到配置文件中(您无法将自定义授权添加到配置文件中),因此该应用程序将构建但在尝试在iOS上运行时会崩溃。 - Nostradamus
我知道我们无法将这个添加到配置文件中,因此无法获取用户的活动/当前电话号码。谢谢Apple,再次iOS开发者面临着与安卓开发者的另一个挑战 :) - ondermerol

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