{"id":"85d9c449-952a-4f36-9fe9-ef8e9f7c95ca","shortId":"Rv5Ghc","kind":"skill","title":"musickit","tagline":"Integrate Apple Music playback, catalog search, and Now Playing metadata using MusicKit and MediaPlayer. Use when adding music search, Apple Music subscription flows, queue management, playback controls, remote command handling, or Now Playing info to iOS apps.","description":"# MusicKit\n\nSearch the Apple Music catalog, manage playback with `ApplicationMusicPlayer`,\ncheck subscriptions, and publish Now Playing metadata via `MPNowPlayingInfoCenter`\nand `MPRemoteCommandCenter`. Targets Swift 6.3 / iOS 26+.\n\n## Contents\n\n- [Setup](#setup)\n- [Authorization](#authorization)\n- [Catalog Search](#catalog-search)\n- [Subscription Checks](#subscription-checks)\n- [Playback with ApplicationMusicPlayer](#playback-with-applicationmusicplayer)\n- [Queue Management](#queue-management)\n- [Now Playing Info](#now-playing-info)\n- [Remote Command Center](#remote-command-center)\n- [Common Mistakes](#common-mistakes)\n- [Review Checklist](#review-checklist)\n- [References](#references)\n\n## Setup\n\n### Project Configuration\n\n1. Enable the **MusicKit** capability in Xcode (adds the `com.apple.developer.musickit` entitlement)\n2. Add `NSAppleMusicUsageDescription` to Info.plist explaining why the app accesses Apple Music\n3. For background playback, add the `audio` background mode to `UIBackgroundModes`\n\n### Imports\n\n```swift\nimport MusicKit       // Catalog, auth, playback\nimport MediaPlayer    // MPRemoteCommandCenter, MPNowPlayingInfoCenter\n```\n\n## Authorization\n\nRequest permission before accessing the user's music data or playing Apple Music content. Authorization is a one-time prompt per app install.\n\n```swift\nfunc requestMusicAccess() async -> MusicAuthorization.Status {\n    let status = await MusicAuthorization.request()\n    switch status {\n    case .authorized:\n        // Full access to MusicKit APIs\n        break\n    case .denied, .restricted:\n        // Show guidance to enable in Settings\n        break\n    case .notDetermined:\n        break\n    @unknown default:\n        break\n    }\n    return status\n}\n\n// Check current status without prompting\nlet current = MusicAuthorization.currentStatus\n```\n\n## Catalog Search\n\nUse `MusicCatalogSearchRequest` to search the Apple Music catalog. The user must have an Apple Music subscription for full catalog access.\n\n```swift\nfunc searchCatalog(term: String) async throws -> MusicItemCollection<Song> {\n    var request = MusicCatalogSearchRequest(term: term, types: [Song.self])\n    request.limit = 25\n\n    let response = try await request.response()\n    return response.songs\n}\n```\n\n### Displaying Results\n\n```swift\nfor song in songs {\n    print(\"\\(song.title) by \\(song.artistName)\")\n    if let artwork = song.artwork {\n        let url = artwork.url(width: 300, height: 300)\n        // Load artwork from url\n    }\n}\n```\n\n## Subscription Checks\n\nCheck whether the user has an active Apple Music subscription before offering playback features.\n\n```swift\nfunc checkSubscription() async throws -> Bool {\n    let subscription = try await MusicSubscription.current\n    return subscription.canPlayCatalogContent\n}\n\n// Observe subscription changes\nfunc observeSubscription() async {\n    for await subscription in MusicSubscription.subscriptionUpdates {\n        if subscription.canPlayCatalogContent {\n            // Enable full playback UI\n        } else {\n            // Show subscription offer\n        }\n    }\n}\n```\n\n### Offering Apple Music\n\nPresent the Apple Music subscription offer sheet when the user is not subscribed.\n\n```swift\nimport MusicKit\nimport SwiftUI\n\nstruct MusicOfferView: View {\n    @State private var showOffer = false\n\n    var body: some View {\n        Button(\"Subscribe to Apple Music\") {\n            showOffer = true\n        }\n        .musicSubscriptionOffer(isPresented: $showOffer)\n    }\n}\n```\n\n## Playback with ApplicationMusicPlayer\n\n`ApplicationMusicPlayer` plays Apple Music content independently from the Music app. It does not affect the system player's state.\n\n```swift\nlet player = ApplicationMusicPlayer.shared\n\nfunc playSong(_ song: Song) async throws {\n    player.queue = [song]\n    try await player.play()\n}\n\nfunc pause() {\n    player.pause()\n}\n\nfunc skipToNext() async throws {\n    try await player.skipToNextEntry()\n}\n```\n\n### Observing Playback State\n\n```swift\nfunc observePlayback() {\n    // player.state is an @Observable property\n    let state = player.state\n    switch state.playbackStatus {\n    case .playing:\n        break\n    case .paused:\n        break\n    case .stopped, .interrupted, .seekingForward, .seekingBackward:\n        break\n    @unknown default:\n        break\n    }\n}\n```\n\n## Queue Management\n\nBuild and manipulate the playback queue using `ApplicationMusicPlayer.Queue`.\n\n```swift\n// Initialize with multiple items\nfunc playAlbum(_ album: Album) async throws {\n    player.queue = [album]\n    try await player.play()\n}\n\n// Append songs to the existing queue\nfunc appendToQueue(_ songs: [Song]) async throws {\n    try await player.queue.insert(songs, position: .tail)\n}\n\n// Insert song to play next\nfunc playNext(_ song: Song) async throws {\n    try await player.queue.insert(song, position: .afterCurrentEntry)\n}\n```\n\n## Now Playing Info\n\nUpdate `MPNowPlayingInfoCenter` so the Lock Screen, Control Center, and CarPlay\ndisplay current track metadata. This is essential when playing custom audio\n(non-MusicKit sources). `ApplicationMusicPlayer` handles this automatically for\nApple Music content.\n\n```swift\nimport MediaPlayer\n\nfunc updateNowPlaying(title: String, artist: String, duration: TimeInterval, elapsed: TimeInterval) {\n    var info = [String: Any]()\n    info[MPMediaItemPropertyTitle] = title\n    info[MPMediaItemPropertyArtist] = artist\n    info[MPMediaItemPropertyPlaybackDuration] = duration\n    info[MPNowPlayingInfoPropertyElapsedPlaybackTime] = elapsed\n    info[MPNowPlayingInfoPropertyPlaybackRate] = 1.0\n    info[MPNowPlayingInfoPropertyMediaType] = MPNowPlayingInfoMediaType.audio.rawValue\n\n    MPNowPlayingInfoCenter.default().nowPlayingInfo = info\n}\n\nfunc clearNowPlaying() {\n    MPNowPlayingInfoCenter.default().nowPlayingInfo = nil\n}\n```\n\n### Adding Artwork\n\n```swift\nfunc setArtwork(_ image: UIImage) {\n    let artwork = MPMediaItemArtwork(boundsSize: image.size) { _ in image }\n    var info = MPNowPlayingInfoCenter.default().nowPlayingInfo ?? [:]\n    info[MPMediaItemPropertyArtwork] = artwork\n    MPNowPlayingInfoCenter.default().nowPlayingInfo = info\n}\n```\n\n## Remote Command Center\n\nRegister handlers for `MPRemoteCommandCenter` to respond to Lock Screen controls,\nAirPods tap gestures, and CarPlay buttons.\n\n```swift\nfunc setupRemoteCommands() {\n    let center = MPRemoteCommandCenter.shared()\n\n    center.playCommand.addTarget { _ in\n        resumePlayback()\n        return .success\n    }\n\n    center.pauseCommand.addTarget { _ in\n        pausePlayback()\n        return .success\n    }\n\n    center.nextTrackCommand.addTarget { _ in\n        skipToNext()\n        return .success\n    }\n\n    center.previousTrackCommand.addTarget { _ in\n        skipToPrevious()\n        return .success\n    }\n\n    // Disable commands you do not support\n    center.seekForwardCommand.isEnabled = false\n    center.seekBackwardCommand.isEnabled = false\n}\n```\n\n### Scrubbing Support\n\n```swift\nfunc enableScrubbing() {\n    let center = MPRemoteCommandCenter.shared()\n    center.changePlaybackPositionCommand.addTarget { event in\n        guard let positionEvent = event as? MPChangePlaybackPositionCommandEvent else {\n            return .commandFailed\n        }\n        seek(to: positionEvent.positionTime)\n        return .success\n    }\n}\n```\n\n## Common Mistakes\n\n### DON'T: Skip the MusicKit entitlement or usage description\n\nWithout the MusicKit entitlement your app crashes at authorization. Without\n`NSAppleMusicUsageDescription`, App Review rejects the submission.\n\n```swift\n// WRONG: No entitlement configured\nlet status = await MusicAuthorization.request() // Crashes\n\n// CORRECT: Enable MusicKit capability in Xcode first,\n// then add NSAppleMusicUsageDescription to Info.plist\nlet status = await MusicAuthorization.request()\n```\n\n### DON'T: Forget to check subscription before playback\n\nAttempting to play catalog content without a subscription silently fails or throws.\n\n```swift\n// WRONG\nfunc play(_ song: Song) async throws {\n    player.queue = [song]\n    try await player.play() // Fails if no subscription\n}\n\n// CORRECT\nfunc play(_ song: Song) async throws {\n    let sub = try await MusicSubscription.current\n    guard sub.canPlayCatalogContent else {\n        showSubscriptionOffer()\n        return\n    }\n    player.queue = [song]\n    try await player.play()\n}\n```\n\n### DON'T: Use SystemMusicPlayer when you mean ApplicationMusicPlayer\n\n`SystemMusicPlayer` controls the global Music app queue. Changes affect the user's\nMusic app state. Use `ApplicationMusicPlayer` for app-scoped playback.\n\n```swift\n// WRONG: Modifies the user's Music app queue\nlet player = SystemMusicPlayer.shared\n\n// CORRECT: App-scoped playback\nlet player = ApplicationMusicPlayer.shared\n```\n\n### DON'T: Forget to update Now Playing info when track changes\n\nStale metadata on the Lock Screen confuses users. Update Now Playing info\nevery time the current track changes.\n\n```swift\n// WRONG: Set once and forget\nupdateNowPlaying(title: firstSong.title, ...)\n\n// CORRECT: Update on every track change\nfunc onTrackChanged(_ song: Song) {\n    updateNowPlaying(\n        title: song.title,\n        artist: song.artistName,\n        duration: song.duration ?? 0,\n        elapsed: 0\n    )\n}\n```\n\n### DON'T: Register remote commands without handling them\n\nRegistering a command but returning `.commandFailed` breaks Lock Screen controls.\nDisable commands you do not support instead.\n\n```swift\n// WRONG\ncenter.skipForwardCommand.addTarget { _ in .commandFailed }\n\n// CORRECT\ncenter.skipForwardCommand.isEnabled = false\n```\n\n## Review Checklist\n\n- [ ] MusicKit capability enabled in Xcode project\n- [ ] `NSAppleMusicUsageDescription` added to Info.plist\n- [ ] `MusicAuthorization.request()` called before any MusicKit access\n- [ ] Subscription checked before attempting catalog playback\n- [ ] `ApplicationMusicPlayer` used (not `SystemMusicPlayer`) for app-scoped playback\n- [ ] Background audio mode enabled if music plays in background\n- [ ] Now Playing info updated on every track change (for custom audio)\n- [ ] Remote command handlers return `.success` for supported commands\n- [ ] Unsupported remote commands disabled with `isEnabled = false`\n- [ ] Artwork provided in Now Playing info for Lock Screen display\n- [ ] Elapsed playback time updated periodically for scrubber accuracy\n- [ ] Subscription offer presented when user lacks Apple Music subscription\n\n## References\n\n- Extended patterns (SwiftUI integration, genre browsing, playlist management): [references/musickit-patterns.md](references/musickit-patterns.md)\n- [MusicKit framework](https://sosumi.ai/documentation/musickit)\n- [MusicAuthorization](https://sosumi.ai/documentation/musickit/musicauthorization)\n- [ApplicationMusicPlayer](https://sosumi.ai/documentation/musickit/applicationmusicplayer)\n- [MusicCatalogSearchRequest](https://sosumi.ai/documentation/musickit/musiccatalogsearchrequest)\n- [MusicSubscription](https://sosumi.ai/documentation/musickit/musicsubscription)\n- [MPRemoteCommandCenter](https://sosumi.ai/documentation/mediaplayer/mpremotecommandcenter)\n- [MPNowPlayingInfoCenter](https://sosumi.ai/documentation/mediaplayer/mpnowplayinginfocenter)\n- [NSAppleMusicUsageDescription](https://sosumi.ai/documentation/bundleresources/information-property-list/nsapplemusicusagedescription)","tags":["musickit","swift","ios","skills","dpearson2699","accessibility","agent-skills","ai-coding","apple","claude-code","codex-skills","cursor-skills"],"capabilities":["skill","source-dpearson2699","skill-musickit","topic-accessibility","topic-agent-skills","topic-ai-coding","topic-apple","topic-claude-code","topic-codex-skills","topic-cursor-skills","topic-ios","topic-ios-development","topic-liquid-glass","topic-localization","topic-mapkit"],"categories":["swift-ios-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/dpearson2699/swift-ios-skills/musickit","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add dpearson2699/swift-ios-skills","source_repo":"https://github.com/dpearson2699/swift-ios-skills","install_from":"skills.sh"}},"qualityScore":"0.684","qualityRationale":"deterministic score 0.68 from registry signals: · indexed on github topic:agent-skills · 468 github stars · SKILL.md body (11,274 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T00:53:43.728Z","embedding":null,"createdAt":"2026-04-18T22:01:06.718Z","updatedAt":"2026-04-22T00:53:43.728Z","lastSeenAt":"2026-04-22T00:53:43.728Z","tsv":"'/documentation/bundleresources/information-property-list/nsapplemusicusagedescription)':1114 '/documentation/mediaplayer/mpnowplayinginfocenter)':1110 '/documentation/mediaplayer/mpremotecommandcenter)':1106 '/documentation/musickit)':1086 '/documentation/musickit/applicationmusicplayer)':1094 '/documentation/musickit/musicauthorization)':1090 '/documentation/musickit/musiccatalogsearchrequest)':1098 '/documentation/musickit/musicsubscription)':1102 '0':940,942 '1':121 '1.0':607 '2':132 '25':274 '26':64 '3':144 '300':301,303 '6.3':62 'access':141,170,205,257,993 'accuraci':1061 'activ':316 'ad':18,619,985 'add':128,133,148,768 'affect':417,851 'aftercurrententri':539 'airpod':656 'album':496,497,501 'api':208 'app':38,140,189,413,739,745,848,856,862,872,879,1006 'app-scop':861,878,1005 'append':505 'appendtoqueu':512 'appl':3,21,42,142,178,243,251,317,359,363,394,406,573,1068 'applicationmusicplay':48,82,86,403,404,568,842,859,1000,1091 'applicationmusicplayer.queue':488 'applicationmusicplayer.shared':426,884 'artist':583,598,936 'artwork':295,305,620,627,639,1044 'artwork.url':299 'async':194,263,327,342,431,443,498,515,532,802,818 'attempt':784,997 'audio':150,563,1010,1028 'auth':160 'author':68,69,166,181,203,742 'automat':571 'await':198,278,333,344,436,446,503,518,535,757,774,807,823,833 'background':146,151,1009,1017 'bodi':388 'bool':329 'boundssiz':629 'break':209,219,222,225,466,469,475,478,957 'brows':1077 'build':481 'button':391,661 'call':989 'capabl':125,763,979 'carplay':552,660 'case':202,210,220,464,467,470 'catalog':6,44,70,73,159,236,245,256,787,998 'catalog-search':72 'center':101,105,550,645,666,704 'center.changeplaybackpositioncommand.addtarget':706 'center.nexttrackcommand.addtarget':678 'center.pausecommand.addtarget':673 'center.playcommand.addtarget':668 'center.previoustrackcommand.addtarget':683 'center.seekbackwardcommand.isenabled':696 'center.seekforwardcommand.isenabled':694 'center.skipforwardcommand.addtarget':970 'center.skipforwardcommand.isenabled':974 'chang':339,850,895,913,928,1025 'check':49,76,79,228,309,310,780,995 'checklist':112,115,977 'checksubscript':326 'clearnowplay':615 'com.apple.developer.musickit':130 'command':30,100,104,644,689,947,953,962,1030,1036,1039 'commandfail':717,956,972 'common':106,109,723 'common-mistak':108 'configur':120,754 'confus':902 'content':65,180,408,575,788 'control':28,549,655,844,960 'correct':760,813,877,923,973 'crash':740,759 'current':229,234,554,911 'custom':562,1027 'data':175 'default':224,477 'deni':211 'descript':733 'disabl':688,961,1040 'display':282,553,1053 'durat':585,601,938 'elaps':587,604,941,1054 'els':354,715,827 'enabl':122,216,350,761,980,1012 'enablescrub':702 'entitl':131,730,737,753 'essenti':559 'event':707,712 'everi':908,926,1023 'exist':509 'explain':137 'extend':1072 'fail':793,809 'fals':386,695,697,975,1043 'featur':323 'first':766 'firstsong.title':922 'flow':24 'forget':778,887,919 'framework':1083 'full':204,255,351 'func':192,259,325,340,427,438,441,452,494,511,528,579,614,622,663,701,798,814,929 'genr':1076 'gestur':658 'global':846 'guard':709,825 'guidanc':214 'handl':31,569,949 'handler':647,1031 'height':302 'imag':624,632 'image.size':630 'import':155,157,162,375,377,577 'independ':409 'info':35,94,98,542,590,593,596,599,602,605,608,613,634,637,642,892,907,1020,1049 'info.plist':136,771,987 'initi':490 'insert':523 'instal':190 'instead':967 'integr':2,1075 'interrupt':472 'io':37,63 'isen':1042 'ispres':399 'item':493 'lack':1067 'let':196,233,275,294,297,330,424,459,626,665,703,710,755,772,820,874,882 'load':304 'lock':547,653,900,958,1051 'manag':26,45,88,91,480,1079 'manipul':483 'mean':841 'mediaplay':15,163,578 'metadata':11,55,556,897 'mistak':107,110,724 'mode':152,1011 'modifi':867 'mpchangeplaybackpositioncommandev':714 'mpmediaitemartwork':628 'mpmediaitempropertyartist':597 'mpmediaitempropertyartwork':638 'mpmediaitempropertyplaybackdur':600 'mpmediaitempropertytitl':594 'mpnowplayinginfocent':57,165,544,1107 'mpnowplayinginfocenter.default':611,616,635,640 'mpnowplayinginfomediatype.audio.rawvalue':610 'mpnowplayinginfopropertyelapsedplaybacktim':603 'mpnowplayinginfopropertymediatyp':609 'mpnowplayinginfopropertyplaybackr':606 'mpremotecommandcent':59,164,649,1103 'mpremotecommandcenter.shared':667,705 'multipl':492 'music':4,19,22,43,143,174,179,244,252,318,360,364,395,407,412,574,847,855,871,1014,1069 'musicauthor':1087 'musicauthorization.currentstatus':235 'musicauthorization.request':199,758,775,988 'musicauthorization.status':195 'musiccatalogsearchrequest':239,268,1095 'musicitemcollect':265 'musickit':1,13,39,124,158,207,376,566,729,736,762,978,992,1082 'musicofferview':380 'musicsubscript':1099 'musicsubscription.current':334,824 'musicsubscription.subscriptionupdates':347 'musicsubscriptionoff':398 'must':248 'next':527 'nil':618 'non':565 'non-musickit':564 'notdetermin':221 'now-playing-info':95 'nowplayinginfo':612,617,636,641 'nsapplemusicusagedescript':134,744,769,984,1111 'observ':337,448,457 'observeplayback':453 'observesubscript':341 'offer':321,357,358,366,1063 'one':185 'one-tim':184 'ontrackchang':930 'pattern':1073 'paus':439,468 'pauseplayback':675 'per':188 'period':1058 'permiss':168 'play':10,34,54,93,97,177,405,465,526,541,561,786,799,815,891,906,1015,1019,1048 'playalbum':495 'playback':5,27,46,80,84,147,161,322,352,401,449,485,783,864,881,999,1008,1055 'playback-with-applicationmusicplay':83 'player':420,425,875,883 'player.pause':440 'player.play':437,504,808,834 'player.queue':433,500,804,830 'player.queue.insert':519,536 'player.skiptonextentry':447 'player.state':454,461 'playlist':1078 'playnext':529 'playsong':428 'posit':521,538 'positionev':711 'positionevent.positiontime':720 'present':361,1064 'print':289 'privat':383 'project':119,983 'prompt':187,232 'properti':458 'provid':1045 'publish':52 'queue':25,87,90,479,486,510,849,873 'queue-manag':89 'refer':116,117,1071 'references/musickit-patterns.md':1080,1081 'regist':646,945,951 'reject':747 'remot':29,99,103,643,946,1029,1038 'remote-command-cent':102 'request':167,267 'request.limit':273 'request.response':279 'requestmusicaccess':193 'respond':651 'respons':276 'response.songs':281 'restrict':212 'result':283 'resumeplayback':670 'return':226,280,335,671,676,681,686,716,721,829,955,1032 'review':111,114,746,976 'review-checklist':113 'scope':863,880,1007 'screen':548,654,901,959,1052 'scrub':698 'scrubber':1060 'search':7,20,40,71,74,237,241 'searchcatalog':260 'seek':718 'seekingbackward':474 'seekingforward':473 'set':218,916 'setartwork':623 'setup':66,67,118 'setupremotecommand':664 'sheet':367 'show':213,355 'showoff':385,396,400 'showsubscriptionoff':828 'silent':792 'skill' 'skill-musickit' 'skip':727 'skiptonext':442,680 'skiptoprevi':685 'song':286,288,429,430,434,506,513,514,520,524,530,531,537,800,801,805,816,817,831,931,932 'song.artistname':292,937 'song.artwork':296 'song.duration':939 'song.self':272 'song.title':290,935 'sosumi.ai':1085,1089,1093,1097,1101,1105,1109,1113 'sosumi.ai/documentation/bundleresources/information-property-list/nsapplemusicusagedescription)':1112 'sosumi.ai/documentation/mediaplayer/mpnowplayinginfocenter)':1108 'sosumi.ai/documentation/mediaplayer/mpremotecommandcenter)':1104 'sosumi.ai/documentation/musickit)':1084 'sosumi.ai/documentation/musickit/applicationmusicplayer)':1092 'sosumi.ai/documentation/musickit/musicauthorization)':1088 'sosumi.ai/documentation/musickit/musiccatalogsearchrequest)':1096 'sosumi.ai/documentation/musickit/musicsubscription)':1100 'sourc':567 'source-dpearson2699' 'stale':896 'state':382,422,450,460,857 'state.playbackstatus':463 'status':197,201,227,230,756,773 'stop':471 'string':262,582,584,591 'struct':379 'sub':821 'sub.canplaycatalogcontent':826 'submiss':749 'subscrib':373,392 'subscript':23,50,75,78,253,308,319,331,338,345,356,365,781,791,812,994,1062,1070 'subscription-check':77 'subscription.canplaycatalogcontent':336,349 'success':672,677,682,687,722,1033 'support':693,699,966,1035 'swift':61,156,191,258,284,324,374,423,451,489,576,621,662,700,750,796,865,914,968 'swiftui':378,1074 'switch':200,462 'system':419 'systemmusicplay':838,843,1003 'systemmusicplayer.shared':876 'tail':522 'tap':657 'target':60 'term':261,269,270 'throw':264,328,432,444,499,516,533,795,803,819 'time':186,909,1056 'timeinterv':586,588 'titl':581,595,921,934 'topic-accessibility' 'topic-agent-skills' 'topic-ai-coding' 'topic-apple' 'topic-claude-code' 'topic-codex-skills' 'topic-cursor-skills' 'topic-ios' 'topic-ios-development' 'topic-liquid-glass' 'topic-localization' 'topic-mapkit' 'track':555,894,912,927,1024 'tri':277,332,435,445,502,517,534,806,822,832 'true':397 'type':271 'ui':353 'uibackgroundmod':154 'uiimag':625 'unknown':223,476 'unsupport':1037 'updat':543,889,904,924,1021,1057 'updatenowplay':580,920,933 'url':298,307 'usag':732 'use':12,16,238,487,837,858,1001 'user':172,247,313,370,853,869,903,1066 'var':266,384,387,589,633 'via':56 'view':381,390 'whether':311 'width':300 'without':231,734,743,789,948 'wrong':751,797,866,915,969 'xcode':127,765,982","prices":[{"id":"11c9fcde-0472-4a3e-baba-3e33426dee05","listingId":"85d9c449-952a-4f36-9fe9-ef8e9f7c95ca","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"dpearson2699","category":"swift-ios-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T22:01:06.718Z"}],"sources":[{"listingId":"85d9c449-952a-4f36-9fe9-ef8e9f7c95ca","source":"github","sourceId":"dpearson2699/swift-ios-skills/musickit","sourceUrl":"https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/musickit","isPrimary":false,"firstSeenAt":"2026-04-18T22:01:06.718Z","lastSeenAt":"2026-04-22T00:53:43.728Z"}],"details":{"listingId":"85d9c449-952a-4f36-9fe9-ef8e9f7c95ca","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"dpearson2699","slug":"musickit","github":{"repo":"dpearson2699/swift-ios-skills","stars":468,"topics":["accessibility","agent-skills","ai-coding","apple","claude-code","codex-skills","cursor-skills","ios","ios-development","liquid-glass","localization","mapkit","networking","storekit","swift","swift-concurrency","swiftdata","swiftui","widgetkit","xcode"],"license":"other","html_url":"https://github.com/dpearson2699/swift-ios-skills","pushed_at":"2026-04-21T19:26:16Z","description":"Agent Skills for iOS 26+, Swift 6.3, SwiftUI, and modern Apple frameworks","skill_md_sha":"a8b9d3e12460c6a735a607572096d8b10a989ede","skill_md_path":"skills/musickit/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/musickit"},"layout":"multi","source":"github","category":"swift-ios-skills","frontmatter":{"name":"musickit","description":"Integrate Apple Music playback, catalog search, and Now Playing metadata using MusicKit and MediaPlayer. Use when adding music search, Apple Music subscription flows, queue management, playback controls, remote command handling, or Now Playing info to iOS apps."},"skills_sh_url":"https://skills.sh/dpearson2699/swift-ios-skills/musickit"},"updatedAt":"2026-04-22T00:53:43.728Z"}}