2014-01-14 42 views
0

我有一個音樂播放器應用程序,用於在應用程序運行時檢查互聯網連接。當連接消失時,我正在顯示一條警告消息並停止播放歌曲。如果連接回來,我再次播放歌曲時沒有用戶做任何事情,但問題是,當歌曲再次播放時,我無法隱藏警報。下面是代碼:如何在互聯網連接回來時隱藏警報框?

#import "FirstViewController.h" 
CM_EXPORT const CMTime kCMTimeZero; 
@interface FirstViewController() 

@end 


@implementation FirstViewController 
@synthesize metadatas; 
@synthesize toggleButton; 
@synthesize slider; 
@synthesize mpVolumeView = _mpVolumeView; 
@synthesize viewVolume; 

- (void)viewDidLoad 
{ 

    toggleIsOn=TRUE; 

    MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:self.viewVolume.bounds] ; 

    [self.viewVolume addSubview:volumeView]; 

    [volumeView sizeToFit]; 
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
} 

-(IBAction)playButtonPressed:(id)sender 
{ 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setBool:TRUE forKey:@"FirstPlay"]; 
    [defaults setBool:YES forKey:@"alertShown"]; 

    if(toggleIsOn){ 

     toggleIsOn=!toggleIsOn; 

     player = nil; 
     NSString *stringurl = @""; 
     stringurl = @"http://majestic.wavestreamer.com:6221/listen.pls"; 
     NSURL *url = [NSURL URLWithString:stringurl]; 
     asset = [AVURLAsset URLAssetWithURL:url options:nil]; 
     playerItem = [AVPlayerItem playerItemWithAsset:asset]; 
     player = [AVPlayer playerWithPlayerItem:playerItem]; 
     player.actionAtItemEnd = AVPlayerActionAtItemEndNone; 
     [playerItem addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:nil]; 
     [playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil]; 
     [player play]; 

     NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; 
     [center addObserver:self selector:@selector(audioSessionInterrupted:) name:AVAudioSessionInterruptionNotification object:nil]; 

     [self.toggleButton setImage:[UIImage imageNamed:@"reload.png"] forState:UIControlStateNormal]; 
     [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 
     [[AVAudioSession sharedInstance] setActive: YES error: nil]; 
     [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
    } 
    else { 

     [self.toggleButton setImage:[UIImage imageNamed:@"playMusic.png"] forState:UIControlStateNormal]; 
     self->player.rate=0.0; 
     toggleIsOn=!toggleIsOn; 



    } 


} 
- (void)audioSessionInterrupted:(NSNotification *)notification 
{ 

    NSNumber *interruptionType = [[notification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey]; 
    NSNumber *interruptionOption = [[notification userInfo] objectForKey:AVAudioSessionInterruptionOptionKey]; 

    switch (interruptionType.unsignedIntegerValue) { 
     case AVAudioSessionInterruptionTypeBegan:{ 
      // [self.toggleButton setImage:[UIImage imageNamed:@"playMusic.png"] forState:UIControlStateNormal]; 

      // • Audio has stopped, already inactive 
      // • Change state of UI, etc., to reflect non-playing state 
     } break; 
     case AVAudioSessionInterruptionTypeEnded:{ 
      // • Make session active 
      // • Update user interface 
      // • AVAudioSessionInterruptionOptionShouldResume option 
      if (interruptionOption.unsignedIntegerValue == AVAudioSessionInterruptionOptionShouldResume) { 
       // Here you should continue playback. 
       [player play]; 
      } 
     } break; 


     default: 
      break; 
    } 

} 


- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)audioPlayer 
{ 
    [player pause]; 
} 
-(void)audioRecorderEndInterruption:(AVAudioRecorder *)audioPlayer 
{ 
    [player play]; 
} 






- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setBool:TRUE forKey:@"alertShown"]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil]; 

    internetReachable = [Reachability reachabilityForInternetConnection]; 
    [internetReachable startNotifier]; 

    // check if a pathway to a random host exists 
    hostReachable = [Reachability reachabilityWithHostName:@"www.apple.com"]; 
    [hostReachable startNotifier]; 


} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
    [self becomeFirstResponder]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [[UIApplication sharedApplication] endReceivingRemoteControlEvents]; 
    [self resignFirstResponder]; 
} 

