以编程方式在 iOS 中获取自己的电话号码

Programmatically get own phone number in iOS

提问人:Vadim 提问时间:10/11/2008 最后编辑:Midhun MPVadim 更新时间:1/2/2019 访问量:234492

问:

有没有办法通过iPhone SDK的标准API获取自己的电话号码?

iOS iPhone 电话号码

评论

0赞 Nik Burns 12/7/2011
对于搜索不使用私有 API 的解决方案的其他人可能很有用 how-does-squares-cardcase-app-do-this - 使用设备名称捕获用户名,只需根据需要修改以捕获电话号码或其他详细信息
0赞 P i 9/25/2018
Davidgyoung提供了一个可行的解决方案。它被埋葬了(需要一些赞成票)。

答:

139赞 Andrew Grant 10/11/2008 #1

不,没有合法可靠的方法可以做到这一点。

如果你找到一种方法,它将在将来被禁用,就像以前每种方法一样。

评论

2赞 JosephH 6/10/2013
请看 Nik Burn 的回答: stackoverflow.com/a/8415162/292166 - 有一种(某种)方法可以做到这一点!
4赞 Crashalot 3/22/2016
您认为 Apple 不允许基于权限访问用户电话号码的最佳原因是什么?Apple 已经允许基于权限访问联系人、照片、位置以及用户的摄像头和麦克风。为什么不是电话号码?一定有一个很好的理由,但并不清楚。这很不幸,因为禁止访问会导致开发人员花费大量时间和金钱在其他方式上验证用户的电话号码。
86赞 5 revs, 5 users 64%Robert Sanders #2

更新:Apple 似乎已在 iOS 4 上或前后删除了该功能


只是为了扩展前面的答案,像这样的东西为我做了:

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

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

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

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

等等。

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

评论

1赞 JeffH 9/30/2009
最近有一些关于这种能力背后的安全问题的媒体:theregister.co.uk/2009/09/30/iphone_security
11赞 David Kanarek 1/19/2010
别这样。通过键盘或联系人选择器向用户询问号码。您应尽可能明确地向用户收集任何信息。它可能不是最方便的,但保存号码非常容易,所以你只需要要求一次。
4赞 averydev 10/28/2011
拒绝应用的解决方案不是解决方案。
328赞 Dylan 11/6/2009 #3

冒着被打负的风险,我想建议排名最高的解决方案(目前是第一个响应)违反了截至 2009 年 11 月 5 日的最新 SDK 协议。我们的申请刚刚被拒绝使用它。以下是苹果的回应:

“出于安全原因,iPhone OS将应用程序(包括其首选项和数据)限制在文件系统中的唯一位置。此限制是称为应用程序“沙盒”的安全功能的一部分。沙盒是一组细粒度控件,用于限制应用程序对文件、首选项、网络资源、硬件等的访问。

设备的电话号码在应用程序的容器中不可用。您需要将应用程序修改为在目录容器中只读,并将二进制文件重新提交到 iTunes Connect,以便重新考虑应用程序是否用于 App Store。


这真的很令人失望,因为我们想让用户不必输入自己的电话号码。

评论

1赞 Abhishek Bedi 5/20/2013
@Dylan : 您的应用何时被拒绝。也许指南被修改了?请提供有用的文档链接。但是,我很欣赏你的回答。
1赞 Ganesh AB 8/18/2015
我可以在提到这一点的地方获得 apple.developer 文档链接吗?
3赞 Dylan 5/10/2016
我从未找到任何关于此的文档,但很想看到它。这是苹果对我来说一直不透明的领域之一。从那以后,我就没有尝试过提交申请。
1赞 William Entriken 10/9/2017
@rgbrgb我不使用 Snapchat,你能解释一下他们如此神秘的经历吗?
1赞 Sam 2/22/2018
@rgbrgb Snap 在注册时会要求用户提供他们的号码。
23赞 Andres Garcia 5/25/2010 #4

