有没有办法从iPhone SDK的标准api获得自己的电话号码?
当前回答
你不能单独使用iOS api来捕获电话号码(即使是在带有私有api的私有应用程序中),因为所有已知的方法都已在iOS 11中被修补和阻止。即使发现了新的漏洞,苹果已经明确表示,他们将拒绝应用商店中任何使用私有api进行攻击的应用程序。详见@Dylan的回答。
但是,有一种合法的方法可以在不输入任何用户数据的情况下获取电话号码。这与Snapchat的功能类似,但更简单,因为它不需要用户输入自己的电话号码。
这个想法是让应用程序以编程的方式向服务器发送一条短信,使用应用程序的唯一安装代码。然后,应用程序可以查询同一台服务器,以查看它最近是否收到了来自具有此唯一应用程序安装代码的设备的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和JB上,你需要使用授权来让它工作。
你可以在这里找到如何使用权利: iOS 7:如何通过私有API获得自己的号码?
你不能单独使用iOS api来捕获电话号码(即使是在带有私有api的私有应用程序中),因为所有已知的方法都已在iOS 11中被修补和阻止。即使发现了新的漏洞,苹果已经明确表示,他们将拒绝应用商店中任何使用私有api进行攻击的应用程序。详见@Dylan的回答。
但是,有一种合法的方法可以在不输入任何用户数据的情况下获取电话号码。这与Snapchat的功能类似,但更简单,因为它不需要用户输入自己的电话号码。
这个想法是让应用程序以编程的方式向服务器发送一条短信,使用应用程序的唯一安装代码。然后,应用程序可以查询同一台服务器,以查看它最近是否收到了来自具有此唯一应用程序安装代码的设备的SMS消息。如果有,它可以读取发送它的电话号码。这里有一个演示视频展示了这个过程。正如你所看到的,它就像一个咒语!
这并不是非常容易设置,但是可以在几个小时内免费在AWS层上使用本教程中提供的示例代码进行配置。
你可能已经知道,如果你使用下面这行代码,你的应用程序将会被苹果拒绝
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.
希望这能有所帮助!
AppStore会拒绝它,因为它超出了应用容器。
应用程序应该在它们的包中是自包含的,并且不能读取或写入指定容器区域之外的数据
第2.5.2节: https://developer.apple.com/app-store/review/guidelines/#software-requirements
使用私有API,您可以通过以下方式获取用户电话号码:
extern NSString* CTSettingCopyMyPhoneNumber();
+(NSString *) phoneNumber {
NSString *phone = CTSettingCopyMyPhoneNumber();
return phone;
}
也可以将coretphony .framework包含到你的项目中。
推荐文章
- Xcode 4 -在新的Macintosh安装上的配置文件上“没有找到有效的签名标识”错误
- 在iPhone上确定用户是否启用了推送通知
- 是否有可能禁用浮动头在UITableView与UITableViewStylePlain?
- 错误ITMS-9000:“冗余二进制文件上传。火车1.0版本已经有一个二进制版本上传。
- Swift -转换为绝对值
- 从父iOS访问容器视图控制器
- 自定义dealloc和ARC (Objective-C)
- 调整UITableView的大小以适应内容
- 在代码中为UIButton设置一个图像
- NSRange从Swift Range?
- UICollectionView中的单元格间距
- 我如何在我的iOS应用程序中每n分钟得到一个后台位置更新?
- 如何使用iOS创建GUID/UUID
- 禁用所呈现视图控制器的交互式撤销
- 点击按钮时如何打开手机设置?