0

着信音を静かにしたい。だから私はそれを行うためにこのリンクを使用しています - How to disable iOS System Sounds しかし、コードを使用する場合:

- (void) setSystemVolumeLevelTo:(float)newVolumeLevel
{
    Class avSystemControllerClass = NSClassFromString(@"AVSystemController");
    id avSystemControllerInstance = [avSystemControllerClass performSelector:@selector(sharedAVSystemController)];

NSString *soundCategory = @"Ringtone";

NSInvocation *volumeInvocation = [NSInvocation invocationWithMethodSignature:
                                  [avSystemControllerClass instanceMethodSignatureForSelector:
                                   @selector(setVolumeTo:forCategory:)]];
[volumeInvocation setTarget:avSystemControllerInstance];
[volumeInvocation setSelector:@selector(setVolumeTo:forCategory:)];
[volumeInvocation setArgument:&newVolumeLevel atIndex:2];
[volumeInvocation setArgument:&soundCategory atIndex:3];
[volumeInvocation invoke];

}

クラッシュします

NSInvocation *volumeInvocation = [NSInvocation invocationWithMethodSignature:
                                  [avSystemControllerClass instanceMethodSignatureForSelector:
                                   @selector(setVolumeTo:forCategory:)]];

返される値が nil であるためです。

そして、フレームワークなどをインポートしてからこのコードを使用すると

[[AVSystemController sharedAVSystemController] setVolumeTo:0.0 forCategory:@"Ringtone"];

次のエラーが表示されて実行されません。

Undefined symbols for architecture i386:
  "_OBJC_CLASS_$_AVSystemController", referenced from:
  objc-class-ref in SettingsViewController.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

誰かが私が間違っているところを教えてください。

4

1 に答える 1

2

最初のメソッドに次の行を追加するだけです。プライベート フレームワーク (Celestial) を使用しているため、実行時にインポートする必要があります。

NSBundle *bundle = [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/Celestial.framework"];
BOOL success = [bundle load];
于 2014-07-03T09:32:22.980 に答える