面试题答案
一键面试声音文件处理
- 准备声音文件:
确保声音文件格式为iOS支持的格式,如
.caf
、.aiff
或.wav
。推荐使用.caf
格式,因为它能更好地与iOS系统兼容。例如,可以使用音频编辑工具将其他格式的音频文件转换为.caf
格式。 - 添加声音文件到项目: 将声音文件拖入Xcode项目中,在弹出的对话框中确保勾选“Copy items if needed”,这样声音文件就会被复制到项目目录中。同时,要注意声音文件的目标成员身份,确保其添加到正确的Target中。
- 配置声音文件:
在项目的
Info.plist
文件中,添加一个名为UILocalNotificationDefaultSoundName
的键,其值设置为自定义声音文件的文件名(包含扩展名)。例如,如果声音文件名为custom_sound.caf
,则将该键的值设为custom_sound.caf
。
图标资源配置
- 准备图标资源:
根据iOS不同设备的尺寸要求,准备好相应分辨率的图标文件。通常需要提供不同尺寸的图标,如iPhone的
180x180
、iPad的167x167
等。图标文件格式一般为.png
。 - 添加图标到项目:
在Xcode项目导航栏中,找到
Assets.xcassets
,打开它。这里有一个AppIcon
的图标集,将准备好的不同尺寸的图标文件拖放到对应的位置。 - 设置推送通知图标:
对于推送通知的图标,系统默认会使用应用的主图标。如果需要自定义推送通知时显示的图标,可以在推送通知的有效负载(payload)中设置
mutable-content
为1
,并提供一个自定义的图片资源。然后在处理推送通知的代码中,根据需要加载并显示自定义图标。
推送相关代码中的设置方式
- 注册推送通知:
在
AppDelegate
的application:didFinishLaunchingWithOptions:
方法中,注册推送通知并请求授权。例如:
if (@available(iOS 10.0, *)) {
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
UNAuthorizationOptions options = UNAuthorizationOptionAlert + UNAuthorizationOptionSound + UNAuthorizationOptionBadge;
[center requestAuthorizationWithOptions:options completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] registerForRemoteNotifications];
});
}
}];
} else {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
- 处理推送通知声音:
当应用接收到推送通知时,在
AppDelegate
的application:didReceiveRemoteNotification:fetchCompletionHandler:
方法(适用于iOS 7.0及以上)或application:didReceiveRemoteNotification:
方法(适用于iOS 7.0以下)中,可以设置自定义声音。例如:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
if (@available(iOS 10.0, *)) {
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
content.title = [userInfo objectForKey:@"aps"][@"alert"][@"title"];
content.body = [userInfo objectForKey:@"aps"][@"alert"][@"body"];
content.sound = [UNNotificationSound soundNamed:@"custom_sound.caf"];
// 其他设置...
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"customNotification" content:content trigger:nil];
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
if (error) {
NSLog(@"Error adding notification request: %@", error);
}
}];
} else {
// 旧版本处理方式,设置自定义声音
NSDictionary *aps = [userInfo objectForKey:@"aps"];
if (aps[@"sound"]) {
// 自定义声音设置已在Info.plist中配置,系统会自动使用
}
}
completionHandler(UIBackgroundFetchResultNewData);
}
- 处理推送通知图标(自定义较复杂场景): 当需要自定义推送通知图标时,假设在推送通知的有效负载中有相关自定义图标信息,在处理推送通知的代码中,可类似如下处理:
// 假设有效负载中有一个自定义图标URL
NSString *customIconURLString = [userInfo objectForKey:@"custom_icon_url"];
NSURL *customIconURL = [NSURL URLWithString:customIconURLString];
NSData *iconData = [NSData dataWithContentsOfURL:customIconURL];
UIImage *customIcon = [UIImage imageWithData:iconData];
// 这里可以将customIcon用于显示自定义推送通知图标,实际实现可能依赖于特定的库或自定义界面绘制逻辑
通过以上步骤,就可以在Objective - C开发的iOS应用中为推送通知设置自定义声音和图标。