Platforms to show: All Mac Windows Linux Cross-Platform

/Mac64bit/Contacts/Contacts Display Person


Required plugins for this example: MBS Mac64bit Plugin, MBS MacBase Plugin, MBS MacCloud Plugin, MBS Main Plugin

You find this example project in your Plugins Download as a Xojo project file within the examples folder: /Mac64bit/Contacts/Contacts Display Person

This example is the version from Fri, 13th May 2021.

Project "Contacts Display Person.xojo_binary_project"
Class App Inherits Application
Const kEditClear = "&Delete"
Const kFileQuit = "&Quit"
Const kFileQuitShortcut = ""
EventHandler Sub Open() #if Target64Bit and TargetMacOS then if CNContactStoreMBS.available then // ok else MsgBox "please run on OS X 10.11 or newer." quit end if #else MsgBox "Please run with Xojo as 64-bit app on Mac." quit #endif End EventHandler
End Class
Class MainWindow Inherits Window
Control List Inherits Listbox
ControlInstance List Inherits Listbox
EventHandler Sub ExpandRow(row As Integer) dim c as CNContactMBS = me.RowTag(row) if c = nil then break return end if // you could use properties directly dim familyName as string = C.familyName // but we simply try generically all keys showValue c, c.CNContactNamePrefixKey showValue c, c.CNContactGivenNameKey showValue c, c.CNContactMiddleNameKey showValue c, c.CNContactFamilyNameKey showValue c, c.CNContactPreviousFamilyNameKey showValue c, c.CNContactNameSuffixKey showValue c, c.CNContactNicknameKey showValue c, c.CNContactPhoneticGivenNameKey showValue c, c.CNContactPhoneticMiddleNameKey showValue c, c.CNContactPhoneticFamilyNameKey showValue c, c.CNContactOrganizationNameKey showValue c, c.CNContactDepartmentNameKey showValue c, c.CNContactJobTitleKey showValue c, c.CNContactBirthdayKey showValue c, c.CNContactNonGregorianBirthdayKey showValue c, c.CNContactNoteKey showValue c, c.CNContactImageDataKey showValue c, c.CNContactThumbnailImageDataKey showValue c, c.CNContactImageDataAvailableKey showValue c, c.CNContactPhoneNumbersKey showValue c, c.CNContactEmailAddressesKey showValue c, c.CNContactPostalAddressesKey showValue c, c.CNContactDatesKey showValue c, c.CNContactUrlAddressesKey showValue c, c.CNContactRelationsKey showValue c, c.CNContactSocialProfilesKey showValue c, c.CNContactInstantMessageAddressesKey showValue c, c.CNContactIdentifierKey showValue c, c.CNContactTypeKey End EventHandler
End Control
Control Label1 Inherits Label
ControlInstance Label1 Inherits Label
End Control
Control namefield Inherits TextField
ControlInstance namefield Inherits TextField
End Control
Control SearchButton Inherits PushButton
ControlInstance SearchButton Inherits PushButton
EventHandler Sub Action() List.DeleteAllRows dim contacts() as CNContactMBS dim predicate as NSPredicateMBS dim keysToFetch() as CNKeyDescriptorMBS dim error as NSErrorMBS // we simply ask for all keys which the vcard would also use keysToFetch.append CNContactVCardSerializationMBS.descriptorForRequiredKeys 'keysToFetch.Append CNContactMBS.CNContactOrganizationNameKey dim parts() as string = split(namefield.Text, " ") for each part as string in parts part = trim(part) if part.len > 0 then Dim p As NSPredicateMBS = CNContactMBS.predicateForContactsMatchingName(part) If p = Nil Then // failed? Elseif predicate = Nil Then // first one predicate = p else // combine with AND predicate = NSCompoundPredicateMBS.andPredicateWithSubpredicates(array(predicate, p)) end if end if next if true then // 1. unifiedContactsMatchingPredicate contacts = m.unifiedContactsMatchingPredicate(predicate, keysToFetch, error) else // 2. ContactsWithFetchRequest dim fr as new CNContactFetchRequestMBS(keysToFetch) fr.predicate = predicate fr.mutableObjects = false fr.unifyResults = true contacts = m.ContactsWithFetchRequest(fr, error) end if List.AddRow str(contacts.Ubound+1)+" contacts found" if error <> nil then List.AddRow "Error: "+error.LocalizedDescription end if dim formatter as new CNContactFormatterMBS for each contact as CNContactMBS in contacts List.AddFolder formatter.stringFromContact(contact) List.RowTag(List.LastIndex) = contact next // exapand first one if list.listcount > 1 then List.Expanded(1) = true end if End EventHandler
End Control
EventHandler Sub Open() m = new MyContactStore ShowAuthorization m.requestAccessForEntityType m.CNEntityTypeContacts End EventHandler
Function Address(p as CNPostalAddressMBS) As string // create a list of text values with comma inbetween Dim texts() As String Dim Street As String = p.Street If Street.Len > 0 Then texts.Append street end if Dim PostalCode As String = p.PostalCode Dim City As String = p.City Dim PostalCodeCity() As String If PostalCode.Len > 0 Then // have a zip? PostalCodeCity.Append PostalCode End If If City.Len > 0 Then PostalCodeCity.Append City End If // join zip and city if we have at least one of them If PostalCodeCity.Ubound >= 0 Then texts.Append Join(PostalCodeCity, " ") End If Dim Country As String = p.Country If Country.Len > 0 Then texts.Append Country End If Return Join(texts, ", ") End Function
Sub Log(s as string) list.AddRow s list.ScrollPosition = list.ListCount End Sub
Sub ShowAuthorization() dim x as integer = m.authorizationStatusForEntityType(m.CNEntityTypeContacts) Select case x case m.CNAuthorizationStatusAuthorized log "Authorization status: Authorized" SearchButton.Enabled = true case m.CNAuthorizationStatusDenied log "Authorization status: Denied" case m.CNAuthorizationStatusNotDetermined log "Authorization status: Not Determined" case m.CNAuthorizationStatusRestricted log "Authorization status: Restricted" SearchButton.Enabled = true else log "Authorization status: "+str(x) break end Select End Sub
Sub showValue(c as CNContactMBS, Key as string) If key.Len = 0 Then Return if c.isKeyAvailable(key) then dim v as Variant = c.valueForKey(key) dim l as string = c.localizedStringForKey(key) if l = "" then l = key end if dim type as integer = v.Type Select case Type case Variant.TypeNil // nothing to report #if RBVersion < 2013 then case Variant.TypeInteger, Variant.TypeLong #else case Variant.TypeInt32, Variant.TypeInt64 #endif // just some number List.AddRow l + ": " + v.StringValue case Variant.TypeString // just some text dim t as string = v.StringValue if t <> "" then List.AddRow l + ": " + t end if case Variant.TypeObject If v IsA NSDateComponentsMBS Then Dim n As NSDateComponentsMBS = v List.AddRow l + ": " + n.description Elseif v IsA MemoryBlock then // ignore image data Else // something not handled? Break End If case Variant.TypeObject + Variant.TypeArray dim items() as string dim values() as Object = v if values.Ubound < 0 then Return // empty for each obj as Variant in values If obj IsA CNPhoneNumberMBS Then Dim p As CNPhoneNumberMBS = obj items.Append p.stringValue Elseif obj IsA CNPostalAddressMBS Then Dim p As CNPostalAddressMBS = obj items.Append address(p) Elseif obj IsA CNLabeledValueMBS Then Dim lv As CNLabeledValueMBS = obj Dim va As Variant = lv.Value Dim sa As String If va IsA CNPostalAddressMBS Then Dim po As CNPostalAddressMBS = va sa = address(po) Elseif va IsA CNPhoneNumberMBS Then Dim pn As CNPhoneNumberMBS = va sa = pn.stringValue Elseif va IsA CNInstantMessageAddressMBS Then Dim im As CNInstantMessageAddressMBS = va sa = im.service+": "+im.username Elseif va IsA CNSocialProfileMBS Then Dim sp As CNSocialProfileMBS = va sa = sp.service+": "+sp.username Elseif va IsA CNContactRelationMBS Then Dim cr As CNContactRelationMBS = va sa = cr.Name Elseif va IsA NSDateComponentsMBS Then Dim n As NSDateComponentsMBS = va sa = n.description Else sa = va.StringValue end if items.Append lv.localizedStringForLabel(lv.Label)+": "+sa else // something not handled? Break end if next List.AddRow l + ": " + Join(items, ", ") else // something not handled? Break end Select end if End Sub
Property m As MyContactStore
End Class
MenuBar MainMenuBar
MenuItem FileMenu = "&File"
MenuItem FileQuit = "#App.kFileQuit"
MenuItem EditMenu = "&Edit"
MenuItem EditUndo = "&Undo"
MenuItem EditSeparator1 = "-"
MenuItem EditCut = "Cu&t"
MenuItem EditCopy = "&Copy"
MenuItem EditPaste = "&Paste"
MenuItem EditClear = "#App.kEditClear"
MenuItem EditSeparator2 = "-"
MenuItem EditSelectAll = "Select &All"
End MenuBar
Class MyContactStore Inherits CNContactStoreMBS
EventHandler Sub DidChange() mainWindow.log "Contacts Changed" End EventHandler
EventHandler Sub requestAccessForEntityType(granted as boolean, error as NSErrorMBS, tag as Variant) MainWindow.log "requestAccessForEntityType completed" if granted then MainWindow.log "permissions granted" else MainWindow.log "Permissions denied" end if MainWindow.ShowAuthorization End EventHandler
End Class
ExternalFile info
End ExternalFile
End Project

See also:

The items on this page are in the following plugins: MBS Mac64bit Plugin.


The biggest plugin in space...