Lập trình lấy số điện thoại riêng trong iOS


330

Có cách nào để có được số điện thoại của riêng mình bằng các API tiêu chuẩn từ SDK iPhone không?


có thể hữu ích cho những người khác đang tìm kiếm một giải pháp không sử dụng riêng của api how-does-squares-cardcase-app-do-this - sử dụng tên thiết bị để ghi tên người dùng chỉ cần sửa đổi để nắm bắt số điện thoại hoặc các chi tiết khác khi thích hợp
Nik Burns

davidgyoung đã cung cấp một giải pháp làm việc. Nó được chôn cất (cần một số upvote).
P i

Bây giờ có thể có trong Xcode như stackoverflow.com/a/54004224/536214
aqavi_paracha

Câu trả lời:


318

Có nguy cơ bị đánh dấu tiêu cực, tôi muốn đề xuất rằng giải pháp xếp hạng cao nhất (hiện là phản hồi đầu tiên) vi phạm Thỏa thuận SDK mới nhất kể từ ngày 5 tháng 11 năm 2009. Ứng dụng của chúng tôi đã bị từ chối vì sử dụng nó. Đây là phản hồi từ Apple:

"Vì lý do bảo mật, HĐH iPhone giới hạn một ứng dụng (bao gồm tùy chọn và dữ liệu của nó) ở một vị trí duy nhất trong hệ thống tệp. Hạn chế này là một phần của tính năng bảo mật được gọi là" hộp cát "của ứng dụng. các điều khiển chi tiết giới hạn quyền truy cập của ứng dụng vào các tệp, tùy chọn, tài nguyên mạng, phần cứng, v.v. "

Số điện thoại của thiết bị không khả dụng trong vùng chứa ứng dụng của bạn. Bạn sẽ cần sửa lại ứng dụng của mình để chỉ đọc trong vùng chứa thư mục của bạn và gửi lại tệp nhị phân của bạn lên iTunes Connect để ứng dụng của bạn được xem xét lại cho App Store.

Đây là một sự thất vọng thực sự vì chúng tôi muốn phụ tùng người dùng phải nhập số điện thoại của riêng họ.


83
Snapchat làm điều đó như thế nào?
rgbrgb

1
@Dylan: Khi nào ứng dụng của bạn bị từ chối. Các hướng dẫn được sửa đổi? Vui lòng cung cấp các liên kết hữu ích đến tài liệu. Tuy nhiên, tôi đánh giá cao câu trả lời của bạn.
Abhishek Bedi

1
Tôi có thể lấy liên kết tài liệu apple.developer khi đề cập đến vấn đề này không?
Ganesh AB - Android

3
Tôi chưa bao giờ tìm thấy bất kỳ tài liệu về điều này, nhưng rất thích nhìn thấy nó. Đó là một trong những lĩnh vực mà Apple vẫn mờ đục đối với tôi. Tôi đã không cố gắng nộp đơn kể từ đây.
Dylan

1
@rgbrgb Tôi không sử dụng Snapchat, bạn có thể giải thích kinh nghiệm của họ thật bí ẩn không?
William Entriken

138

Không, không có cách hợp pháp và đáng tin cậy để làm điều này.

Nếu bạn tìm thấy một cách, nó sẽ bị vô hiệu hóa trong tương lai, vì nó đã xảy ra với mọi phương pháp trước đây.


2
Xem câu trả lời của Nik Burn: stackoverflow.com/a/8415162/292166 - có (cách) một cách để làm điều này!
JosephH

4
Lý do tốt nhất bạn thấy khi Apple không cho phép truy cập dựa trên quyền vào số điện thoại của người dùng là gì? Apple đã cho phép truy cập dựa trên sự cho phép đối với danh bạ, ảnh, vị trí và máy ảnh và micrô của người dùng. Tại sao không phải là số điện thoại? Phải có một lý do chính đáng, nhưng nó không ngay lập tức rõ ràng. Thật không may vì việc cấm truy cập khiến các nhà phát triển dành nhiều thời gian và tiền bạc cho các cách khác để xác minh số điện thoại của người dùng.
Crashalot 22/03/2016

86

Cập nhật: khả năng dường như đã bị Apple xóa trên hoặc xung quanh iOS 4


Chỉ cần mở rộng câu trả lời trước đó, một cái gì đó như thế này sẽ giúp tôi:

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

Lưu ý : Điều này lấy "Số điện thoại" đã được nhập trong quá trình kích hoạt iTunes của iPhone và có thể là null hoặc giá trị không chính xác. Nó KHÔNG được đọc từ thẻ SIM.

Ít nhất là trong 2.1. Có một vài khóa thú vị khác trong NSUserDefaults cũng có thể không tồn tại. (Đây là trong ứng dụng của tôi sử dụng UIWebView)

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

và như thế.

Không chắc chắn những gì, nếu bất cứ điều gì, những người khác làm.


1
Đã có một số báo chí gần đây về vấn đề bảo mật đằng sau khả năng này: theregister.co.uk/2009/09/30/iphone_security
JeffH

