รับหมายเลขโทรศัพท์ของตัวเองใน iOS โดยทางโปรแกรม


330

มีวิธีรับหมายเลขโทรศัพท์ของตัวเองด้วย API มาตรฐานจาก iPhone SDK หรือไม่


อาจเป็นประโยชน์สำหรับผู้อื่นที่ค้นหาโซลูชันที่ไม่ได้ใช้วิธีการไม่เป็นส่วนตัวสี่เหลี่ยมจัตุรัส -cardcase-app-do-this - ใช้ชื่ออุปกรณ์เพื่อดักจับชื่อผู้ใช้เพียงแค่แก้ไขหมายเลขโทรศัพท์หรือรายละเอียดอื่น ๆ ตามความเหมาะสม
Nik Burns

davidgyoung ได้ให้วิธีการแก้ปัญหาการทำงาน มันถูกฝังอยู่ (ต้องการ upvotes บางอย่าง)
ฉัน

ตอนนี้เป็นไปได้ใน Xcode เช่นstackoverflow.com/a/54004224/536214
aqavi_paracha

คำตอบ:


318

ด้วยความเสี่ยงในการได้รับเครื่องหมายลบฉันต้องการแนะนำว่าโซลูชันที่มีอันดับสูงสุด (ปัจจุบันเป็นคำตอบแรก) ละเมิดข้อตกลง SDK ล่าสุด ณ วันที่ 5 พ.ย. 2552 ใบสมัครของเราถูกปฏิเสธการใช้งาน นี่คือคำตอบจาก Apple:

"ด้วยเหตุผลด้านความปลอดภัย iPhone OS จำกัด แอปพลิเคชั่น (รวมถึงการตั้งค่าและข้อมูล) ไปยังตำแหน่งที่ไม่ซ้ำกันในระบบไฟล์ข้อ จำกัด นี้เป็นส่วนหนึ่งของคุณสมบัติความปลอดภัยที่รู้จักกันในชื่อ" sandbox "ของแอปพลิเคชัน การควบคุมแบบเม็ดเล็ก จำกัด การเข้าถึงไฟล์การตั้งค่าทรัพยากรเครือข่ายฮาร์ดแวร์และอื่น ๆ ของแอปพลิเคชัน "

หมายเลขโทรศัพท์ของอุปกรณ์ไม่พร้อมใช้งานภายในคอนเทนเนอร์ของแอปพลิเคชันของคุณ คุณจะต้องแก้ไขแอปพลิเคชันของคุณเพื่ออ่านเฉพาะภายในคอนเทนเนอร์ไดเรกทอรีของคุณและส่งไบนารีของคุณใหม่ไปยัง iTunes Connect เพื่อให้แอปพลิเคชันของคุณได้รับการพิจารณาใหม่สำหรับ App Store

นี่เป็นความผิดหวังที่แท้จริงเนื่องจากเราต้องการให้ผู้ใช้ต้องป้อนหมายเลขโทรศัพท์ของตัวเอง


83
Snapchat ทำมันได้อย่างไร
rgbrgb

1
@Dylan: เมื่อแอปของคุณถูกปฏิเสธบางทีอาจมีการแก้ไขหลักเกณฑ์หรือไม่ โปรดระบุลิงก์ที่เป็นประโยชน์ไปยังเอกสารประกอบ อย่างไรก็ตามฉันขอขอบคุณคำตอบของคุณ
Abhishek Bedi

1
ฉันสามารถรับลิงค์เอกสารของ apple.developer ได้จากที่นี้ได้หรือไม่
Ganesh AB - Android

3
ฉันไม่เคยพบเอกสารใด ๆ เกี่ยวกับเรื่องนี้ แต่อยากจะเห็นมัน เป็นหนึ่งในพื้นที่เหล่านั้นที่ Apple ยังคงทึบแสงสำหรับฉัน ฉันไม่ได้พยายามส่งใบสมัครตั้งแต่นี้
Dylan

1
@rgbrgb ฉันไม่ได้ใช้ Snapchat คุณช่วยอธิบายประสบการณ์ของพวกเขาที่ทำให้ประหลาดใจได้ไหม?
William Entriken

138

ไม่ไม่มีวิธีที่ถูกต้องและน่าเชื่อถือในการทำเช่นนี้

หากคุณพบวิธีมันจะถูกปิดการใช้งานในอนาคตเช่นเดียวกับที่เกิดขึ้นกับทุกวิธีก่อน


