มีวิธีรับหมายเลขโทรศัพท์ของตัวเองด้วย API มาตรฐานจาก iPhone SDK หรือไม่
มีวิธีรับหมายเลขโทรศัพท์ของตัวเองด้วย API มาตรฐานจาก iPhone SDK หรือไม่
คำตอบ:
ด้วยความเสี่ยงในการได้รับเครื่องหมายลบฉันต้องการแนะนำว่าโซลูชันที่มีอันดับสูงสุด (ปัจจุบันเป็นคำตอบแรก) ละเมิดข้อตกลง SDK ล่าสุด ณ วันที่ 5 พ.ย. 2552 ใบสมัครของเราถูกปฏิเสธการใช้งาน นี่คือคำตอบจาก Apple:
"ด้วยเหตุผลด้านความปลอดภัย iPhone OS จำกัด แอปพลิเคชั่น (รวมถึงการตั้งค่าและข้อมูล) ไปยังตำแหน่งที่ไม่ซ้ำกันในระบบไฟล์ข้อ จำกัด นี้เป็นส่วนหนึ่งของคุณสมบัติความปลอดภัยที่รู้จักกันในชื่อ" sandbox "ของแอปพลิเคชัน การควบคุมแบบเม็ดเล็ก จำกัด การเข้าถึงไฟล์การตั้งค่าทรัพยากรเครือข่ายฮาร์ดแวร์และอื่น ๆ ของแอปพลิเคชัน "
หมายเลขโทรศัพท์ของอุปกรณ์ไม่พร้อมใช้งานภายในคอนเทนเนอร์ของแอปพลิเคชันของคุณ คุณจะต้องแก้ไขแอปพลิเคชันของคุณเพื่ออ่านเฉพาะภายในคอนเทนเนอร์ไดเรกทอรีของคุณและส่งไบนารีของคุณใหม่ไปยัง iTunes Connect เพื่อให้แอปพลิเคชันของคุณได้รับการพิจารณาใหม่สำหรับ App Store
นี่เป็นความผิดหวังที่แท้จริงเนื่องจากเราต้องการให้ผู้ใช้ต้องป้อนหมายเลขโทรศัพท์ของตัวเอง
ไม่ไม่มีวิธีที่ถูกต้องและน่าเชื่อถือในการทำเช่นนี้
หากคุณพบวิธีมันจะถูกปิดการใช้งานในอนาคตเช่นเดียวกับที่เกิดขึ้นกับทุกวิธีก่อน
อัปเดต:ความสามารถของ Apple ถูกลบออกในหรือรอบ ๆ iOS 4
เพียงเพื่อขยายคำตอบก่อนหน้านี้บางอย่างเช่นนี้ทำให้ฉัน:
NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];
หมายเหตุ : วิธีนี้จะเรียก "หมายเลขโทรศัพท์" ที่ป้อนระหว่างการเปิดใช้งาน iTunes ของ iPhone และอาจเป็นค่าว่างหรือค่าที่ไม่ถูกต้อง มันไม่ได้อ่านจากซิมการ์ด
อย่างน้อยก็ทำใน 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.
หวังว่านี่จะช่วยได้!
[UIDevice identifierForVendor]
แทน
คุณไม่สามารถใช้ iOS APIs เพียงอย่างเดียวในการจับหมายเลขโทรศัพท์ (แม้ในแอปส่วนตัวด้วย API ส่วนตัว) เนื่องจากวิธีการที่รู้จักทั้งหมดในการทำเช่นนี้ได้รับการแก้ไขและบล็อกใน iOS 11 แม้ว่าจะพบการหาประโยชน์ใหม่แล้วก็ตาม Apple ชัดเจนว่าพวกเขาจะปฏิเสธแอพใด ๆ จากแอพสโตร์สำหรับการใช้ API ส่วนตัวในการทำเช่นนี้ ดูคำตอบของ @ Dylan สำหรับรายละเอียด
แต่มีวิธีที่ถูกต้องตามกฎหมายในการจับหมายเลขโทรศัพท์โดยไม่ต้องป้อนข้อมูลผู้ใช้ใด ๆ สิ่งนี้คล้ายกับสิ่งที่ Snapchat ทำ แต่ง่ายกว่าเพราะไม่ต้องการให้ผู้ใช้พิมพ์หมายเลขโทรศัพท์ของตัวเอง
แนวคิดคือให้แอปส่งข้อความ SMS ไปยังเซิร์ฟเวอร์โดยใช้รหัสการติดตั้งเฉพาะของแอป แอปสามารถสอบถามเซิร์ฟเวอร์เดียวกันเพื่อดูว่าเพิ่งได้รับข้อความ SMS จากอุปกรณ์ด้วยรหัสการติดตั้งแอพที่ไม่ซ้ำกันนี้หรือไม่ หากมีก็สามารถอ่านหมายเลขโทรศัพท์ที่ส่งได้ นี่คือวิดีโอตัวอย่างที่แสดงกระบวนการ อย่างที่คุณเห็นมันทำงานเหมือนมีเสน่ห์!
นี้ไม่ได้เป็นซุปเปอร์ง่ายที่จะตั้งขึ้นมา แต่ก็มีการกำหนดค่าในไม่กี่ชั่วโมงไม่มีค่าใช้จ่ายในชั้น AWS ฟรีกับโค้ดตัวอย่างที่ให้ไว้ในการกวดวิชาที่นี่
รับหมายเลขโทรศัพท์คุณสามารถอ่านไฟล์ 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
ไม่มี 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 ส่วนตัว
AppStore จะปฏิเสธเนื่องจากมีการเข้าถึงภายนอกแอปพลิเคชันคอนเทนเนอร์
แอพควรมีอยู่ในชุดรวมและไม่สามารถอ่านหรือเขียนข้อมูลนอกพื้นที่คอนเทนเนอร์ที่กำหนด
ส่วนที่ 2.5.2: https://developer.apple.com/app-store/review/guidelines/#software-requirements