Skip to content

Instantly share code, notes, and snippets.

@xuzh0u
Created March 1, 2025 10:14
Show Gist options
  • Save xuzh0u/60efa19cbb071ccffb890c369d000369 to your computer and use it in GitHub Desktop.
Save xuzh0u/60efa19cbb071ccffb890c369d000369 to your computer and use it in GitHub Desktop.
在 Mac 上,根据通讯录联系人中文名批量添加注音信息 [由ChatGPT-4o生成]
// 使用方法:保存为文件,在命令行键入 `swift <file.swift>` 回车运行
import Foundation
import Contacts
extension String {
func phonetic() -> String {
let src = NSMutableString(string: self) as CFMutableString
CFStringTransform(src, nil, kCFStringTransformMandarinLatin, false)
return String(src)
}
func containsNonEnglishCharacter() -> Bool {
return self.range(of: "[^A-Za-z]", options: .regularExpression) != nil
}
/// 判断字符串是否包含东亚字符(中日韩越)
var containsEastAsianCharacters: Bool {
for scalar in self.unicodeScalars {
switch scalar.value {
case 0x4E00...0x9FFF, // 汉字(中日韩越)
0x3040...0x309F, // 平假名(日本)
0x30A0...0x30FF, // 片假名(日本)
0xAC00...0xD7AF: // 韩文(朝鲜/韩国)
return true
default:
continue
}
}
return false
}
}
// 获取通讯录
let store = CNContactStore()
store.requestAccess(for: .contacts) { granted, error in
guard granted else {
print("未获得通讯录权限")
return
}
let keysToFetch = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneticGivenNameKey, CNContactPhoneticFamilyNameKey] as [CNKeyDescriptor]
let request = CNContactFetchRequest(keysToFetch: keysToFetch)
do {
try store.enumerateContacts(with: request) { contact, stop in
// 仅处理含有非英文字母的姓名
if contact.givenName.containsNonEnglishCharacter() || contact.familyName.containsNonEnglishCharacter() {
let mutableContact = contact.mutableCopy() as! CNMutableContact
mutableContact.phoneticGivenName = contact.givenName.phonetic()
mutableContact.phoneticFamilyName = contact.familyName.phonetic()
let saveRequest = CNSaveRequest()
saveRequest.update(mutableContact)
do {
try store.execute(saveRequest)
// 假设 contact 是你的联系人对象
if contact.givenName.containsEastAsianCharacters || contact.familyName.containsEastAsianCharacters {
// 东亚姓名格式(姓在前)
print("更新 \(contact.familyName) \(contact.givenName) 的拼音")
} else {
// 西方姓名格式(名在前)
print("更新 \(contact.givenName) \(contact.familyName) 的拼音")
}
} catch {
print("保存联系人失败: \(error)")
}
} else {
print("跳过 \(contact.givenName) \(contact.familyName),因为是英文名")
}
}
} catch {
print("读取联系人失败: \(error)")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment