2013-06-02 3 views
0

Sandboxed 앱에서 Scripting Bridge를 사용하여 iTunes에서 트랙의 배열을 필터링하려고합니다. 다음 작품은 응용 프로그램 샌드 박스되지 않을 때,하지만하지 때샌드 박스가 SBElementArray로 NSPredicate를 깨뜨림

if(!self.iTunes){ 
    self.iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"]; 
    self.library = [[[[self.iTunes sources] get] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"kind == %i", iTunesESrcLibrary]] objectAtIndex:0]; 
    iTunesLibraryPlaylist *libraryPlaylist = [[[[self.library playlists] get] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"specialKind == %i", iTunesESpKMusic]] objectAtIndex:0]; 
    self.musicTracks = [libraryPlaylist tracks]; 
} 

// Create the playlist in iTunes 
NSString *playlistName = selectedEquation.name; 
iTunesPlaylist *playlist = [[[self.iTunes classForScriptingClass:@"playlist"] alloc] init]; 
[[self.library userPlaylists] insertObject:playlist atIndex:0]; 
[playlist setName:playlistName]; 


// Use persistent id to match between iTunesLibrary and ScriptingBridge 
NSArray* iDArray = [self.tableTracks valueForKey:@"persistentID"]; 
for (NSNumber *decID in iDArray){ 
    NSString* hexID = [NSString stringWithFormat:@"%llx", (long long)[decID integerValue]]; 
    hexID = [hexID uppercaseString]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", @"persistentID", hexID]; 
    [[[self.musicTracks filteredArrayUsingPredicate:predicate] objectAtIndex:0] duplicateTo:playlist]; 
} 

이 버그, 아니면 내가 뭔가를 놓친 게 뭐죠? 필터를 실행하기 전에 self.musicTracksNSArray으로 변환하면 작동합니다. 그러나 이로 인해 상황이 상당히 느려지면서 실제로 사용할 수없는 수준으로 떨어집니다.

편집 : 여기 내 권한 파일입니다. 재생 목록과 트랙을 추가 할 수 있습니다. 더 이상 작동하지 않는 필터링 일뿐입니다.

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>com.apple.security.app-sandbox</key> 
    <true/> 
    <key>com.apple.security.assets.music.read-write</key> 
    <true/> 
    <key>com.apple.security.scripting-targets</key> 
    <dict> 
     <key>com.apple.iTunes</key> 
     <array> 
      <string>com.apple.iTunes.library.read-write</string> 
     </array> 
    </dict> 
</dict> 
</plist> 
+0

@TBlue 오른쪽, 좋은 지적. 그것은 질문에 추가했습니다 – abroekhof

+0

이것은 나에게도 일어난 일입니다. 이 질문보기 : http://stackoverflow.com/questions/16420120/itunes-scripting-with-scripting-bridge-sandboxing – Alex

답변

0

보세요.

NSArray* sbIDs = [self.musicTracks arrayByApplyingSelector:@selector(persistentID)]; 
// Use persistent id to match between iTunesLibrary and ScriptingBridge 
NSArray* iDArray = [self.tableTracks valueForKey:@"persistentID"]; 
for (NSNumber *decID in iDArray){ 
    NSString* hexID = [NSString stringWithFormat:@"%llx", (long long)[decID integerValue]]; 
    hexID = [hexID uppercaseString]; 
    // Persistent ID's have to have 16 characters in them. Prepend zeros to make it so. 
    while ([hexID length]<16) { 
     hexID = [NSString stringWithFormat:@"%@%@", @"0", hexID]; 
    } 
    NSInteger sbIndex = [sbIDs indexOfObject:hexID]; 
    [[self.musicTracks objectAtIndex:sbIndex] duplicateTo:playlist]; 
} 

이것은 답변이 아니어야하며 작동하며 빠릅니다.