iositunesitunes-search-apiapple-music

play apple music songs by third party applications


I am using iTunes Search API in my application & playing the previewUrl songs from within the application by using

AVPlayer

If user wants to play the full song, he/she needs to purchase the song from iTunes Stores only then can he/she play the full song from application.

As apple released the Apple Music & giving the trial OR full membership to every one & allowing to play the full songs, is it possible to play Apple Music full songs from my application Like Previewurl by using

avplayer or mpmovieplayercontroller


Solution

  • @"Ted Hosmann" Thanks for reply .

    I would like to share some code from here

    viewcontroller.m

    @import StoreKit;
    
    -(void) submitAppleMusicTrackWithProductID: (NSString *) productID // productID in US is the last numbers after i= in the share URL from Apple Music
    {
        NSLog(@"submitAppleMusic has been called for productID: %@", productID);
        [SKCloudServiceController requestAuthorization:^(SKCloudServiceAuthorizationStatus status) {
            NSLog(@"status is %ld", (long)status);
            SKCloudServiceController *cloudServiceController;
            cloudServiceController = [[SKCloudServiceController alloc] init];
            [cloudServiceController requestCapabilitiesWithCompletionHandler:^(SKCloudServiceCapability capabilities, NSError * _Nullable error) {
                NSLog(@"%lu %@", (unsigned long)capabilities, error);
    
                if (capabilities >= SKCloudServiceCapabilityAddToCloudMusicLibrary)
                {
                    NSLog(@"You CAN add to iCloud!");
                    [[MPMediaLibrary defaultMediaLibrary] addItemWithProductID:productID completionHandler:^(NSArray<__kindof MPMediaEntity *> * _Nonnull           entities, NSError * _Nullable error)
                    {
                        NSLog(@"added id%@ entities: %@ and error is %@", productID, entities, error);
                        NSArray *tracksToPlay = [NSArray arrayWithObject:productID];
                        [[MPMusicPlayerController systemMusicPlayer] setQueueWithStoreIDs:tracksToPlay];
                        [[MPMusicPlayerController systemMusicPlayer] play];
    
                        [self performSelectorOnMainThread:@selector(getInfoFromAddedAppleMusicTrack:) withObject:productID waitUntilDone:YES];
    
                    }];
                }
                else
                {
                    NSLog(@"Blast! The ability to add Apple Music track is not there. sigh.");
                }
    
            }];
    
        }];
    }
    -(void) getInfoFromAddedAppleMusicTrack: (NSString *) productID
    {
        NSLog(@"FYI - musicplayer duration is: %f", [[[MPMusicPlayerController systemMusicPlayer] nowPlayingItem] playbackDuration]);
        //need to check for both the nowPlaying item and if there is a reported playbackDuration, as there is a variable time between a storeMediaItema and a concreteMediaItem
        if (([[MPMusicPlayerController systemMusicPlayer] nowPlayingItem]) && ([[[MPMusicPlayerController systemMusicPlayer] nowPlayingItem] playbackDuration]))
        {
            NSLog(@"Media item is playing: %@",[[MPMusicPlayerController systemMusicPlayer] nowPlayingItem]);
           NSLog(@"appleProductIDURL: %@",productID);
            NSLog(@"Ending time: %d",[[[[MPMusicPlayerController systemMusicPlayer] nowPlayingItem] valueForProperty:MPMediaItemPropertyPlaybackDuration] intValue]);
            NSLog(@"Track Name: %@", [[[MPMusicPlayerController systemMusicPlayer] nowPlayingItem] valueForProperty:MPMediaItemPropertyTitle]);
            NSLog(@"Artists Name: %@", [[[MPMusicPlayerController systemMusicPlayer] nowPlayingItem] valueForProperty:MPMediaItemPropertyArtist]);
    
        }
        else
        {
            NSLog(@"seems the track is not fully loaded so try again in 1 second");
    
            [self performSelector:@selector(getInfoFromAddedAppleMusicTrack:) withObject:productID afterDelay:1.0];
    
            // count loops and jump out if something is wrong - I've never seen more that 7 seconds needed
        }  
    }