Как программно установить экран блокировки, обои и рингтон в iPhone? - PullRequest
26 голосов
/ 18 декабря 2010

Можно ли в iPhone установить экран блокировки, обои и мелодию звонка программно?

Если Да , то, пожалуйста, дайте мне знать, как их настроить?

Ответы [ 3 ]

36 голосов
/ 18 декабря 2010

Все это может быть сделано легко, но будет отклонено Apple.

Мелодию звонка можно изменить, изменив com.apple.SpringBoard.plist, в частности клавишу ringtone.

Следующий код можно использовать для считывания фактического названия мелодии рингтона (синхронизированного с iTunes).

NSMutableDictionary *custDict = [[NSMutableDictionary alloc] initWithContentsOfFile:@"/private/var/mobile/Media/iTunes_Control/iTunes/Ringtones.plist"];
NSMutableDictionary *dictionary = [custDict objectForKey:@"Ringtones"];

NSArray *keys = [dictionary allKeys];
id key = [keys objectAtIndex:indexPath.row];
NSMutableDictionary *customRingtone = [dictionary objectForKey:key];
NSString *name = [customRingtone objectForKey:@"Name"];
cell.textLabel.text = name;

Обои могут быть перезаписаны по адресу:

NSString *homePath1 = @"/private/var/mobile/Library/SpringBoard/HomeBackground.jpg";
NSString *homePath2 = @"/private/var/mobile/Library/SpringBoard/HomeBackgroundPortrait.jpg";
NSString *lockPath1 = @"/private/var/mobile/Library/SpringBoard/LockBackground.jpg";
NSString *lockPath2 = @"/private/var/mobile/Library/SpringBoard/LockBackgroundPortrait.jpg";

Эти примеры были использованы в одном из моих приложений Cydia. На самом деле для них не так много, но это должно привести вас в правильном направлении.

2 голосов
/ 17 августа 2016

Ответ от WrightsCS перестал работать в какой-то момент из-за изменения в iOS.К сожалению, это то, с чем вам придется жить, если вы хотите использовать недокументированные функции.

Если вам все еще нужно это сделать, только для приложений, не входящих в App Store этот код работает в iOS 9.3.Однако он может перестать работать в любом будущем выпуске iOS. (см. Комментарий ниже: больше не работает в iOS 10)

#import "SBSUIWallpaperPreviewViewController.h"
#import <dlfcn.h>

// open the private framework dynamically
void *handle = dlopen("/System/Library/PrivateFrameworks/SpringBoardUIServices.framework/SpringBoardUIServices", RTLD_NOW);

UIImage *wallpaper = [UIImage imageNamed: @"background.jpg"];

Class sbClass = NSClassFromString(@"SBSUIWallpaperPreviewViewController");
// we create a view controller, but don't display it. 
//  just use it to load image and set wallpaper
SBSUIWallpaperPreviewViewController *controller = (SBSUIWallpaperPreviewViewController*)[[sbClass alloc] initWithImage: wallpaper];
[controller setWallpaperForLocations: 3];  // 3 -> set both for lock screen and home screen

dlclose(handle);

Вам потребуется добавить частный заголовок API в ваш проект.Обычно их можно найти в Интернете с небольшим поиском, например, , здесь .

. В приведенном выше примере вызывается [SBSUIWallpaperPreviewViewController setWallpaperForLocations:] с аргументом 3: 3, указывающим, что изображение должно бытьиспользуется для и блокировки, и домашних экранов.1 указывает только на экран блокировки.2 обозначает только главный экран.


Объяснение того, почему я открываю этот фреймворк динамически , см. мой соответствующий ответ здесь .

У меня нет ответа относительно мелодий .Это действительно должен быть отдельный вопрос: совершенно разные API на работе.

1 голос
/ 04 февраля 2015

используйте приватный API, если вы можете проверить PLStaticWallpaperImageViewController

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...