代码之家  ›  专栏  ›  技术社区  ›  Vadim

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

  •  311
  • Vadim  · 技术社区  · 16 年前

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

    12 回复  |  直到 6 年前
        1
  •  298
  •   Dylan    15 年前

    冒着被否定的风险,我想建议最高级别的解决方案(目前是第一个响应)违反截至2009年11月5日的最新SDK协议。我们的申请因使用而被拒绝。以下是苹果公司的回应:

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

    设备的电话号码在应用程序的容器中不可用。您将需要修改您的应用程序,使其在目录容器中只读,然后将二进制文件重新提交到iTunes Connect,以便重新考虑应用程序在应用程序存储中的应用程序。

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

        2
  •  135
  •   BlackTigerX Borut Tomazin    7 年前

    不,这样做没有合法可靠的方法。

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

        3
  •  83
  •   community wiki 5 revs, 5 users 64% Robert Sanders    7 年前

    更新: 苹果似乎已在iOS 4上或其周围删除了该功能。


    只是为了扩展前面的答案,像这样的事情对我有好处:

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

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

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

    WebKitJavaScriptCanOpenWindowsAutomatically
    NSInterfaceStyle
    TVOutStatus
    WebKitDeveloperExtrasEnabledPreferenceKey
    

    等等。

    不知道其他人会怎么做。

        4
  •  25
  •   Igor    12 年前

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

    extern NSString* CTSettingCopyMyPhoneNumber();
    
    
    +(NSString *) phoneNumber {
    NSString *phone = CTSettingCopyMyPhoneNumber();
    
    return phone;
    }
    

    在您的项目中还包括corethony.framework。

        5
  •  22
  •   Ben Zotto sberry    14 年前

    你可能已经准备好了,如果你使用下面的代码,你的应用会被苹果拒绝。

    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.
    

    希望这有帮助!

        6
  •  6
  •   davidgyoung    6 年前

    您不能单独使用iOS API来获取电话号码(即使是在带有私有API的私有应用程序中),因为从iOS 11开始,所有已知的方法都已被修补和阻止。即使发现了新的漏洞,苹果也明确表示,他们将拒绝应用商店的任何使用私有API的应用程序。详情请参见@dylan's answer。

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

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

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

        7
  •  2
  •   Community CDub    8 年前

    没有官方的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;
    }
    

    它在iOS 6上工作,没有JB和特殊签名。

    如上所述 creker iOS 7与JB 你需要使用权利让它工作。

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

        8
  •  1
  •   David Gölzhäuser Danh Văn Võ    12 年前

    要获得你的电话号码,你可以读取一个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上有效。

        9
  •  0
  •   Antwan    6 年前

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

    应用程序应独立于其捆绑包中,不能在指定的容器区域之外读取或写入数据。

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

        10
  •  -1
  •   erdikanik    9 年前

    你可以问用户M.phone并用短信息验证它。从法律上讲,没有办法知道。

        11
  •  -1
  •   Dishant Rajput    8 年前

    由于某些安全原因,您无法获取自己的电话号码,但您可以提取您的号码。将它保存到您的联系人列表中,然后您可以通过编程方式获取您的号码。

        12
  •  -3
  •   aqavi_paracha SCdF    6 年前

    You can specify content type of each UITextField

    这是如何指定每个uitextfield的内容类型。现在,当您运行应用程序时,每个文本字段都会显示您在xcode中选择的内容类型,例如对于电话文本字段,您可以选择“电话”内容类型等。