web-dev-qa-db-ja.com

iPhoneでプログラムでロック画面、壁紙、着信音を設定するにはどうすればよいですか?

IPhoneでは、ロック画面、壁紙、着信音をプログラムで設定できますか?

はいの場合、設定方法を教えてください。

26
ios

これはすべて簡単に行うことができますが、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アプリの1つで使用されました。彼らにはそれほど多くはありませんが、これらはあなたを正しい方向に向かわせるはずです。

36
WrightsCS

WrightsCSによる回答 iOSの変更により、ある時点で動作を停止しました。残念ながら、これは、文書化されていない機能を使用する場合に使用する必要があるものです。

それでもこれを行う必要がある場合App Store以外のアプリの場合のみ、このコードはiOS9.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が機能しています。

2
Nate

PLStaticWallpaperImageViewControllerを確認できる場合は、プライベートAPIを使用してください

1
Bobo Shone