Secara terprogram mendapatkan nomor telepon sendiri di iOS

330

Apakah ada cara untuk mendapatkan nomor telepon sendiri dengan API standar dari iPhone SDK?

Vadim
sumber
mungkin berguna bagi orang lain yang mencari solusi yang tidak menggunakan cara api -kotak-cardcase-app-do- api pribadi - menggunakan nama perangkat untuk menangkap nama pengguna hanya mengubah untuk menangkap nomor telepon atau rincian lainnya yang sesuai
Nik Burns
davidgyoung telah memberikan solusi kerja. Itu dikubur (perlu beberapa perbaikan).
P i
Sekarang mungkin di Xcode seperti ini stackoverflow.com/a/54004224/536214
aqavi_paracha

Jawaban:

318

Dengan risiko mendapatkan nilai negatif, saya ingin menyarankan bahwa solusi peringkat tertinggi (saat ini tanggapan pertama) melanggar Perjanjian SDK terbaru pada 5 November 2009. Aplikasi kami baru saja ditolak karena menggunakannya. Inilah tanggapan dari Apple:

"Untuk alasan keamanan, iPhone OS membatasi aplikasi (termasuk preferensi dan datanya) ke lokasi unik dalam sistem file. Pembatasan ini adalah bagian dari fitur keamanan yang dikenal sebagai" kotak pasir "aplikasi. Kotak pasir adalah sekumpulan fine- kontrol berbutir yang membatasi akses aplikasi ke file, preferensi, sumber daya jaringan, perangkat keras, dan sebagainya. "

Nomor telepon perangkat tidak tersedia dalam wadah aplikasi Anda. Anda perlu merevisi aplikasi Anda untuk membaca hanya dalam wadah direktori Anda dan mengirimkan kembali biner Anda ke iTunes Connect agar aplikasi Anda dipertimbangkan kembali untuk App Store.

Ini benar-benar mengecewakan karena kami ingin agar pengguna tidak perlu memasukkan nomor telepon mereka sendiri.

Dylan
sumber
83
Bagaimana cara Snapchat melakukannya?
rgbrgb
1
@Dylan: Kapan aplikasi Anda ditolak. Mungkin pedomannya direvisi? Harap berikan tautan yang bermanfaat ke dokumentasi. Namun, saya menghargai jawaban Anda.
Abhishek Bedi
1
Bisakah saya mendapatkan tautan dokumentasi apple.developer di mana ini disebutkan?
Ganesh AB - Android
3
Saya belum pernah menemukan dokumentasi tentang ini, tetapi akan senang melihatnya. Itu salah satu area di mana Apple tetap buram bagi saya. Saya belum mencoba mengajukan aplikasi sejak ini.
Dylan
1
@ rgbrgb Saya tidak menggunakan Snapchat, bisakah Anda menjelaskan pengalaman mereka yang sangat membingungkan?
William Entriken
138

Tidak, tidak ada cara yang sah dan dapat diandalkan untuk melakukan ini.

Jika Anda menemukan cara, itu akan dinonaktifkan di masa mendatang, seperti yang terjadi pada setiap metode sebelumnya.

Andrew Grant
sumber
2
Lihat jawaban Nik Burn: stackoverflow.com/a/8415162/292166 - ada (semacam) cara untuk melakukan ini!
JosephH
4
Apa alasan terbaik yang Anda lihat untuk Apple yang melarang akses berbasis izin ke nomor telepon pengguna? Apple sudah memungkinkan akses berbasis izin ke kontak, foto, lokasi, dan kamera serta mikrofon pengguna. Kenapa bukan nomor teleponnya? Pasti ada alasan bagus, tetapi tidak segera jelas. Sangat disayangkan karena melarang akses menyebabkan devs menghabiskan banyak waktu dan uang untuk cara lain memverifikasi nomor telepon pengguna.
Crashalot
86

Pembaruan: kemampuan tampaknya telah dihapus oleh Apple di atau sekitar iOS 4


Hanya untuk memperluas jawaban sebelumnya, sesuatu seperti ini akan melakukannya untuk saya:

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

Catatan : Ini mengambil "Nomor telepon" yang dimasukkan selama aktivasi iTunes iPhone dan bisa bernilai nol atau salah. Ini TIDAK dibaca dari kartu SIM.

Setidaknya itu tidak di 2.1. Ada beberapa kunci menarik lainnya di NSUserDefaults yang mungkin juga tidak bertahan lama. (Ini ada di aplikasi saya yang menggunakan UIWebView)

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

dan seterusnya.

Tidak yakin apa, jika ada, yang lain lakukan.

