ChatGPT解决这个技术问题 Extra ChatGPT

在 iOS 中以编程方式获取自己的电话号码

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

对于寻找不使用私有 api 的解决方案的其他人可能很有用 how-does-squares-cardcase-app-do-this - use device name to capture users name 只需修改以捕获电话号码或其他适当的详细信息
davidgyoung 提供了一个可行的解决方案。它被掩埋(需要一些支持)。

D
Dylan

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

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

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


@Dylan:您的应用程序何时被拒绝。也许指南已修改?请提供有用的文档链接。不过,我很欣赏你的回答。
我可以在提到的地方获得 apple.developer 文档链接吗?
我从未找到任何关于此的文档,但很想看到它。这是苹果对我来说仍然不透明的领域之一。从那以后,我没有尝试提交申请。
@rgbrgb 我不使用 Snapchat,你能解释一下他们如此神秘的经历吗?
@rgbrgb Snap 在注册时询问用户他们的号码。
B
BlackTigerX

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

如果您找到了一种方法,它将在未来被禁用,就像以前的每种方法一样。


请参阅 Nik Burn 的回答:stackoverflow.com/a/8415162/292166 - 有(某种)方法可以做到这一点!
您看到 Apple 不允许基于权限访问用户电话号码的最佳理由是什么? Apple 已经允许基于权限访问联系人、照片、位置以及用户的相机和麦克风。为什么没有电话号码?一定有充分的理由,但目前还不清楚。不幸的是,禁止访问会导致开发人员花费大量时间和金钱在其他方式上来验证用户的电话号码。
5
5 revs, 5 users 64%

更新:Apple 似乎在 iOS 4 上或附近删除了该功能

只是为了扩展较早的答案,这样的事情对我有用:

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

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

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

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

等等。

不知道其他人做了什么,如果有的话。


最近有一些媒体报道了这种能力背后的安全问题:theregister.co.uk/2009/09/30/iphone_security
不要这样做。通过键盘或联系人选择器向用户询问号码。您应该对用户尽可能明确地收集任何信息。这可能不是最方便的,但保存号码非常容易,因此您只需询问一次。
让应用程序被拒绝的解决方案不是解决方案。
I
Igor

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

extern NSString* CTSettingCopyMyPhoneNumber();


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

return phone;
}

还将 CoreTelephony.framework 包含到您的项目中。


在阅读了这个论坛的其他答案后,我认为这是不可能的,但你做得很完美
在 iOS 7 上,它受权利 stackoverflow.com/questions/19504478/… 保护
当我尝试这个时电话是零
B
Ben Zotto

你可能都知道如果你使用以下代码行,你的应用程序将被 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.

希望这可以帮助!


在 iOS5 中也弃用了 uniqueIdentifier。请改用 MAC 地址。
MAC 地址在 iOS 7 中已弃用。请改用 [UIDevice identifierForVendor]
d
davidgyoung

您不能单独使用 iOS API 来捕获电话号码(即使在具有私有 API 的私有应用程序中),因为所有已知的执行此操作的方法在 iOS 11 中都已被修补和阻止。即使发现新的漏洞,Apple 已经明确表示他们将拒绝来自应用商店的任何应用使用私有 API 来执行此操作。有关详细信息,请参阅@Dylan 的答案。

但是,有一种合法的方法可以在不输入任何用户数据的情况下捕获电话号码。这类似于 Snapchat 所做的,但更简单,因为它不需要用户输入自己的电话号码。

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

这不是很容易设置,但是使用教程 here 中提供的示例代码在免费 AWS 层级上免费配置几个小时。


对不起。视频不小心被私密了。现在是公开的。
这是一个很好的方法,但是您能否丰富您的答案以至少涵盖基本的实施细节?如何在不知道电话号码的情况下从 iOS 设备发送短信?您如何设置可以访问发件人电话号码的 SMS 接收服务器?涉及哪些工具?兼容性?
@MottiShneor,您在答案中看到教程链接了吗?这包含有关设置此解决方案的完整教程以及 Github 存储库中的工作示例应用程序代码。
D
David Gölzhäuser

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


Apple 使越狱手机的保修失效,并且应用程序需要为所有用户提供无处不在的功能。
C
Community

没有官方 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 with JB 上提到的creker,您需要使用权利才能使其正常工作。

如何使用您可以在此处找到的权利:iOS 7: How to get own number via private API?


A
Antwan

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

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

第 2.5.2 节:https://developer.apple.com/app-store/review/guidelines/#software-requirements