2
ดูคำตอบของ Nik Burn: stackoverflow.com/a/8415162/292166 - มีวิธีการทำเช่นนี้!
JosephH

4
อะไรคือเหตุผลที่ดีที่สุดที่คุณเห็นว่า Apple ไม่อนุญาตให้เข้าถึงหมายเลขโทรศัพท์ของผู้ใช้ตามการอนุญาต Apple อนุญาตให้เข้าถึงผู้ติดต่อภาพถ่ายสถานที่และกล้องและไมโครโฟนของผู้ใช้แล้ว ทำไมไม่ใช้หมายเลขโทรศัพท์ล่ะ? ต้องมีเหตุผลที่ดี แต่ไม่ชัดเจนในทันที มันเป็นเรื่องที่โชคไม่ดีเพราะการห้ามการเข้าถึงทำให้ผู้ใช้งานใช้เวลาและเงินจำนวนมากในการตรวจสอบหมายเลขโทรศัพท์ของผู้ใช้
Crashalot

86

อัปเดต:ความสามารถของ Apple ถูกลบออกในหรือรอบ ๆ iOS 4


เพียงเพื่อขยายคำตอบก่อนหน้านี้บางอย่างเช่นนี้ทำให้ฉัน:

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

หมายเหตุ : วิธีนี้จะเรียก "หมายเลขโทรศัพท์" ที่ป้อนระหว่างการเปิดใช้งาน iTunes ของ iPhone และอาจเป็นค่าว่างหรือค่าที่ไม่ถูกต้อง มันไม่ได้อ่านจากซิมการ์ด

อย่างน้อยก็ทำใน 2.1 มีคีย์ที่น่าสนใจอื่น ๆ อีกสองสามตัวใน NSUserDefaults ซึ่งอาจใช้ไม่ได้ (นี่คือในแอพของฉันซึ่งใช้ UIWebView)

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

และอื่น ๆ

ไม่แน่ใจว่าถ้ามีอะไรคนอื่นทำ


1
มีการกดบางที่ผ่านมาเกี่ยวกับปัญหาด้านความปลอดภัยที่อยู่เบื้องหลังความสามารถนี้: theregister.co.uk/2009/09/30/iphone_security
JeffH

10
อย่าทำมัน ขอหมายเลขจากผู้ใช้ผ่านทางปุ่มกดหรือตัวเลือกผู้ติดต่อ คุณควรทำการรวบรวมข้อมูลใด ๆ อย่างชัดเจนที่สุดเท่าที่จะเป็นไปได้สำหรับผู้ใช้ อาจไม่ใช่วิธีที่สะดวกที่สุด แต่ง่ายในการบันทึกหมายเลขดังนั้นคุณต้องขอเพียงครั้งเดียวเท่านั้น
David Kanarek

3
โซลูชันที่ทำให้แอปถูกปฏิเสธไม่ใช่วิธีแก้ปัญหา
averydev

27

การใช้ Private API คุณสามารถรับหมายเลขโทรศัพท์ผู้ใช้ได้ตามวิธีต่อไปนี้:

extern NSString* CTSettingCopyMyPhoneNumber();


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

return phone;
}

รวมถึง CoreTelephony.framework ในโครงการของคุณ


หลังจากอ่านคำตอบอื่น ๆ ในฟอรัมนี้ฉันคิดว่ามันเป็นไปไม่ได้ แต่คุณได้ทำงานที่สมบูรณ์แบบแล้ว
Mehul Thakkar

1
บน iOS 7 ได้รับการคุ้มครองโดยstackoverflow.com/questions/19504478/…ให้
creker

โทรศัพท์เป็นศูนย์เมื่อฉันลองทำสิ่งนี้
C0D3

22

ตามที่คุณคงทราบกันดีว่าคุณใช้รหัสบรรทัดต่อไปนี้แอปของคุณจะถูกปฏิเสธโดย 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.

หวังว่านี่จะช่วยได้!


9
uniqueIdentifier นั้นเลิกใช้แล้วใน iOS5 ใช้ที่อยู่ MAC แทน
Raptor

15
ที่อยู่ MAC เลิกใช้แล้วใน iOS 7 ใช้[UIDevice identifierForVendor]แทน
jab

17

