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