提问人:Vadim 提问时间:10/11/2008 最后编辑:Midhun MPVadim 更新时间:1/2/2019 访问量:234492
以编程方式在 iOS 中获取自己的电话号码
Programmatically get own phone number in iOS
答:
不,没有合法可靠的方法可以做到这一点。
如果你找到一种方法,它将在将来被禁用,就像以前每种方法一样。
评论
更新:Apple 似乎已在 iOS 4 上或前后删除了该功能
只是为了扩展前面的答案,像这样的东西为我做了:
NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];
注意:这将检索在iPhone的iTunes激活期间输入的“电话号码”,并且可以为null或不正确的值。它不是从 SIM 卡中读取的。
至少在 2.1 中是这样。NSUserDefaults 中还有其他几个有趣的键,它们也可能不会持续下去。(这是在我的应用程序中,它使用 UIWebView)
WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey
等等。
不知道其他人做了什么,如果有的话。
评论
冒着被打负的风险,我想建议排名最高的解决方案(目前是第一个响应)违反了截至 2009 年 11 月 5 日的最新 SDK 协议。我们的申请刚刚被拒绝使用它。以下是苹果的回应:
“出于安全原因,iPhone OS将应用程序(包括其首选项和数据)限制在文件系统中的唯一位置。此限制是称为应用程序“沙盒”的安全功能的一部分。沙盒是一组细粒度控件,用于限制应用程序对文件、首选项、网络资源、硬件等的访问。
设备的电话号码在应用程序的容器中不可用。您需要将应用程序修改为在目录容器中只读,并将二进制文件重新提交到 iTunes Connect,以便重新考虑应用程序是否用于 App Store。
这真的很令人失望,因为我们想让用户不必输入自己的电话号码。
评论
您可能都知道,如果您使用以下代码行,您的应用程序将被 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.
希望这有帮助!
评论
[UIDevice identifierForVendor]
使用 Private API,您可以通过以下方式获取用户电话号码:
extern NSString* CTSettingCopyMyPhoneNumber();
+(NSString *) phoneNumber {
NSString *phone = CTSettingCopyMyPhoneNumber();
return phone;
}
此外,将 CoreTelephony.framework 包含在项目中。
评论
要获取您的电话号码,您可以阅读 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。
评论
没有官方 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 获取自己的号码?
您不能单独使用 iOS API 来捕获电话号码(即使在具有私有 API 的私有应用程序中也是如此),因为自 iOS 11 起,所有已知的执行此操作的方法都已被修补和阻止。即使发现新的漏洞,苹果也明确表示,他们将拒绝应用商店中任何使用私有 API 的应用程序。有关详细信息,请参阅@Dylan的回答。
但是,有一种合法的方法可以在不输入任何用户数据的情况下捕获电话号码。这类似于 Snapchat 所做的,但更容易,因为它不需要用户输入自己的电话号码。
这个想法是让应用程序以编程方式向服务器发送一条短信,其中包含应用程序的唯一安装代码。然后,应用可以查询同一服务器,以查看它最近是否收到了来自具有此唯一应用安装代码的设备发送的短信。如果有,它可以读取发送它的电话号码。这是一个演示视频,展示了这个过程。正如你所看到的,它就像一个魅力!
这不是非常容易设置,但可以使用此处教程中提供的示例代码在几个小时内在免费的 AWS 套餐上免费配置。
评论
AppStore 将拒绝它,因为它正在到达应用程序容器之外。
应用应独立包含在其捆绑包中,并且不得在指定的容器区域之外读取或写入数据
Section 2.5.2 : https://developer.apple.com/app-store/review/guidelines/#software-requirements
评论