Robert Sanders
sumber
1
Ada beberapa pers baru-baru ini tentang masalah keamanan di balik kemampuan ini: theregister.co.uk/2009/09/30/iphone_security
JeffH
10
Jangan lakukan itu. Tanyakan kepada pengguna untuk nomornya melalui tombol atau pemilih kontak. Anda harus membuat pengumpulan informasi sejelas mungkin kepada pengguna. Ini mungkin bukan yang paling nyaman, tetapi sangat mudah untuk menyimpan nomornya, jadi Anda hanya perlu memintanya sekali saja.
David Kanarek
3
Solusi yang ditolak aplikasi bukanlah solusi.
averydev
27

Menggunakan Private API Anda bisa mendapatkan nomor telepon pengguna dengan cara berikut:

extern NSString* CTSettingCopyMyPhoneNumber();


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

return phone;
}

Juga termasuk CoreTelephony.framework untuk proyek Anda.

Igor
sumber
Setelah membaca jawaban lain di forum ini, saya berpikir itu tidak mungkin tetapi Anda telah melakukan pekerjaan dengan sempurna
Mehul Thakkar
1
Di iOS 7 itu dilindungi oleh stackoverflow.com/questions/19504478/…
creker
telepon nihil ketika saya coba ini
C0D3
22

Karena Anda semua mungkin sudah tahu jika Anda menggunakan baris kode berikut, aplikasi Anda akan ditolak oleh Apple

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

di sini adalah referensi

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

Anda dapat menggunakan informasi berikut sebagai gantinya

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

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

dan seterusnya

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

Semoga ini membantu!

Andres Garcia
sumber
9
uniqueIdentifier juga ditinggalkan di iOS5. Gunakan alamat MAC sebagai gantinya.
Raptor
15
Alamat MAC sudah tidak digunakan lagi di iOS 7. Gunakan [UIDevice identifierForVendor]saja.
tusukan
17

Anda tidak dapat menggunakan iOS API sendirian untuk menangkap nomor telepon (bahkan di aplikasi pribadi dengan API pribadi), karena semua metode yang dikenal untuk melakukan ini telah ditambal dan diblokir pada iOS 11. Bahkan jika ditemukan eksploitasi baru, Apple telah membuat jelas bahwa mereka akan menolak aplikasi apa pun dari app store karena menggunakan API pribadi untuk melakukan ini. Lihat jawaban @ Dylan untuk detailnya.

Namun, ada cara hukum untuk menangkap nomor telepon tanpa entri data pengguna . Ini mirip dengan apa yang dilakukan Snapchat, tetapi lebih mudah, karena tidak mengharuskan pengguna untuk mengetikkan nomor telepon mereka sendiri.

Idenya adalah membuat aplikasi secara terprogram mengirim pesan SMS ke server dengan kode instalasi unik aplikasi. Aplikasi kemudian dapat meminta server yang sama untuk melihat apakah baru-baru ini menerima pesan SMS dari perangkat dengan kode instalasi aplikasi yang unik ini. Jika sudah, dapat membaca nomor telepon yang mengirimnya. Ini video demo yang menunjukkan prosesnya. Seperti yang Anda lihat, itu berfungsi seperti pesona!

Ini tidak super mudah untuk diatur, tetapi dapat dikonfigurasi dalam beberapa jam tanpa biaya pada tingkat AWS gratis dengan kode sampel yang disediakan dalam tutorial di sini .

davidgyoung
sumber
Maaf. Video tidak sengaja pribadi. Sekarang sudah umum.
davidgyoung
Ini adalah cara yang hebat, tetapi bisakah Anda memperkaya jawaban Anda untuk setidaknya mencakup detail implementasi dasar? Bagaimana Anda mengirim SMS dari perangkat iOS tanpa mengetahui nomor telepon Anda? bagaimana Anda mengatur server penerima SMS yang memiliki akses ke nomor telepon pengirim? Alat apa yang terlibat? kesesuaian?
Motti Shneor
@MottiShneor, apakah Anda melihat tautan tutorial di jawabannya? Ini memiliki tutorial lengkap tentang cara menyiapkan solusi ini serta contoh kode aplikasi yang berfungsi dalam repo Github.
davidgyoung
2

Untuk mendapatkan nomor telepon Anda, Anda dapat membaca file plist. Ini tidak akan berfungsi pada iDevices yang tidak dipenjara:

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

Saya tidak tahu apakah Apple mengizinkan ini tetapi berfungsi pada iPhone.

David Gölzhäuser
sumber
Apple membatalkan garansi pada ponsel yang sudah di-jailbreak dan aplikasi harus memiliki kemampuan di mana-mana untuk semua pengguna.
Cosmtar
2

Tidak ada API resmi untuk melakukannya. Menggunakan API pribadi Anda dapat menggunakan metode berikut:

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

Ini bekerja di iOS 6 tanpa JB dan penandatanganan khusus.

Seperti yang disebutkan creker di iOS 7 dengan JB Anda harus menggunakan hak untuk membuatnya berfungsi.

Bagaimana cara melakukannya dengan hak yang dapat Anda temukan di sini: iOS 7: Cara mendapatkan nomor sendiri melalui API pribadi?

0x8BADF00D
sumber