İOS'ta programlı olarak kendi telefon numarasını al


330

İPhone SDK'dan standart API'lerle kendi telefon numaranızı almanın bir yolu var mı?


api'nin nasıl yapılır kareleri-cardcase-app-do-bunu kullanmayan bir çözüm arayan başkaları için yararlı olabilir - kullanıcıların adını yakalamak için cihaz adını kullanın, yalnızca telefon numarasını veya diğer ayrıntıları uygun şekilde yakalamak için değiştirin
Nik Burns

davidgyoung bir çalışma çözümü sağladı. Gömülüdür (bazı oylara ihtiyaç duyar).
P i

Artık
Xcode'da

Yanıtlar:


318

Olumsuz işaretler alma riski altında, en yüksek dereceli çözümün (şu anda ilk yanıt) 5 Kasım 2009'dan itibaren en son SDK Anlaşmasını ihlal ettiğini önermek istiyorum. Başvurumuz bunu kullandığından dolayı reddedildi. İşte Apple'ın yanıtı:

"Güvenlik nedeniyle, iPhone OS bir uygulamayı (tercihleri ​​ve verileri dahil) dosya sistemindeki benzersiz bir konumla sınırlar. Bu kısıtlama, uygulamanın" korumalı alanı "olarak bilinen güvenlik özelliğinin bir parçasıdır. Korumalı alan, bir uygulamanın dosyalara, tercihlere, ağ kaynaklarına, donanıma vb. erişimlerini sınırlayan taneli denetimler. "

Cihazın telefon numarası, uygulamanızın kapsayıcısında mevcut değil. Uygulamanızın App Store için yeniden değerlendirilebilmesi için uygulamanızı yalnızca dizin kapsayıcısında okuyacak şekilde revize etmeniz ve ikili dosyalarınızı iTunes Connect'e yeniden göndermeniz gerekir.

Kendi telefon numarasını girmek zorunda kullanıcıyı yedeklemek istedim çünkü bu gerçek bir hayal kırıklığı oldu.


83
Snapchat bunu nasıl yapıyor?
rgbrgb

1
@Dylan: Uygulamanız ne zaman reddedildi. Belki de kurallar revize edilmiştir? Lütfen belgelere faydalı bağlantılar sağlayın. Ancak cevabınızı takdir ediyorum.
Abhishek Bedi

1
Belirtilen yerlerde apple.developer dokümantasyon bağlantısı alabilir miyim?
Ganesh AB - Android

3
Bu konuda hiçbir belge bulamadım, ama görmek isterim. Apple'ın benim için opak kaldığı alanlardan biri. Bundan beri başvuruda bulunmaya çalışmadım.
Dylan

1
@rgbrgb Snapchat kullanmıyorum, bu kadar gizemli olan deneyimlerini açıklayabilir misiniz?
William Entriken

138

Hayır, bunu yapmanın yasal ve güvenilir bir yolu yok.

Bir yol bulursanız, daha önce her yöntemde olduğu gibi gelecekte devre dışı bırakılacaktır.


2
Nik Burn'un cevabına bakın: stackoverflow.com/a/8415162/292166 - Bunu yapmanın bir yolu var!
JosephH

4
Apple'ın kullanıcının telefon numarasına izin temelli erişime izin vermemesinin en iyi nedeni nedir? Apple zaten kişilere, fotoğraflara, konuma ve kullanıcının kamera ve mikrofonuna izin tabanlı erişime izin veriyor. Neden telefon numarası olmasın? Bunun iyi bir nedeni olmalı, ama hemen belli değil. Bu talihsiz bir durumdur çünkü erişimi yasaklamak, geliştiricilerin bir kullanıcının telefon numarasını doğrulamanın diğer yollarına çok fazla zaman ve para harcamasına neden olur.
Crashalot

86

Güncelleme: Apple tarafından iOS 4 veya çevresinde kaldırılmış gibi görünüyor


Daha önceki bir cevabı genişletmek için, böyle bir şey benim için yapar:

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

Not : Bu, iPhone'un iTunes etkinleştirmesi sırasında girilen ve boş veya yanlış bir değer olabilen "Telefon numarası" nı alır. Bu oluyor DEĞİL SIM karttan okuyun.

En azından 2.1. NSUserDefaults'ta da uzun süre dayanamayan birkaç ilginç anahtar var. (Bu benim UIWebView kullanan benim app)

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

ve bunun gibi.

Başkalarının ne yaptığını bilmiyorlar.


1
Bu yeteneğin ardındaki güvenlik kaygıları hakkında son zamanlarda bazı basın
yayınları var

