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

有帮助吗?

解决方案

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

"出于安全原因,iPhone OS将应用程序(包括其首选项和数据)限制在文件系统中的唯一位置。此限制是称为应用程序“沙箱”的安全功能的一部分。沙箱是一组细粒度的控件,限制了应用程序对文件,首选项,网络资源,硬件等的访问。“
点击 设备的电话号码在应用程序的容器中不可用。您需要将应用程序修改为仅在目录容器中读取,然后将二进制文件重新提交到iTunes Connect,以便重新考虑App Store的应用程序。

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

其他提示

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

如果找到方法,将来会被禁用,因为之前的每种方法都会发生这种情况。

苹果在iOS 4上或其附近似乎已删除

更新功能


为了扩展早期的答案,这样的事情对我来说是这样的:

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

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

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

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

等等。

不确定其他人做了什么。

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

extern NSString* CTSettingCopyMyPhoneNumber();


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

return phone;
}

还包括CoreTelephony.framework到您的项目。

由于您可能已经准备好了解您是否使用以下代码行,Apple将拒绝您的应用

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

这是一个参考

http://ayeapi.blogspot.com/2009/12/ sbformatphonenumber-是-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 API来捕获电话号码(即使在具有私有API的私有应用程序中),因为从iOS 11开始,所有已知的执行此操作的方法都已经过修补和阻止。即使找到了新的漏洞, Apple明确表示他们将拒绝来自应用程序商店的任何应用程序,以使用私有API来执行此操作。有关详细信息,请参阅@ Dylan的答案。

但是,有一种合法的方式来捕获电话号码而无需任何用户数据输入。这类似于Snapchat,但更容易,因为它不需要用户输入他们自己的电话号码。

我们的想法是让应用程序以编程方式将SMS消息发送到具有应用程序唯一安装代码的服务器。然后,应用程序可以查询同一服务器,以查看它是否最近从具有此唯一应用程序安装代码的设备收到了SMS消息。如果有,它可以读取发送它的电话号码。这是一个显示该过程的演示视频。正如你所看到的,它就像一个魅力!

这不是很容易设置,但是在免费的AWS层上免费配置几个小时,并且教程中提供了示例代码这里

没有官方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上的 creker 所述使用JB ,您需要使用权利才能使其正常运行。

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

要获取电话号码,您可以阅读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。

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

  

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

第2.5.2节: https://developer.apple.com/app-store/review /准则/#软件要求

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top