คุณไม่สามารถใช้ iOS APIs เพียงอย่างเดียวในการจับหมายเลขโทรศัพท์ (แม้ในแอปส่วนตัวด้วย API ส่วนตัว) เนื่องจากวิธีการที่รู้จักทั้งหมดในการทำเช่นนี้ได้รับการแก้ไขและบล็อกใน iOS 11 แม้ว่าจะพบการหาประโยชน์ใหม่แล้วก็ตาม Apple ชัดเจนว่าพวกเขาจะปฏิเสธแอพใด ๆ จากแอพสโตร์สำหรับการใช้ API ส่วนตัวในการทำเช่นนี้ ดูคำตอบของ @ Dylan สำหรับรายละเอียด

แต่มีวิธีที่ถูกต้องตามกฎหมายในการจับหมายเลขโทรศัพท์โดยไม่ต้องป้อนข้อมูลผู้ใช้ใดสิ่งนี้คล้ายกับสิ่งที่ Snapchat ทำ แต่ง่ายกว่าเพราะไม่ต้องการให้ผู้ใช้พิมพ์หมายเลขโทรศัพท์ของตัวเอง

แนวคิดคือให้แอปส่งข้อความ SMS ไปยังเซิร์ฟเวอร์โดยใช้รหัสการติดตั้งเฉพาะของแอป แอปสามารถสอบถามเซิร์ฟเวอร์เดียวกันเพื่อดูว่าเพิ่งได้รับข้อความ SMS จากอุปกรณ์ด้วยรหัสการติดตั้งแอพที่ไม่ซ้ำกันนี้หรือไม่ หากมีก็สามารถอ่านหมายเลขโทรศัพท์ที่ส่งได้ นี่คือวิดีโอตัวอย่างที่แสดงกระบวนการ อย่างที่คุณเห็นมันทำงานเหมือนมีเสน่ห์!

นี้ไม่ได้เป็นซุปเปอร์ง่ายที่จะตั้งขึ้นมา แต่ก็มีการกำหนดค่าในไม่กี่ชั่วโมงไม่มีค่าใช้จ่ายในชั้น AWS ฟรีกับโค้ดตัวอย่างที่ให้ไว้ในการกวดวิชาที่นี่


ขอโทษ วิดีโอส่วนตัวโดยไม่ตั้งใจ มันเป็นสาธารณะในขณะนี้
davidgyoung

นี่เป็นวิธีที่ดี แต่คุณช่วยเพิ่มพูนคำตอบของคุณอย่างน้อยครอบคลุมรายละเอียดการใช้งานพื้นฐาน คุณจะส่ง SMS จากอุปกรณ์ iOS โดยไม่ทราบหมายเลขโทรศัพท์ของคุณได้อย่างไร คุณจะตั้งค่าเซิร์ฟเวอร์ที่รับ SMS ซึ่งมีสิทธิ์เข้าถึงหมายเลขโทรศัพท์ของผู้ส่งได้อย่างไร มีเครื่องมืออะไรเกี่ยวข้องบ้าง เข้ากันได้?
Motti Shneor

@MottiShneor คุณเห็นลิงก์บทช่วยสอนในคำตอบหรือไม่ นี่เป็นแบบฝึกหัดที่ครบถ้วนเกี่ยวกับการตั้งค่าโซลูชันนี้รวมถึงโค้ดแอปตัวอย่างที่ใช้งานได้ใน repo Github
davidgyoung

2

รับหมายเลขโทรศัพท์คุณสามารถอ่านไฟล์ plist มันจะไม่ทำงานกับอุปกรณ์ที่ไม่มีการเจลเบรค:

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 ให้การรับประกันกับโทรศัพท์ที่ถูกเจลเบรคและแอปจะต้องมีความสามารถที่แพร่หลายสำหรับผู้ใช้ทุกคน
Cosmtar

2

ไม่มี 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;
}

ใช้งานได้กับ iOS 6 ที่ไม่มี JB และการลงชื่อพิเศษ

creker ที่กล่าวถึงบนiOS 7 กับ JBคุณต้องใช้การให้สิทธิ์เพื่อให้ใช้งานได้

จะทำอย่างไรกับการให้สิทธิ์คุณสามารถค้นหาได้ที่นี่: iOS 7: วิธีรับหมายเลขของตัวเองผ่าน API ส่วนตัว


0

AppStore จะปฏิเสธเนื่องจากมีการเข้าถึงภายนอกแอปพลิเคชันคอนเทนเนอร์

แอพควรมีอยู่ในชุดรวมและไม่สามารถอ่านหรือเขียนข้อมูลนอกพื้นที่คอนเทนเนอร์ที่กำหนด

ส่วนที่ 2.5.2: https://developer.apple.com/app-store/review/guidelines/#software-requirements

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.