10
Đừng làm điều đó. Yêu cầu người dùng cho số qua bàn phím hoặc chọn liên lạc. Bạn nên thực hiện bất kỳ thu thập thông tin rõ ràng nhất có thể cho người dùng. Nó có thể không phải là thuận tiện nhất, nhưng rất dễ dàng để lưu số, vì vậy bạn chỉ phải yêu cầu một lần.
David Kanarek

3
Một giải pháp khiến các ứng dụng bị từ chối không phải là một giải pháp.
averydev

27

Sử dụng API riêng, bạn có thể nhận được số điện thoại của người dùng theo cách sau:

extern NSString* CTSettingCopyMyPhoneNumber();


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

return phone;
}

Cũng bao gồm CoreTelephony.framework cho dự án của bạn.


Sau khi đọc các câu trả lời khác trong diễn đàn này, tôi đã nghĩ rằng điều đó là không thể nhưng bạn đã hoàn thành công việc hoàn hảo
Mehul Thakkar

1
Trên iOS 7, nó được bảo vệ bởi stackoverflow.com/questions/19504478/ trên
creker

Điện thoại không có gì khi tôi thử cái này
C0D3

22

Như bạn có thể đã biết nếu bạn sử dụng dòng mã sau đây, ứng dụng của bạn sẽ bị Apple từ chối

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

đây là một tài liệu tham khảo

http://ayeapi.blogspot.com/2009/12/sbformatphonenumber-is-lie.html

thay vào đó bạn có thể sử dụng thông tin sau

NSString *phoneName = [[UIDevice currentDevice] name];

NSString *phoneUniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier];

và như thế

@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.

Hi vọng điêu nay co ich!


9
uniqueIdentifier cũng không được dùng trong iOS5. Sử dụng địa chỉ MAC thay thế.
Raptor

15
Địa chỉ MAC không được dùng trong iOS 7. [UIDevice identifierForVendor]Thay vào đó hãy sử dụng .
jab

17

Bạn không thể sử dụng API iOS một mình để nắm bắt số điện thoại (ngay cả trong một ứng dụng riêng có API riêng), vì tất cả các phương pháp thực hiện điều này đã được vá và chặn kể từ iOS 11. Ngay cả khi tìm thấy khai thác mới, Apple đã thực hiện rõ ràng rằng họ sẽ từ chối bất kỳ ứng dụng nào từ cửa hàng ứng dụng để sử dụng API riêng để thực hiện việc này. Xem câu trả lời của @ Dylan để biết chi tiết.

Tuy nhiên, có một cách hợp pháp để bắt số điện thoại mà không cần nhập dữ liệu người dùng . Điều này tương tự như những gì Snapchat làm, nhưng dễ dàng hơn, vì nó không yêu cầu người dùng nhập số điện thoại của riêng họ.

Ý tưởng là để ứng dụng gửi tin nhắn SMS đến máy chủ có mã cài đặt duy nhất của ứng dụng. Sau đó, ứng dụng có thể truy vấn cùng một máy chủ để xem gần đây có nhận được tin nhắn SMS từ một thiết bị có mã cài đặt ứng dụng độc đáo này không. Nếu có, nó có thể đọc số điện thoại đã gửi. Đây là video demo cho thấy quá trình. Như bạn có thể thấy, nó hoạt động như một bùa mê!

Điều này không dễ để thiết lập, nhưng nó được cấu hình trong vài giờ miễn phí trên tầng AWS miễn phí với mã mẫu được cung cấp trong hướng dẫn tại đây .


Lấy làm tiếc. Video đã vô tình riêng tư. Nó là công khai bây giờ.
davidgyoung

Đây là một cách tuyệt vời, nhưng bạn có thể vui lòng làm phong phú câu trả lời của mình để ít nhất bao gồm các chi tiết thực hiện cơ bản không? Làm thế nào để bạn gửi SMS từ thiết bị iOS mà không biết số điện thoại của mình? Làm thế nào để bạn thiết lập một máy chủ nhận SMS có quyền truy cập vào số điện thoại của người gửi? Những công cụ có liên quan? tương thích?
Motti Shneor

@MottiShneor, bạn có thấy liên kết hướng dẫn trong câu trả lời không? Điều này có một hướng dẫn đầy đủ về việc thiết lập giải pháp này cũng như mã ứng dụng mẫu đang hoạt động trong repo Github.
davidgyoung

2

Để có được số điện thoại của bạn, bạn có thể đọc một tập tin plist. Nó sẽ không hoạt động trên các iDevices không jailbreak:

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]);

Tôi không biết nếu Apple cho phép điều này nhưng nó hoạt động trên iPhone.


Apple bảo đảm bảo hành cho điện thoại đã bẻ khóa và một ứng dụng sẽ cần phải có khả năng phổ biến cho tất cả người dùng.
Cosmtar

2

Không có API chính thức để làm điều đó. Sử dụng API riêng, bạn có thể sử dụng phương pháp sau:

-(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;
}

Nó hoạt động trên iOS 6 mà không cần JB và ký đặc biệt.

Như đã đề cập đến creker trên iOS 7 với JB, bạn cần sử dụng các quyền lợi để làm cho nó hoạt động.

Cách thực hiện với các quyền lợi bạn có thể tìm thấy ở đây: iOS 7: Làm cách nào để có số riêng thông qua API riêng?


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.