2010-12-18 86 views

回答

33

這一切都可以輕鬆完成,但會被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

牆紙路徑不再有效。 – EightyEight 2011-07-10 07:55:43

+27

無需進行投票表決。在問題被提出並被選作正確答案時,它們是有效的。 – WrightsCS 2011-07-10 21:44:01

+2

我不能告訴你新的路徑,但我可以告訴你,蘋果使用新的圖像合成器。它是一個cpbitmap,所以如果你喜歡tomsave的圖像,你首先需要將.png或.jpeg轉換爲.cpbitmap – 2014-09-05 04:24:38

1

使用私有API,如果你能 檢查PLStaticWallpaperImageViewController

+1

這工作,直到iOS 10。 – Nate 2017-03-10 05:58:12

1

answer by 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頭添加到您的項目。你通常可以在網上搜索一下,for example, here

在上面的示例中,[SBSUIWallpaperPreviewViewController setWallpaperForLocations:]被調用的參數爲3:3表示圖像應該用於這兩個鎖和主屏幕。 1僅表示鎖定屏幕。 2僅表示主屏幕。


對於爲什麼我打開這個框架了動態的說明,請參閱my related answer here

我沒有關於鈴聲的回答。這確實應該是一個單獨的問題:完全不同的API在工作。

+1

不幸的是,這不適用於iOS 10。 @Nate你有信息如何讓這個運行在iOS 10上嗎? (對於iOS 10,他的代碼崩潰,錯誤: 聲明失敗:(0),函數SBSUIWallpaperClearVideo,文件/BuildRoot/Library/Caches/com.apple.xbs/Sources/SpringBoardUIServices/SpringBoard-3563.15.8.9/SBSUIWallpaperUtilities.m,line )可能他們加了一些聰明的斷言......) – 2017-03-03 15:57:40

+0

@GuntisTreulands,是的,我也注意到了。我正在查看[iOS 10頭文件](https://github.com/nst/iOS-Runtime-Headers/blob/master/PrivateFrameworks/SpringBoardUIServices.framework/SBSUIWallpaperPreviewViewController.h),它看起來像API仍然存在。現在可能受到權利保護。我確實記得在過去尋找其他方法來做到這一點,所以讓我在這個週末花點時間嘗試其他方法來實現這個目標。 – Nate 2017-03-03 22:14:18

+0

@GuntisTreulands,我也嘗試在'PLStaticWallpaperImageViewController'中使用類似的方法,但它也失敗了。它看起來像iOS認識到該應用程序正試圖改變其沙箱外的東西。我也看到[PhotoLibrary]中有另一個API(https://github.com/nst/iOS-Runtime-Headers/blob/master/PrivateFrameworks/PhotoLibrary.framework/PLWallpaperImageViewController.h),但我必須做一些逆向工程弄清楚它需要的參數是什麼。我會在這裏更新你的。 – Nate 2017-03-10 05:52:51

相關問題