2011-01-13 5 views

Antwort

9

iOS 4+ bietet eine neue API, mit der man eine bestimmte ABS-Quelle aus dem ABAddressBook auswählen kann. Dies kann als einige Operationen nützlich sein, z. Erstellen einer ABGroup, werden in einigen Quellen (z. B. Exchange) nicht unterstützt.

"Nicht alle Quellentypen unterstützen Gruppen, auffallender ist, dass Exchange nichts über Gruppen weiß." - http://flavors.me/volonbolon#1a5/tumblr

Beigefügt sind Funktionen, die die neue API nutzen, um Quellen bestimmter Typen zu erhalten, die bei Aufrufen von ABGroupCreateInSource() verwendet werden können.

#define CFRELEASE_AND_NIL(x) CFRelease(x); x=nil; 
ABRecordRef sourceWithType (ABSourceType mySourceType) 
{ 
    ABAddressBookRef addressBook = ABAddressBookCreate(); 
    CFArrayRef sources = ABAddressBookCopyArrayOfAllSources(addressBook); 
    CFIndex sourceCount = CFArrayGetCount(sources); 
    ABRecordRef resultSource = NULL; 
    for (CFIndex i = 0 ; i < sourceCount; i++) { 
     ABRecordRef currentSource = CFArrayGetValueAtIndex(sources, i); 
     CFTypeRef sourceType = ABRecordCopyValue(currentSource, kABSourceTypeProperty); 

     BOOL isMatch = mySourceType == [(NSNumber *)sourceType intValue]; 
     CFRELEASE_AND_NIL(sourceType); 

     if (isMatch) { 
      resultSource = currentSource; 
      break; 
     } 
    } 

    CFRELEASE_AND_NIL(addressBook);  
    CFRELEASE_AND_NIL(sources); 

    return resultSource; 
} 

ABRecordRef localSource() 
{ 
    return sourceWithType(kABSourceTypeLocal); 
} 

ABRecordRef exchangeSource() 
{ 
    return sourceWithType(kABSourceTypeExchange); 
} 

ABRecordRef mobileMeSource() 
{ 
    return sourceWithType(kABSourceTypeMobileMe); 
} 
+4

Leser, beachten Sie, dass nicht alle Geräte eine lokale Quelle haben (siehe Kommentare unten). Daher müssen Sie in der Lage sein, Fälle zu bearbeiten, in denen die angeforderte Quelle nicht vorhanden ist. Es scheint auch nicht möglich zu sein, eine lokale Quelle programmgesteuert zu erstellen. – xyzzycoder

+0

Was ist mit der Freigabe der kopierten Werte? Ist das aus irgendeinem Grund unnötig, sehe ich nicht? –

+0

Martin - Guter Fang. Die Lecks sollten jetzt behoben werden. – xyzzycoder

1

Xyzzycoder-

Ihre Lösung funktioniert gut, wenn es bereits eine localSource ist, liefert aber nur NULL, wenn es nicht ein.

Gibt es eine Möglichkeit zu sagen, eine ABRecordRef für eine lokale Quelle zu erstellen? Ich muss meinen Kontakt zu einer nicht synchronisierenden Quelle speichern können.

Prost

+0

Peter, unter welchen Umständen würde es keine lokale Quelle geben? – xyzzycoder

+0

Hallo. Beispielsweise gibt es kein lokales Adressbuch (normalerweise "alle auf meinem iPhone", "alle auf meinem PC" oder "alle auf meinem Mac" auf der Seite "Gruppen" in der Kontakte-App), wenn Sie alle Ihre Kontakte mit Google über Exchange synchronisieren Mit der von Ihnen vorgeschlagenen Methode können Sie auch nicht darauf zugreifen. Von meinen Tests kann man nur ein lokales Adressbuch behandeln, wenn der Benutzer auch einige Kontakte auf seinem Gerät gespeichert hat, die nicht mit Exchange synchronisiert werden (wenn er sie beispielsweise vor der Einrichtung von Exchange eingegeben hat und nicht zusammengeführt hat). . Prost –

+0

Peter, das ist interessant. Ich vermute, dass ich (scheinbar zu Unrecht) davon ausgegangen war, dass auf dem Gerät immer ein lokales Adressbuch existiert. Es scheint auch nicht so, als gäbe es eine Möglichkeit, die lokale Quelle programmatisch zu erstellen, wenn sie nicht schon existiert? – xyzzycoder

2

möchte wirklich wissen, wie meine eigene source.Just wie die Gruppe von Exchange, mit dem Sie erstellen erstellen müssen nicht die Standardquelle Datensatz bearbeiten, sondern eigene erstellen, und was tollsten ist, die Adressbuchs wird verknüpfte sie automatisch miteinander.

+0

Jackie, sagst du, dass du weißt, wie man eine lokale Quelle erstellt? – xyzzycoder

+1

Ich wünschte. Wirklich fand ich eine private API, die meine eigene Quelle schaffen kann, die ABSourceCreate(); ist.Es stürzt nicht ab und gibt ABRecordRef zurück, das als "ABStore" -Typ in Log gedruckt wird. Ich glaube, dass das der ABSource-Typ ist, den ich will. So setze ich die kABSourceNameProperty, kABSourceTypeProperty und benutze ABAddressAddRecord(), um es addressBook hinzuzufügen. Aber es ist still endlich gescheitert, als hätte ich etwas im Prozess verpasst. Vielleicht wird Apple im nächsten Update ein paar Details veröffentlichen, wer weiß:) –

+1

Das Adressbuch fühlt sich immer noch wie schwarze Magie an. – xyzzycoder

1

Der Code hat Fehler, deshalb gibt es immer zwei zurück, da die Methode: ABRecordGetRecordType kein Teil der ABSource ist. Es enthält nur:

kABPersonType für Person Datensätze kABGroupType für Gruppendatensätze. kABSourceType für Quellendatensätze.

Um den richtigen Typ herauszufinden, müssen Sie stattdessen ABRecordCopyValue (source, kABSourceTypeProperty) verwenden! :) Funktioniert hervorragend auf meinem iPhone mit oder ohne localSource.

Viel Glück!

+0

funktioniert nicht ohne eine vorhandene localSource – hinderberg

+0

@hinderberg - können Sie den Code patch, um zu integrieren, was Sie vorschlagen? Oder sagst du, dass der Ansatz einfach nicht funktioniert, wenn die lokale Quelle noch nicht existiert? – xyzzycoder

+0

Ich sage, dass dieser Ansatz nicht funktioniert, wenn die lokale Quelle noch nicht existiert. Derzeit warten auf eine Antwort von Apple zu diesem Thema! – hinderberg