iPhoneシミュレーターでは非常に単純なように思えますが、コードは実際のデバイスで正常に動作し、recordDoesNotExistエラーが発生します。基本的には、CNContactPickerViewController から連絡先を選択して CNGroup に追加するだけです。
func getGroup(cb:@escaping (CNGroup?)->()){
do{
let groups = try store.groups(matching: nil).filter{$0.name == "someGroup"}
if let group = groups.first{
print("got a group")
return cb(group)
}
let g = CNMutableGroup()
g.name = "someGroup"
let sr = CNSaveRequest()
sr.add(g, toContainerWithIdentifier: nil)
try store.execute(sr)
return getGroup(cb:cb) //try again this might create a indefinate loop if try doesnt stop execution until end of do statement
}catch{
DispatchQueue.main.async {
self.present(Alerter("Error", "encountered an error fetching the group"), animated: true)
return cb(nil)
}
}
}
func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
getGroup{group in
guard group != nil else {return}
let sr = CNSaveRequest()
sr.add(contact, to:group!)
do{
try self.store.execute(sr)
}catch{
print(error)
}
}
これはシミュレーターでは正常に機能しますが、私の電話では機能しません。識別子を使用してこの連絡先をクエリできます。連絡先はストアにありますが、グループに追加しようとすると、「保存要求が失敗したため、失敗しました。存在しないか、すでに削除されているレコードを更新します。」