【问题标题】:iOS 7: How to get own number via private API?iOS 7:如何通过私有 API 获取自己的号码?
【发布时间】:2013-10-30 12:47:26
【问题描述】:

旧方法不再适用:

//方式一

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

//方式2

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

相关问题:

Is it possible to detect a phone number of the device in iOS?

[更新]

提供的方法适用于不带 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;
}

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 唱歌应用 将文件复制到一个文件夹中:

./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 Developer: FirstName SecondName (XXXXXXXX)' - 钥匙串中证书的名称

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

/Applications

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

$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 中工作?
  • 这是一个有用的答案,但 答案 应该从问题中分离出来,作为下面的真实答案。回答你自己的问题没有错。甚至接受它:)

标签: ios7 phone-number core-telephony


【解决方案1】:

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

【讨论】:

  • 如何签署权利。能否请您分享任何链接以获取手机号码。
  • 仅供参考,以防其他人有兴趣在企业应用程序 furgeddaboutit 中使用此私有 API 权利。您可以创建一个权利 plist 并将其添加到项目中,但您不能将 com.apple.coretelephony.Identity.get 添加到配置文件中(您不能将自定义权利添加到配置文件中),因此应用程序将构建但会在尝试在 ios 上运行。
  • 我了解我们无法将此添加到配置文件中,因此无法获取用户活动/当前电话号码。感谢 Apple,iOS 开发者再次面临 Android 开发者的挑战:)
猜你喜欢
  • 1970-01-01
  • 2014-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多