swift 如何在动态岛中制作触觉?

s6fujrry  于 2023-09-30  发布在  Swift
关注(0)|答案(1)|浏览(110)

在iOS 17动态岛有能力与ButtonToggle互动。我希望在动态岛点击按钮时产生触觉效果。
正常的解决方案不工作在像UIImpactFeedbackGenerator.init(style: UIImpactFeedbackGenerator.FeedbackStyle.light).impactOccurred()这样的动态岛。
在我做了很多尝试之后,我发现最古老的生成触觉的方法--AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))仍然可以工作。
但问题是AudioServicesPlayAlertSound可以播放短触觉吗?
答案是肯定的!

hlswsv35

hlswsv351#

免责声明:以下解决方案需要调用私有Apple API,AppStore提交中不允许调用。即使在这个时候苹果的自动检查没有捕捉到这一点,如果在未来发生变化(或手动审查捕获的行为),您的应用程序可能会被阻止。使用这个要自担风险。

要使用AudioServicesPlaySystemSoundWithVibration成功地制作一个简短的触觉,你必须调用AudioToolbox中的一个私有方法。但是对于今天的App Store来说,这是安全的,因为我的应用程序使用了这项技术已经通过了审查。我相信App Store的审查者不会在你的应用程序中使用这项技术。
要创建它,您需要一个objective-c class

#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioServices.h>
#import <AudioToolbox/AudioToolbox.h>

#import "vibrate.h"
void AudioServicesPlaySystemSoundWithVibration(int, id, id);

@implementation Vibrate

+ (void) vibrateMutate
{
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
NSMutableArray* arr = [NSMutableArray array ];

[arr addObject:[NSNumber numberWithBool:YES]];
[arr addObject:[NSNumber numberWithInt:50]];

[arr addObject:[NSNumber numberWithBool:NO]];
[arr addObject:[NSNumber numberWithInt:10]];

[dict setObject:arr forKey:@"VibePattern"];
[dict setObject:[NSNumber numberWithDouble:.25] forKey:@"Intensity"];

AudioServicesPlaySystemSoundWithVibration(4095,nil,dict); //ERROR
}

+ (void) vibrateSectionChange
{
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
NSMutableArray* arr = [NSMutableArray array ];

[arr addObject:[NSNumber numberWithBool:YES]];
[arr addObject:[NSNumber numberWithInt:150]];

[arr addObject:[NSNumber numberWithBool:NO]];
[arr addObject:[NSNumber numberWithInt:10]];

[dict setObject:arr forKey:@"VibePattern"];
[dict setObject:[NSNumber numberWithDouble:.75] forKey:@"Intensity"];

AudioServicesPlaySystemSoundWithVibration(4095,nil,dict);
}

@end

raw objective-c version
A .M文件

#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioToolbox.h>

@interface Vibrate : NSObject

+ (void)vibrateMutate;
+ (void)vibrateSectionChange;

@end

最后,将这一行添加到Xcode为您创建的“YOU_PROJECT_NAME-Bridging-Header.h”文件中!

#import "Vibrate.h"

最后,你可以在你的Swift代码中调用这个方法(如果不起作用,重新启动你的

Vibrate.vibrateMutate()

你会得到一个短,现代风格的触觉在你的动态岛!

相关问题