Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS 6 UIWebView video with no sound [duplicate]

Good day,

My app is a music playing app. I control the <audio>-Tag with Javascript. So far no problems, play, pause, next and previous buttons are working. When I stand-by the device in iOS 5, the music keeps playing, but the automatic next song doesn't work. When it isn't in stand-by, it works. And in iOS 6, just after pressing the button, the music fades out.

The Play/Pause button on the lockscreen works in iOS 5, but not in iOS 6.

like image 258
heysamhey Avatar asked Nov 24 '22 15:11

heysamhey


2 Answers

Starting with iOS 6, you MUST set the audio session category to 'playback' before creating the UIWebView. This is all you have to do. It is not necessary to make the session active.

This should be used for html video as well, because if you don't configure the session, your video will be muted when the ringer switch is off.

#import <AVFoundation/AVFoundation.h>

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
BOOL ok;
NSError *setCategoryError = nil;
ok = [audioSession setCategory:AVAudioSessionCategoryPlayback
                         error:&setCategoryError];
if (!ok) {
  NSLog(@"%s setCategoryError=%@", __PRETTY_FUNCTION__, setCategoryError);
}

Ensure that your target links to the AVFoundation framework.


If using Cordova, the file you need to modify is platforms/ios/MyApp/Classes/AppDelegate.m, and will end up looking like this:

#import "AppDelegate.h"
#import "MainViewController.h"
#import <AVFoundation/AVFoundation.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    BOOL ok;
    NSError *setCategoryError = nil;
    ok = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError];
    if (!ok) {
        NSLog(@"%s setCategoryError=%@", __PRETTY_FUNCTION__, setCategoryError);
    }

    self.viewController = [[MainViewController alloc] init];
    return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

@end

Also, as mentioned in the comments, you need to link the AVFoundation Framework, as explained in this answer:

  • Open your project with xcode open ./platforms/ios/MyApp.xcworkspace/
  • Project navigator > target My App > General
  • Scroll to the bottom to find Linked Frameworks and Libraries
like image 139
Chris Lundie Avatar answered Dec 09 '22 13:12

Chris Lundie


Swift Syntax:

in AppDelegate:

import AVFoundation

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
  do{
      let audio = AVAudioSession.sharedInstance()
      try audio.setCategory(AVAudioSession.Category.playback)
  }catch let error as NSError{
     print(error)
  }
}
like image 24
Weles Avatar answered Dec 09 '22 13:12

Weles