- (void)viewDidDisappear:(BOOL)animated 
{ 
    [super viewDidDisappear:animated]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
} 


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
         change:(NSDictionary *)change context:(void *)context { 

    [playerItem removeObserver:self forKeyPath:keyPath]; 


    if ([keyPath isEqualToString:@"status"]) { 
     AVPlayerItem *pItem = (AVPlayerItem *)object; 
     if (pItem.status == AVPlayerItemStatusReadyToPlay) 
     { 
      metadatas.text = @""; 
     } 
    } 
    if ([keyPath isEqualToString:@"timedMetadata"]) { 
     for (AVAssetTrack *track in playerItem.tracks) { 
      for (AVPlayerItemTrack *item in player.currentItem.tracks) { 
       if ([item.assetTrack.mediaType isEqual:AVMediaTypeAudio]) { 
        NSArray *meta = [playerItem timedMetadata]; 
        for (AVMetadataItem *metaItem in meta) { 

         NSString *source = metaItem.stringValue; 
         metadatas.text = source; 
        } 
       } 
      } 
     } 
    } 

    [self.toggleButton setImage:[UIImage imageNamed:toggleIsOn ? @"playMusic.png" :@"stop.png"] forState:UIControlStateNormal]; 

} 


-(IBAction)fbButtonPressed:(id)sender 
{ 

    NSURL *url = [NSURL URLWithString:@"http://www.facebook.com"]; 

    if (![[UIApplication sharedApplication] openURL:url]) 
     NSLog(@"%@%@",@"Failed to open url:",[url description]); 
} 


-(IBAction)inButtonPressed:(id)sender 
{ 

    NSURL *url = [NSURL URLWithString:@"http://www.linkedin.com"]; 

    if (![[UIApplication sharedApplication] openURL:url]) 
     NSLog(@"%@%@",@"Failed to open url:",[url description]); 
} 

-(IBAction)tweetButtonPressed:(id)sender 
{ 

    NSURL *url = [NSURL URLWithString:@"http://www.twitter.com"]; 

    if (![[UIApplication sharedApplication] openURL:url]) 
     NSLog(@"%@%@",@"Failed to open url:",[url description]); 
} 
-(IBAction) sliderChanged:(id)sender 
{ 


} 
-(void) checkNetworkStatus:(NSNotification *)notice 
{ 
    // called after network status changes 
    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus]; 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    switch (internetStatus) 
    { 
     case NotReachable: 
     { 
      NSLog(@"The internet is down."); 
      NSLog(@"%d",[defaults boolForKey:@"alertShown"]); 
      BOOL isAlertShown = [defaults boolForKey:@"alertShown"]; 
      if(isAlertShown) 
      { 

       [self showAlert]; 
      } 

      break; 
     } 
     case ReachableViaWiFi: 
     { 
      NSLog(@"The internet is working via WIFI."); 


      BOOL isFirstTimePlayed = [defaults boolForKey:@"FirstPlay"]; 
      if(isFirstTimePlayed) 
      { 
       [self playButtonPressed:nil]; 

      } 


      break; 
     } 
     case ReachableViaWWAN: 
     { 
      NSLog(@"The internet is working via WWAN."); 
      [self playButtonPressed:nil]; 

      break; 
     } 
    } 

    } 

-(void)showAlert 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setBool:FALSE forKey:@"alertShown"]; 

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"Alert" message: @"You have lost data connectivity. Please wait while we try to establish the connection again." delegate: nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [alert show]; 



} 



- (NSUInteger)supportedInterfaceOrientations{ 
    return UIInterfaceOrientationMaskPortrait; 
} 




@end 
+0

這與'iOS','iOS7','xcode IDE'和'xcode 5 IDE'有什麼關係?正確標記您的問題將爲您提供最佳答案。 – Popeye

+0

@Popeye - 這是iOS特定的代碼。 – Aaron

+0

@Aaron不是它的'可可觸摸'特定的代碼。 – Popeye

回答

3

在你的方法showAlert,您必須將UIAlertView對象,alert參考。只需將該引用保存在一個屬性中,以便以後可以訪問它。

@interface FirstViewController() 
    @property (nonatomic, strong) UIAlertView* internetConnectivityAlertView; 
@end 

-(void)showAlert 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setBool:FALSE forKey:@"alertShown"]; 

    self.internetConnectivityAlertView = [[UIAlertView alloc] initWithTitle:@"Alert" 
                    message:@"You have lost data connectivity. Please wait while we try to establish the connection again." 
                    delegate:nil 
                  cancelButtonTitle:@"OK" 
                  otherButtonTitles:nil]; 
    [self.internetConnectivityAlertView show]; 
} 

當你獲得互聯網連接,只需撥打

if(self.internetConnectivityAlertView) 
{ 
    [self.internetConnectivityAlertView dismissWithClickedButtonIndex:0 animated:YES]; 
    self.internetConnectivityAlertView = nil; 
} 

到解除警報。

請參閱UIAlertView的API文檔。

+0

很好的答案。我無法相信蘋果在寫iOS時想到多少東西sdk – user2277872

+0

什麼是我獲得互聯網連接的部分。 – ZooZ

+0

您的方法'-checkNetworkStatus:'是您用來檢查連通性的方法。在「ReachableViaWiFi」和「ReachableViaWWAN」的情況下,您知道您有連接並且可以隱藏警報。 – Aaron