SBStatusBarController instance

2020-01-28 08:53发布

问题:

Could somebody help me with small sample how to get SBStatusBarController instance? I took a look at many forums and source codes and it doesn't work for me :(

Thank you.

回答1:

Ok, I've found the way how to show double-height statusbar like In-Call status bar without SpringBoard and using legal means. Here is a solution. There are two ways to show double-haight status bar with application name while application is in baground mode: Connect to VoIP service using sockets or to simulate audio recording. Using the first way you will see green glowing statusbar and if you prefer red color you have to use the second one. Ok, I use the second approach and perform audio recording simulation. To reach this, just add following strings to PLIST config file of application:

<key>UIBackgroundModes</key>
<array>
    <string>voip</string>
    <string>audio</string>
</array>

It will tells iOS that your application will use audio and VoIP in background. And now code. We will simulate audio recording from microphone to NULL device:

- (void) startRecording
{

    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    NSError *err = nil;
    [audioSession setCategory :AVAudioSessionCategoryPlayAndRecord error:&err];
    if(err){
        NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
        return;
    }
    [audioSession setActive:YES error:&err];
    err = nil;
    if(err){
        NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
        return;
    }


    recordSetting = [[NSMutableDictionary alloc] init];

    [recordSetting setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];
    [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; 
    [recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];

    [recordSetting setValue :[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
    [recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
    [recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];


    NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];    
    err = nil;
    recorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recordSetting error:&err];
    if(!recorder){
        NSLog(@"recorder: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
        UIAlertView *alert =
        [[UIAlertView alloc] initWithTitle: @"Warning"
                                   message: [err localizedDescription]
                                  delegate: nil
                         cancelButtonTitle:@"OK"
                         otherButtonTitles:nil];
        [alert show];
        [alert release];
        return;
    }

    //prepare to record
    [recorder setDelegate:self];
    [recorder prepareToRecord];
    recorder.meteringEnabled = YES;

    BOOL audioHWAvailable = audioSession.inputIsAvailable;
    if (! audioHWAvailable) {
        UIAlertView *cantRecordAlert =
        [[UIAlertView alloc] initWithTitle: @"Warning"
                                   message: @"Audio input hardware not available"
                                  delegate: nil
                         cancelButtonTitle:@"OK"
                         otherButtonTitles:nil];
        [cantRecordAlert show];
        [cantRecordAlert release]; 
        return;
    }

    // start recording
    [recorder record];//recordForDuration:(NSTimeInterval) 40];

}

Add this method to your application delegate and call it from didFinishLaunchingWithOptions. Also, as I understood, you can just set audio session category as AVAudioSessionCategoryPlayAndRecord and make it active. If you add this code to your project then in case you put your application into background you will see double-height statusbar with your application name inside.

I think that's all.

Thanks.



标签: ios sdk