Created
March 1, 2025 10:14
-
-
Save xuzh0u/60efa19cbb071ccffb890c369d000369 to your computer and use it in GitHub Desktop.
在 Mac 上,根据通讯录联系人中文名批量添加注音信息 [由ChatGPT-4o生成]
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 使用方法:保存为文件,在命令行键入 `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