有没有办法从iPhone SDK的标准api获得自己的电话号码?


当前回答

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

"For security reasons, iPhone OS restricts an application (including its preferences and data) to a unique location in the file system. This restriction is part of the security feature known as the application's "sandbox." The sandbox is a set of fine-grained controls limiting an application's access to files, preferences, network resources, hardware, and so on." The device's phone number is not available within your application's container. You will need to revise your application to read only within your directory container and resubmit your binary to iTunes Connect in order for your application to be reconsidered for the App Store.

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

其他回答

你可能已经知道,如果你使用下面这行代码,你的应用程序将会被苹果拒绝

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来做这件事。使用私有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层上使用本教程中提供的示例代码进行配置。