iOS 7: Как получить свой номер через приватный API?

Старые способы небольше не работает:

// путь 1

void *lib = dlopen("/Symbols/System/Library/Framework/CoreTelephony.framework/CoreTelephony", RTLD_LAZY);
NSString* (*getPhoneNumber)() = dlsym(lib, "CTSettingCopyMyPhoneNumber");

if (getPhoneNumber == nil) {
    NSLog(@"getPhoneNumber is nil");
    return nil;
}
NSString* ownPhoneNumber = getPhoneNumber();

// путь 2

extern NSString* CTSettingCopyMyPhoneNumber();
NSString *phone = CTSettingCopyMyPhoneNumber();

Смежные вопросы:

Можно ли определить номер телефона устройства в iOS?

[ОБНОВИТЬ]

Предоставленный метод работает на iOS 6.1.4 без JB и iOS 7.1.2 с JB

Спасибо пользователюcreker за подсказку!

Чтобы получить номер, вы должны использовать следующий способ:

1. Код

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

2. Сборка приложения без подписи:

3. Создайте xml-файл (authorlements.xml) со следующим содержимым:




    
        com.apple.coretelephony.Calls.allow
        
        com.apple.coretelephony.Identity.get
        
    

Куда:

com.apple.coretelephony.Calls.allow - для звонков

com.apple.coretelephony.Identity.get - для получения собственного номера

4. Спеть приложение с authorlements.xml Скопировать файлы в одну папку:

./FolderForRunSinging/
    YourApp.app
    entitlements.xml

entitlements.xml - создал xml

YourApp.app - двоичные файлы для вашего приложения, скопированные из файлов XCode. Чтобы найти, где находятся ваши двоичные файлы, вы можете использовать команду:

$ls -la ~/Library/Developer/Xcode/DerivedData/ | grep YourApp

Путь должен быть таким:

/Users/username/Library/Developer/Xcode/DerivedData/YourApp-cktasembftvbmqaaiiunvljdwocs/Build/Products/Debug-iphoneos/YourApp.app

Запустите пение команды: '

$codesign --sign='iPhone Developer: FirstName  SecondName (XXXXXXXX)’
--entitlements entitlements.xml YourApp.app

Разработчик iPhone: FirstName SecondName (XXXXXXXX) ' - название вашего сертификата в связке ключей

5. Скопировать заявкуYourApp.app на вашем устройстве с помощью SSH в папку

/Applications

6. Перезапустите трамплин (запустите на устройстве):

$su mobile -c uicache 1>/dev/null 2>&1

Рабочий образец можно найти наGitHub

Результат на iOS 7.1.2 (JB требуется!):

Результат на iOS 6.1.3 (работает без JB и без специальной подписи просто собери и запусти)

Ответы на вопрос(1)

Ваш ответ на вопрос