【问题标题】:Programmatically get own phone number in iOS在 iOS 中以编程方式获取自己的电话号码
【发布时间】:2011-04-21 03:18:10
【问题描述】:

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

【问题讨论】:

标签: ios iphone phone-number


【解决方案1】:

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

如果你找到了方法,它会在未来被禁用,就像以前的每个方法一样。

【讨论】:

  • 查看 Nik Burn 的回答:stackoverflow.com/a/8415162/292166 - 有(某种)方法可以做到这一点!
  • 您看到 Apple 禁止基于权限访问用户电话号码的最佳理由是什么? Apple 已经允许基于权限访问联系人、照片、位置以及用户的相机和麦克风。为什么没有电话号码?一定有充分的理由,但目前还不清楚。不幸的是,禁止访问会导致开发人员花费大量时间和金钱来验证用户的电话号码。
【解决方案2】:

更新:功能似乎已被 Apple 在 iOS 4 或前后移除


只是为了扩展之前的答案,这样的事情对我有用:

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

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

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

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

等等。

不确定其他人会做什么,如果有的话。

【讨论】:

  • 最近有一些媒体报道了这种能力背后的安全问题:theregister.co.uk/2009/09/30/iphone_security
  • 别这样。通过键盘或联系人选择器向用户询问号码。您应该对用户尽可能明确地收集任何信息。这可能不是最方便的,但保存号码非常容易,因此您只需要求一次。
  • 应用被拒绝的解决方案不是解决方案。
【解决方案3】:

冒着得到负分的风险,我想建议排名最高的解决方案(目前是第一响应)违反了截至 2009 年 11 月 5 日的最新 SDK 协议。我们的应用程序刚刚因为使用它而被拒绝。以下是 Apple 的回复:

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

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

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

【讨论】:

  • @Dylan :您的应用程序何时被拒绝。也许指南已修改?请提供有用的文档链接。不过,我很感谢您的回答。
  • 我可以在提到的地方获取 apple.developer 文档链接吗?
  • 我从未找到任何关于此的文档,但很想看看。这是苹果对我来说仍然不透明的领域之一。从那以后我没有尝试提交申请。
  • @rgbrgb 我不使用 Snapchat,你能解释一下他们如此神秘的经历吗?
  • @rgbrgb Snap 在注册时询问用户他们的号码。
【解决方案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.

希望这会有所帮助!

【讨论】:

  • uniqueIdentifier 在 iOS5 中也被弃用了。请改用 MAC 地址。
  • MAC 地址在 iOS 7 中已弃用。请改用 [UIDevice identifierForVendor]
【解决方案5】:

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

extern NSString* CTSettingCopyMyPhoneNumber();


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

return phone;
}

还将 CoreTelephony.framework 包含到您的项目中。

【讨论】:

  • 在阅读了这个论坛的其他答案后,我认为这是不可能的,但你做得很好
  • 在 iOS 7 上,它受权利保护 stackoverflow.com/questions/19504478/…
  • 我尝试这个时手机是零
【解决方案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。

【讨论】:

  • Apple 使越狱手机的保修失效,并且应用程序需要为所有用户提供无处不在的功能。
【解决方案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 上运行。

正如在 iOS 7 with JB 上提到的 creker,您需要使用权利才能使其正常工作。

如何使用您可以在此处找到的权利: iOS 7: How to get own number via private API?

【讨论】:

    【解决方案8】:

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

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

    这个想法是让应用程序以编程方式向服务器发送一条带有应用程序唯一安装代码的 SMS 消息。然后,该应用程序可以查询同一服务器,以查看它最近是否收到了来自具有此唯一应用程序安装代码的设备的 SMS 消息。如果有,它可以读取发送它的电话号码。这是一个demo video 显示该过程。如您所见,它就像一个魅力!

    这不是很容易设置,但是使用教程here 中提供的示例代码,它可以在免费的 AWS 层上免费配置几个小时。

    【讨论】:

    • 对不起。视频不小心被私密了。现已公开。
    • 这是一个很好的方法,但是您能否丰富您的答案以至少涵盖基本的实施细节?如何在不知道电话号码的情况下从 iOS 设备发送短信?您如何设置可以访问发件人电话号码的 SMS 接收服务器?涉及哪些工具?兼容性?
    • @MottiShneor,您看到答案中的教程链接了吗?这包含有关设置此解决方案的完整教程以及 Github 存储库中的工作示例应用程序代码。
    【解决方案9】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 2011-08-22
      • 2013-06-22
      • 2012-03-19
      • 1970-01-01
      相关资源
      最近更新 更多