

CNGroup.identifier中は普通、  
abcdefg1-abc2-abc3-abc4-abcdefg12345  
となっているはずが、何がしらの条件が重なると、  
abcdefg1-abc2-abc3-abc4-abcdefg12345:ABGroup:  
と余計なものが付いてきます。

この「何がしらの条件」を特定しきれていませんがこれはバグでしょうか？  
ご回答よろしくお願い致します。


CC BY-SA 3.0
2016-07-18T03:38:00.873
27695
2016-07-18T07:36:22.317
9153
question
swift
CNGroup.identifierについて


試行回数が少ない＆ドキュメントには記載がないので憶測を含みますが、`:ABGroup`の suffix
はローカルに作成されたグループのときに付与されるのかと思います。

# 説明

[Contacts framework](https://developer.apple.com/reference/contacts) の
Containers and Groups の図を見ていただくと分かりやすいのですが、連絡帳から取得できる `CNContact` のデータソース（＝
**アカウント** ）は複数ありえます。

> A user may have contacts in their device’s local account and/or server
> accounts configured to sync contacts. Each account has at least one
> container of contacts. A contact can be in only one container.
>
> **私訳:**
> ユーザーはデバイスローカル、同期を設定したサーバーアカウントのいずれか、および複数の連絡帳を持つことができます。各アカウントは少なくとも一つの
> **コンテナ** を持ちます。連絡帳はひとつのコンテナの場合もあります。

ローカルデバイス、iCloud、Gmail、Facebook などなど端末に紐付けた様々なデータの集まりが連絡帳データです。

アカウントはひとつ以上の **`CNContainer`** と呼ばれる集まりを持っています。

> A group is a set of contacts within a container. Not all accounts support
> groups and some accounts support subgroups.
>
> **私訳:** **グループ**
> はコンテナ内の連絡帳のセットです。すべてのアカウントがグループをサポートしておらず、またいくつかのアカウントはサブグループをサポートしています。

**`CNGroup`** とは、この「 `CNContainer` 内部での連絡帳の集合」を表しています。

このため、

  * グループの名前（`name`）
  * グループの識別子（`identifier`）
  * 保存先のコンテナ（`CNContainer`の`identifier`）

の３つの情報を持っているのですが、ローカルデータにグループを保存する場合には、データソースもコンテナもないので、`:ABGroup`の suffix
で区別しているのだと思われます。

## ローカルへの保存

[code]

    let saveRequest = CNSaveRequest()
    let group = CNMutableGroup()
    group.name = "test group"
    saveRequest.add(group, toContainerWithIdentifier: nil)
    try! self.store.execute(saveRequest)
    
[/code]

このように、`saveRequest.add(_,toContainerWithIdentifier:)` に `nil`
を指定したケースではローカル保存となり、`:ABGroup` suffix が付与されます。

## サーバーアカウントへの保存

外部から連携されたグループ情報の読み込み時や、

[code]

    let contact = /* グループに含めたい、外部から連携されているコンタクト */
    let container = try self.store.containers(matching: CNContainer.predicateForContainerOfContact(withIdentifier: contact.identifier))
    let containerIdentifier = container.identifier
    
[/code]

ローカルデータ以外の `CNContact` から、`CNContainer` の `identifier`
を取得し、`toContainerWithIdentifier:` に渡してグループを作成した場合には、`:ABGroup` suffix
は付与されませんでした。


CC BY-SA 3.0
2016-07-18T06:58:33.717
27699
2016-07-18T07:36:22.317
2016-07-18T07:36:22.317
5337
5337
27695
answer