SoundFree Radio iOS App Template Objective-C

Build the world’s coolest music streaming app.

Music apps rule, and streaming apps are the best of the bunch.  Think of the killer iPhone streaming apps like Pandora, Spotify, Soundcloud (even Music on iOS). Then think of all the other niches which could be filled with a music streaming app. Internet radio, Music genres, Bands, DJs and more.  So, we have build the ultimate music streaming app template to help you build out a music streaming app. It’s connected to the open Soundcloud API, and the it can to plug in XML internet radio feeds.  The music you see playing on the play screen is coming straight from Soundcloud API. The radio view plays a feed direct from internet radio feed. On top of all that, it looks and feels amazing to use.  Because we understand the most important thing for any app is usability.

 

What’s included in this download

  • App Template Xcode project written in native Objective-C
  • Original layered Adobe Photoshop .psd files you can edit
  • 25+ Sliced .png files
  • Extensive Documentation Download
myapptemplates SoundFree Radio iOS App Template

Build the world’s coolest music streaming app. Music apps rule, and streaming apps are the best of the bunch.  Think of the killer iPhone streaming apps like Pandora, Spotify, Soundcloud (even Music on iOS). Then think of all the other niches which could be filled with a music streaming app. Internet radio, Music genres, Bands, […]

  • License Details
  • Objective-C Sample Project
  • .PSD files
  • Retina support
  • .PNG Artwork
  • iOS 10 optimised
Our iOS and Android app templates are a perfect place to start building awesome apps. Get a functional native code base, eye-catching beautiful artwork with excellent UX, icon artwork and documentation. Make your app so beautiful it can't be ignored

Native Tab Bar Layout

Beautiful Custom Music Player

Custom Profile View

Highest Quality UX design

XML Internet Radio Streaming

Soundcloud API integration

Code Snippet

//
//  HomeViewController.m
//  SoundFree
//
//  Copyright (c) 2014 MyAppTemplates. All rights reserved.
//

#import "HomeViewController.h"
#import "UIImageView+AFNetworking.h"
#import "SCUI.h"
#import "AppDelegate.h"

@interface HomeViewController ()

@end

@implementation HomeViewController
@synthesize player;

- (void)viewDidLoad {
    [super viewDidLoad];
    self.contentScroll.contentSize = CGSizeMake(784, self.contentScroll.frame.size.height);
    self.contentScroll.contentOffset = CGPointMake(784/2 - self.contentScroll.frame.size.width/2, 0);
    if (appDelegate == nil) {
        appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    }
    if ((currentIndex < 0) || (currentIndex > appDelegate.soundArray.count-1)) {
        currentIndex = 0;
    }
    //[self playSongAtIndex:0];
    // Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)viewWillAppear:(BOOL)animated {
    [self updateUI];
}

- (void)playSongAtIndex:(int)index
{
    currentIndex = index;
    [self updateUI];
    [self initializePlayer];
    
}

- (void)initializePlayer {

    if (player != nil) {
        player = nil;
    }
    SCAccount *account = [SCSoundCloud account];
    [SCRequest performMethod:SCRequestMethodGET
                  onResource:[NSURL URLWithString:[[appDelegate.soundArray objectAtIndex:currentIndex] objectForKey:@"stream_url"]]
             usingParameters:nil
                 withAccount:account
      sendingProgressHandler:nil
             responseHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                 NSError *playerError;
                 
                 player = [[AVAudioPlayer alloc] initWithData:data error:&playerError];
                 [player prepareToPlay];
                 player.delegate = self;
                 btnPlay.selected = YES;
                 [player play];
             }];

}

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
    btnPlay.selected = NO;
}

-(IBAction)togglePlayer:(id)sender {
    if (player.isPlaying) {
        [player stop];
        btnPlay.selected = NO;
    } else if (player != nil) {
        [player play];
        btnPlay.selected = YES;
    } else {
        [self playSongAtIndex:currentIndex];
    }
}

- (IBAction)nextBtnTapped:(id)sender {
    if (currentIndex < appDelegate.soundArray.count - 2) {
        [self playSongAtIndex:currentIndex + 1];
    }
}

- (IBAction)previousBtnTapped:(id)sender{
    if (currentIndex > 0) {
        [self playSongAtIndex:currentIndex - 1];
    }
}

- (void)updateUI {
    
    [imgSong setImage:[UIImage imageNamed:@"slide-img-round"]];
    [imgSong1 setImage:[UIImage imageNamed:@"slide-img-round"]];
    [imgSong2 setImage:[UIImage imageNamed:@"slide-img-round"]];
    
    if (appDelegate == nil) {
        appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    }
    [self setImageForView:imgSong name:[[appDelegate.soundArray objectAtIndex:currentIndex] objectForKey:@"artwork_url"]];
    if (currentIndex < appDelegate.soundArray.count -2){
        [self setImageForView:imgSong2 name:[[appDelegate.soundArray objectAtIndex:currentIndex+1] objectForKey:@"artwork_url"]];
        
    }
    if (currentIndex > 0) {
        [self setImageForView:imgSong1 name:[[appDelegate.soundArray objectAtIndex:currentIndex-1] objectForKey:@"artwork_url"]];
        
    }
    [self setTextForLabel:lblTrack name:[[appDelegate.soundArray objectAtIndex:currentIndex] objectForKey:@"title"]];
    [self setTextForLabel:lblAlbum name:[[appDelegate.soundArray objectAtIndex:currentIndex] objectForKey:@"genre"]];
}

- (void)setTextForLabel:(UILabel *)lbl name:(NSString *)name {
    if (![name isKindOfClass:[NSNull class]]){
        [lbl setText:name];
    }
}

- (void)setImageForView:(UIImageView *)img name:(NSString *)name {
    if (![name isKindOfClass:[NSNull class]]){
        [img setImageWithURL:[NSURL URLWithString:name]];
    }
}

- (void)playButtonTapped {
    //http://www.abc.net.au/res/streaming/audio/aac/triplej.pls
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end

Template Benefits

  • iOS 10 ready
  • iPhone 5/6/7/7+ ready
  • Beautiful, minimal design with excellent UX flow
  • Ready to run right away in Xcode 8
  • Prebuilt functionality saves you hundreds of hours of designing, programming, and testing
  • Customise the template in Xcode 8 to build your own app
  • Adheres to Apple’s strict Human Interface Guidelines for easier app approval
  • The easiest way to create your own app!