检查iphone中的网络可达性后应用程序崩溃?
Posted
技术标签:
【中文标题】检查iphone中的网络可达性后应用程序崩溃?【英文标题】:app crashes after checking network reachability in iphone? 【发布时间】:2012-05-02 12:08:37 【问题描述】:我有一个 mpmovieplayercontroller 播放在线音乐和一个 avaudiosession 在后台播放相同的音乐,当第一次在没有网络访问的情况下启动应用程序时,通常我显示“没有互联网连接”,当我尝试连接到互联网并播放它时显示错误
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'An AVPlayerItem cannot be associated with more than one instance of AVPlayer'
我的代码在这里
static MPMoviePlayerController *player=nil;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self)
// Custom initialization
[MainViewController stopStreaming];
player = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:@"http://159.253.145.180:7104"]];
player.movieSourceType = MPMovieSourceTypeStreaming;
player.view.hidden = YES;
[self.view addSubview:player.view];
[player prepareToPlay];
[player play];
return self;
- (void)viewDidLoad
[super viewDidLoad];
NSError *setCategoryErr = nil;
NSError *activationErr = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryErr];
[[AVAudioSession sharedInstance] setActive: YES error: &activationErr];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid;
newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
Reachability* reachabile = [Reachability reachabilityWithHostName:@"www.apple.com"];
NetworkStatus remoteHostStatus = [reachabile currentReachabilityStatus];
if(remoteHostStatus == NotReachable)
NSLog(@"not reachable");
UIAlertView *notReachableAlert=[[UIAlertView alloc]initWithTitle:@"NO INTERNET CONNECTION" message:@"This Application Need Internet To Run" delegate:self cancelButtonTitle:@"Okay Buddy" otherButtonTitles: nil];
notReachableAlert.delegate=self;
[notReachableAlert show];
[notReachableAlert release];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerPlaybackStateDidChange:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerLoadStateChanged:) name:MPMoviePlayerLoadStateDidChangeNotification object:player];
MPVolumeView *volumeView = [[[MPVolumeView alloc] initWithFrame:CGRectMake(22, 320, 200, 15)] autorelease];
volumeView.center = CGPointMake(152,372);
[volumeView sizeToFit];
[self.view addSubview:volumeView]; // Do any additional setup after loading the view from its nib.
连接互联网后点击播放按钮时应用程序崩溃,有什么解决办法吗?
【问题讨论】:
你真的应该多花一点时间来格式化你的代码。它几乎无法阅读。为读者提供的内容越简单,就越有可能获得好的和有用的答案。 有很多可能的原因。第1步;在 viewDidAppear 中初始化你的播放器,而不是在 initWithNib 中。 @Till 很抱歉没有正确安排代码,我认为当我为后台活动添加代码 AVAudioSession 时问题(错误)来了,实际上我在哪里初始化播放器及其属性? 在 viewDidAppear 中初始化播放器(如前所述),在初始化播放器之前初始化会话。基本上只需在 viewDidAppear 中执行您当前执行的所有操作。 【参考方案1】:我遇到了同样的问题。对我有用的解决方案是删除指令
player.movieSourceType = MPMovieSourceTypeStreaming;
【讨论】:
谢谢!这对我有帮助 - 使用简单的 init(而不是 initWithContentURL)进行初始化,然后设置 movieSourceType,然后设置 contentURL。 谢谢@PavelAlexeev,这是我需要的。【参考方案2】:我认为这是由于静态播放器。尝试使用movieplayer的属性
用途:
@property (nonatomic,retain) MPMoviePlayerController *player;
实施中:
@synthesize player = _player;
在初始化中:
MPMoviePlayerController *plyr = [MPMoviePlayerController alloc] init];
self.player = plyr;
[plyr relaease];
在你的代码中
[controller setContentURL:movieURL];
【讨论】:
"一个 AVPlayerItem 不能与多个 AVPlayer 实例关联" 你使用的属性是什么?【参考方案3】:我认为这可能是由于玩家已经存在。
尝试添加如下内容:
if (player != nil)
[player release];
player = nil; //i prefer to do both, just to be sure.
放在后面
[MainViewController stopStreaming];
和之前的
player = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:@"http://159.253.145.180:7104"]];
【讨论】:
span class="comcopy">sorry,问题依然存在,提示“An AVPlayerItem cannot be associated with more than one instance of AVPlayer”,此错误仅在应用第一次无网络启动时出现.. 【参考方案4】:我不确定这是否正确,但如果你检查过链接
MPMoviewPlayerController Class Reference
其中包括来自苹果的代码:
MPMoviePlayerController *player =
[[MPMoviePlayerController alloc] initWithContentURL: myURL];
[player prepareToPlay];
[player.view setFrame: myView.bounds]; // player's frame must match parent's
[myView addSubview: player.view];
// ...
[player play];
也许您需要先prepareToPlay,然后将其作为子视图添加到您的视图中......
我不确定,但希望这会有所帮助..
【讨论】:
以上是关于检查iphone中的网络可达性后应用程序崩溃?的主要内容,如果未能解决你的问题,请参考以下文章
使用 AppDelegate 中的可达性块检查整个应用程序的连接性