有没有办法从iPhone SDK的标准api获得自己的电话号码?


当前回答

你不能单独使用iOS api来捕获电话号码(即使是在带有私有api的私有应用程序中),因为所有已知的方法都已在iOS 11中被修补和阻止。即使发现了新的漏洞,苹果已经明确表示,他们将拒绝应用商店中任何使用私有api进行攻击的应用程序。详见@Dylan的回答。

但是,有一种合法的方法可以在不输入任何用户数据的情况下获取电话号码。这与Snapchat的功能类似,但更简单,因为它不需要用户输入自己的电话号码。

这个想法是让应用程序以编程的方式向服务器发送一条短信,使用应用程序的唯一安装代码。然后,应用程序可以查询同一台服务器,以查看它最近是否收到了来自具有此唯一应用程序安装代码的设备的SMS消息。如果有,它可以读取发送它的电话号码。这里有一个演示视频展示了这个过程。正如你所看到的,它就像一个咒语!

这并不是非常容易设置,但是可以在几个小时内免费在AWS层上使用本教程中提供的示例代码进行配置。

其他回答

要得到你的电话号码,你可以读取一个plist文件。它将不能在非越狱设备上工作:

NSString *commcenter = @"/private/var/wireless/Library/Preferences/com.apple.commcenter.plist";
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:commcenter];
    NSString *PhoneNumber = [dict valueForKey:@"PhoneNumber"];
    NSLog([NSString stringWithFormat:@"Phone number: %@",PhoneNumber]);

我不知道苹果是否允许这样做,但它适用于iphone。

你可能已经知道,如果你使用下面这行代码,你的应用程序将会被苹果拒绝

NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];

这是参考资料

http://ayeapi.blogspot.com/2009/12/sbformatphonenumber-is-lie.html

您可以使用以下信息

NSString *phoneName = [[UIDevice currentDevice] name];

NSString *phoneUniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier];

等等

@property(nonatomic,readonly,retain) NSString    *name;              // e.g. "My iPhone"
@property(nonatomic,readonly,retain) NSString    *model;             // e.g. @"iPhone", @"iPod Touch"
@property(nonatomic,readonly,retain) NSString    *localizedModel;    // localized version of model
@property(nonatomic,readonly,retain) NSString    *systemName;        // e.g. @"iPhone OS"
@property(nonatomic,readonly,retain) NSString    *systemVersion;     // e.g. @"2.0"
@property(nonatomic,readonly) UIDeviceOrientation orientation;       // return current device orientation
@property(nonatomic,readonly,retain) NSString    *uniqueIdentifier;  // a string unique to each device based on various hardware info.

希望这能有所帮助!

更新:该功能似乎已被苹果在iOS 4或左右删除


为了扩展之前的答案,我想说的是:

NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];

注意:这将检索在iPhone的iTunes激活期间输入的“电话号码”,可以是null或错误的值。不是从SIM卡读取的。

至少在2.1中是这样的。在NSUserDefaults中还有其他一些有趣的键,它们可能也不会持续。(这是我的应用程序,它使用UIWebView)

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

等等。

不知道其他人做了什么,如果有的话。

不,没有合法可靠的方法来做这件事。

如果您找到了一种方法,它将在未来被禁用,就像之前的每个方法一样。

没有官方API来做这件事。使用私有API,您可以使用以下方法:

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

它可以在没有JB和特殊签名的iOS 6上运行。

正如上文提到的,在iOS 7和JB上,你需要使用授权来让它工作。

你可以在这里找到如何使用权利: iOS 7:如何通过私有API获得自己的号码?