10
Yapma. Tuş takımı veya kişi seçicisi aracılığıyla kullanıcıdan numarayı isteyin. Herhangi bir bilgi toplama işlemini mümkün olduğunca açık hale getirmelisiniz. En uygun olmayabilir, ancak numarayı kaydetmek çok kolaydır, bu yüzden sadece bir kez sormanız gerekir.
David Kanarek

3
Uygulamaları reddeden bir çözüm bir çözüm değildir.
averydev

27

Özel API'yi kullanarak kullanıcı telefon numarasını aşağıdaki şekilde alabilirsiniz:

extern NSString* CTSettingCopyMyPhoneNumber();


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

return phone;
}

Ayrıca Projenize CoreTelephony.framework ekleyin.


Bu forumdaki diğer cevapları okuduktan sonra, bunun mümkün olmadığını düşünüyordum ama mükemmel bir iş çıkardın
Mehul Thakkar


Bunu denediğimde telefon nil
C0D3

22

Aşağıdaki kod satırını kullanıp kullanmadığınızı muhtemelen bildiğiniz gibi, uygulamanız Apple tarafından reddedilecek

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

işte bir referans

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

bunun yerine aşağıdaki bilgileri kullanabilirsiniz

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

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

ve bunun gibi

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

Bu yardımcı olur umarım!


9
uniqueIdentifier ayrıca iOS5'te kullanımdan kaldırıldı. Bunun yerine MAC adresini kullanın.
Raptor

15
MAC adresi iOS 7'de kullanımdan kaldırıldı. [UIDevice identifierForVendor]Bunun yerine kullanın .
jab

17

Bilinen tüm yöntemlerin iOS 11'den itibaren yamalandığı ve engellendiği için, telefon numaralarını (özel API'lere sahip özel bir uygulamada bile) yakalamak için yalnızca iOS API'larını kullanamazsınız. bunu yapmak için özel API'leri kullandıkları için uygulama mağazasındaki tüm uygulamaları reddedeceklerini unutmayın. Ayrıntılar için @ Dylan'ın cevabına bakınız.

Ancak, herhangi bir kullanıcı veri girişi olmadan telefon numarasını yakalamanın yasal bir yolu vardır . Bu, Snapchat'in yaptıklarına benzer, ancak kullanıcının kendi telefon numarasını yazmasını gerektirmediği için daha kolaydır.

Fikir, uygulamanın programlı olarak uygulamanın benzersiz kurulum koduna sahip bir sunucuya SMS mesajı göndermesidir. Uygulama daha sonra aynı sunucuyu, bu benzersiz uygulama yükleme koduna sahip bir cihazdan kısa süre önce SMS alıp almadığını görmek için sorgulayabilir. Varsa, onu gönderen telefon numarasını okuyabilir. İşte süreci gösteren bir demo video . Gördüğünüz gibi, bir cazibe gibi çalışıyor!

Bu süper kolay kurmak değil, ama öğretici sağlanan örnek kod ile ücretsiz bir AWS katta hiçbir ücret ödemeden birkaç saat içinde yapılandırılabilir burada .


Afedersiniz. Video yanlışlıkla özeldi. Şimdi halka açık.
18:14, davidgyoung

Bu harika bir yoldur, ancak yanıtınızı en azından temel uygulama ayrıntılarını kapsayacak şekilde zenginleştirebilir misiniz? Telefon numaranızı bilmeden bir iOS cihazından nasıl SMS gönderirsiniz? gönderenin telefon numarasına erişimi olan bir SMS alıcı sunucusu nasıl kurarsınız? Hangi araçlar söz konusudur? uyumluluk?
Motti Shneor

@MottiShneor, cevapta öğretici bağlantısını gördünüz mü? Bu, Github deposunda çalışan bir uygulama kodunun yanı sıra bu çözümü kurma konusunda tam bir öğreticiye sahiptir.
davidgyoung

2

Size telefon numarası almak için bir plist dosyasını okuyabilirsiniz. Jailbreak yapmayan iDevices üzerinde çalışmaz:

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'ın buna izin verip vermediğini bilmiyorum ama iPhone'larda çalışıyor.


Apple, jailbreak yapılmış telefonlarda garantiyi geçersiz kılar ve bir uygulamanın tüm kullanıcılar için her yerde bulunabilmesi gerekir.
Cosmtar

2

Bunu yapmak için resmi bir API yok. Özel API kullanarak aşağıdaki yöntemi kullanabilirsiniz:

-(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 ve özel imza olmadan iOS 6'da çalışır.

Belirtildiği gibi creker üzerinde JB ile iOS 7 o çalışma yapmak için yetkileri kullanmak gerekir.

Burada bulabileceğiniz yetkilerle nasıl yapılır: iOS 7: Özel API ile kendi numaranızı nasıl alabilirim?


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.