您可能都知道,如果您使用以下代码行,您的应用程序将被 Apple 拒绝

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.

希望这有帮助!

评论

9赞 Raptor 1/6/2012
uniqueIdentifier 在 iOS5 中也被弃用。请改用 MAC 地址。
15赞 jab 11/21/2013
MAC 地址在 iOS 7 中已弃用。请改用。[UIDevice identifierForVendor]
29赞 Igor 8/30/2012 #5

使用 Private API,您可以通过以下方式获取用户电话号码:

extern NSString* CTSettingCopyMyPhoneNumber();


+(NSString *) phoneNumber {
NSString *phone = CTSettingCopyMyPhoneNumber();

return phone;
}

此外,将 CoreTelephony.framework 包含在项目中。

评论

0赞 Mehul Thakkar 12/11/2013
在阅读了这个论坛上的其他答案后,我认为这是不可能的,但你做得很好
1赞 creker 4/30/2014
在 iOS 7 上,它受授权 stackoverflow.com/questions/19504478/ 保护...
0赞 C0D3 9/13/2016
当我尝试这个时,电话是零
2赞 David Gölzhäuser 3/28/2013 #6

要获取您的电话号码,您可以阅读 plist 文件。它不适用于非越狱的iDevices:

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

我不知道 Apple 是否允许这样做,但它适用于 iPhone。

评论

0赞 Cosmtar 1/15/2020
苹果取消了越狱手机的保修,应用程序需要为所有用户提供无处不在的功能。
2赞 0x8BADF00D 9/19/2014 #7

没有官方 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。

如前所述,在带有 JB 的 iOS 7 上,您需要使用授权才能使其工作。

如何使用您可以在此处找到的权利: iOS 7:如何通过私有 API 获取自己的号码?

27赞 davidgyoung 7/14/2018 #8

您不能单独使用 iOS API 来捕获电话号码(即使在具有私有 API 的私有应用程序中也是如此),因为自 iOS 11 起,所有已知的执行此操作的方法都已被修补和阻止。即使发现新的漏洞,苹果也明确表示,他们将拒绝应用商店中任何使用私有 API 的应用程序。有关详细信息,请参阅@Dylan的回答。

但是,有一种合法的方法可以在不输入任何用户数据的情况下捕获电话号码。这类似于 Snapchat 所做的,但更容易,因为它不需要用户输入自己的电话号码。

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

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

评论

0赞 davidgyoung 11/29/2018
不好意思。视频意外地被私密了。它现在是公开的。
1赞 Motti Shneor 2/6/2019
这是一个很好的方法,但你能丰富你的答案,至少涵盖基本的实现细节吗?如何在不知道电话号码的情况下从 iOS 设备发送短信?如何设置可以访问发件人电话号码的短信接收服务器?涉及哪些工具?兼容性?
0赞 davidgyoung 2/6/2019
@MottiShneor,你在答案中看到教程链接了吗?这包含有关设置此解决方案的完整教程,以及 Github 存储库中的工作示例应用代码。
0赞 Alex Matchneer 10/8/2022
有没有人实施这种方法并部署到 App Store?好奇App Store Review(或更新的Play Store Review)是否会对此有问题。
1赞 davidgyoung 10/9/2022
我将其用于企业应用程序,因此我没有将其发送以供审核。但是,由于用户可以控制通过他们看到的对话框发送SMS消息,因此我怀疑Apple或Google是否会有问题,前提是您披露您正在发送SMS以验证他们的电话号码。
1赞 Jonovono 3/17/2023
这是天才,可能会在 2023 年在应用商店应用程序中尝试一下,看看它是否成功
1赞 thedazed 8/30/2018 #9

AppStore 将拒绝它,因为它正在到达应用程序容器之外。

应用应独立包含在其捆绑包中,并且不得在指定的容器区域之外读取或写入数据

Section 2.5.2 : https://developer.apple.com/app-store/review/guidelines/#software-requirements