[例如,如何通过编程方式将macOS上的iTunes资料库位置设置为自定义位置, C / Obj-C还是Swift API?
或者,对我来说也可以使用环境设置,例如使用defaults
CLI工具或类似的方法修改支柱。
通常,通过在按住Option键的同时启动iTunes来选择自定义iTunes库的位置。我需要能够在例如单元测试环境/以编程方式。
您可能可以通过首选项进行设置。这就是我的访问方式。
-(void)loadITunesPrefLibraryPath {
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSDictionary *userPref = [userDefaults persistentDomainForName:@"com.apple.iTunes"];
id dataBaseLoc = [userPref objectForKey:@"Database Location"];
NSLog(@"%s dataBaseLoc is:%@", __PRETTY_FUNCTION__, dataBaseLoc);
NSLog(@"%s dataBaseLoc class is:%@", __PRETTY_FUNCTION__, [dataBaseLoc class]);
NSData* dataBaseData = (NSData*)dataBaseLoc;
BOOL staleBook = NO;
NSError* bookError = nil;
NSURL* dataBaseURL = [NSURL URLByResolvingBookmarkData:dataBaseData options:NSURLBookmarkResolutionWithoutMounting relativeToURL:nil bookmarkDataIsStale:&staleBook error:&bookError];
self.libExtDBfile = dataBaseURL;
}
一旦获得iTunes的userPrefs。并从URL创建BookMarkData。您可能可以通过
进行设置[userPref setObject:newDataBaseLoc forKey:@"Database Location"];
另请参阅下一个答案以获取可能的ITLibrary框架私有API访问权限
您可以通过ITLibrary框架专用API进行设置(但不要提交到AppStore!)
Via Dumper此处是一个私有类头:
#import <Foundation/NSObject.h>
@class ITLibLibraryData, NSArray, NSNumber, NSURL;
@interface ITLibDBContent : NSObject
{
NSArray *_allMediaItems;
NSArray *_allPlaylists;
ITLibLibraryData *_libraryData;
struct _xpc_connection_s *_connection;
struct dispatch_queue_s *_connectionDispatchQueue;
void *_artworkRetriever;
BOOL _dbLoaded;
NSURL *_databaseURL;
NSNumber *_databaseID;
}
+ (void)setSharedInstance:(id)arg1;
+ (id)sharedInstance;
@property(retain, nonatomic) NSNumber *databaseID; // @synthesize databaseID=_databaseID;
@property(retain, nonatomic) NSURL *databaseURL; // @synthesize databaseURL=_databaseURL;
@property BOOL dbLoaded; // @synthesize dbLoaded=_dbLoaded;
- (BOOL)havePendingMigratedBooks;
- (void)migratedMediaItems:(id)arg1;
- (void)downloadCloudMediaItem:(id)arg1;
- (void)sendCommandToITunes:(struct __CFDictionary *)arg1;
- (void)setiTunesPref:(id)arg1 value:(void *)arg2;
- (void *)copyiTunesPref:(id)arg1;
- (id)artworkForMediaFileAtURL:(id)arg1;
- (id)artworkForMediaItem:(id)arg1;
@property(readonly, nonatomic) struct ITLibArtworkRetriever *artworkRetriever; // @dynamic artworkRetriever;
- (id)locationOfMediaItem:(id)arg1;
- (id)mediaItemArtworkByPersistentID:(id)arg1;
- (id)playlistByPersistentID:(id)arg1;
- (id)mediaItemByPersistentID:(id)arg1;
@property(retain, nonatomic) NSArray *allPlaylists; // @dynamic allPlaylists;
@property(retain, nonatomic) NSArray *allMediaItems; // @dynamic allMediaItems;
@property(retain, nonatomic) ITLibLibraryData *libraryData; // @dynamic libraryData;
- (int)loadDatabase;
- (int)initDatabaseURL;
- (void)sendMessage:(void *)arg1 withReplyHandler:(CDUnknownBlockType)arg2;
- (int)initConnection;
@property struct dispatch_queue_s *connectionDispatchQueue; // @dynamic connectionDispatchQueue;
@property struct _xpc_connection_s *connection; // @dynamic connection;
@property(readonly) BOOL useRemote; // @dynamic useRemote;
- (void)finalize;
- (void)dealloc;
- (id)initAndReturnError:(id *)arg1;
@end
在我的.m文件中,我添加了以下扩展名:
@interface ITLibrary ()
@property(retain, nonatomic) ITLibLibraryData *libraryData;
@property(retain, nonatomic) NSNumber *databaseID; // @synthesize databaseID=_databaseID;
@property(retain, nonatomic) NSURL *databaseURL;
//@property(copy, nonatomic) NSURL *musicFolderLocation;
- (id)locationOfMediaItem:(id)arg1;
- (id)mediaItemArtworkByPersistentID:(id)arg1;
- (id)playlistByPersistentID:(id)arg1;
- (id)mediaItemByPersistentID:(id)arg1;
@end
和
@interface ITLibDBParser : NSObject
- (id)parse;
- (void)dealloc;
@property(nonatomic) BOOL parseMediaItemLocation; // @dynamic parseMediaItemLocation;
- (id)initWithDatabaseURL:(id)arg1;
@end
我已添加此方法,但尚未尝试:
-(void)loadExternalDBFile:(NSURL*)extItunesDBFile {
[self.iTunesLib setDatabaseURL:extItunesDBFile];
BOOL loadExt = [self.iTunesLib reloadData];
NSLog(@"%s loadExt is:%hhd", __PRETTY_FUNCTION__, loadExt);
}
嗯,我刚刚尝试过:
NSURL* newDBURL;
BOOL loadExt2 = [ITLibDBContent initDatabaseURL:newDBURL];
并且说不知道initDatabaseURL的类方法
也尝试过:
NSURL* newDBURL;
BOOL loadExt2 = [self.iTunesLib initDatabaseURL:newDBURL];
并且有相同的错误