2016-10-18 11 views
0

ANCS外部デバイスで動作するアプリケーションで作業しています。物事を短くするために、デバイスはSMSがいつ来るのかを検出し、それをアプリに伝えます。その後、アプリケーションはWebサービス(Twilio)を介してSMS送信者にメッセージを送り返すことができます。CNContactStore NSPredicateが1つの文字列内に2つの連絡先名を指定しました

SMSを送信した人が連絡先にいる場合、ANCSデバイスは電話番号自体ではなく、この連絡先の名前だけを表示します。したがって、この読み込み可能な名前だけがAppに提供されます。 のみ1名が接触のために存在する場合(例:「ジョン」):のために保存

let title = "John" 
let contactStore = CNContactStore() 
let predicate = CNContact.predicateForContacts(matchingName: title) 
let keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactMiddleNameKey, CNContactNicknameKey, CNContactOrganizationNameKey, CNContactPhoneNumbersKey] 
var contacts = [CNContact]() 
do { 
    contacts = try contactStore.unifiedContacts(matching: predicate, keysToFetch: keys as [CNKeyDescriptor]) 
    if contacts.count == 0 { 
     print("No contacts were found matching the given name.") 
    } 
    else 
    { 
     print("found \(contacts.count) matches !") 
     // from there find the best possible bet and the numbers for this contact 
    } 
} catch { 
    print("Unable to fetch contacts.") 
} 

しかし、時には人々が持っているいくつかの連絡先、連絡先とその電話番号を検索すると、非常に簡単そうに似ています同じ名前の人がいます。例えば、SMSが来たときに、「John or Dad」から来ていると言うことができます。それはアドレス帳の2人の連絡先に対応しているからです。アドレス帳に重複しています)。そして、最悪の場合には、3つ以上の名前があることがあります!

ここで私がやりたいことがあります。どのようにしてこれらの連絡先を確認するための述語を区別/作成できますか?簡単な解決策は、 "or"という単語の名前を分割することですが、これがコリアン語、ドイツ語、スウェーデン語などの場合はどうなりますか?そして、もしこの言葉が名前がひとつの連絡先に属していたら、「John desk on the roof」と言いましょうか?最悪の場合、iOSはローカライズされた区切り文字 "or"を提供しますか?

誰もこのような問題に直面しましたか?

答えて

0

私は最終的に、このように行うために管理:

  • 第一、私は言語ごとにファイルTelephonyUtilities.lgで見つかった単語を使用して、アップルat this addressによって与えられたすべてのtransleted または単語のリストを得ました

  • 第二に、私は私が持っている

  • 第三に、各優先言語キー(EN、ES、など)のためにすべてのそれらの単語を含むplistファイルを作成連絡先の名前、私は電話の優先言語をgivent、正しい単語の文字列をつかむと、私はそれを分割しようと... 1つ以上の分割結果が見つかった場合、これは、おそらく2つの連絡先の名前は、これらの連絡先を取得して共通の電話番号を検索します。これまでのところうまくいきます。

(SWIFT 3)を説明するためのいくつかのサンプルコード:plistファイルは、(それが役立つかもしれない誰のための完全な1、)どのようなものか

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
<key>en</key> 
<string> or </string> 
<key>fr</key> 
<string> ou </string> 
<key>vi</key> 
<string> hoặc </string> 
<key>hr</key> 
<string> ili </string> 
<key>hu</key> 
<string> vagy </string> 
<key>id</key> 
<string> atau </string> 
<key>it</key> 
<string> o </string> 
<key>es</key> 
<string> o </string> 
<key>ar</key> 
<string> أو </string> 
<key>zh-CN</key> 
<string>还是</string> 
<key>zh-TW</key> 
<string> 或 </string> 
<key>sk</key> 
<string> alebo </string> 
<key>pt</key> 
<string> ou </string> 
<key>pl</key> 
<string> lub </string> 
<key>cs</key> 
<string> nebo </string> 
<key>ca</key> 
<string> o </string> 
<key>nl</key> 
<string> of </string> 
<key>fi</key> 
<string> tai </string> 
<key>da</key> 
<string> eller </string> 
<key>de</key> 
<string> oder </string> 
<key>el</key> 
<string> ή </string> 
<key>he</key> 
<string> או </string> 
<key>ja</key> 
<string>または</string> 
<key>ko</key> 
<string> 또는 </string> 
<key>ms</key> 
<string> atau </string> 
<key>no</key> 
<string> eller </string> 
<key>th</key> 
<string> หรือ </string> 
<key>uk</key> 
<string> чи </string> 
<key>tr</key> 
<string> veya </string> 
<key>ro</key> 
<string> sau </string> 
<key>ru</key> 
<string> или </string> 
<key>sv</key> 
<string> eller </string> 
</dict> 
</plist> 

をゲットまたは単語列:

private func getOrWord() -> String 
{ 
    var orWord:String = "" 

    var languageCode:String = "" 
    if (NSLocale.current.languageCode != nil) { languageCode = NSLocale.current.languageCode! } 
    var countryCode:String = "" 
    if (NSLocale.current.regionCode != nil) { countryCode = NSLocale.current.regionCode! } 
    let bothCodes:String = "\(languageCode)-\(countryCode)" 

    var propertyListForamt = PropertyListSerialization.PropertyListFormat.xml //Format of the Property List. 
    var plistData: [String: AnyObject] = [:] 
    let plistPath: String? = Bundle.main.path(forResource: "separator", ofType: "plist")! //the path of the data 
    let plistXML = FileManager.default.contents(atPath: plistPath!)! 
    do { 
     plistData = try PropertyListSerialization.propertyList(from: plistXML, options: .mutableContainersAndLeaves, format: &propertyListForamt) as! [String:AnyObject] 

     if (languageCode != "") 
     { 
      if (plistData[languageCode] != nil) 
      { 
       orWord = plistData[languageCode] as! String 
      } 
      else if (plistData[bothCodes] != nil) 
      { 
       orWord = plistData[bothCodes] as! String 
      } 
     } 

    } catch { 
     print("Error reading plist: \(error), format: \(propertyListForamt)") 
    } 

    return orWord 
} 

そして最後に取得可能な連絡先に:

private func searchForContacts(name:String) -> Array<CNContact> 
{ 
    var namesToSearch:Array<String> = [] 
    var contactsFound:Array<CNContact> = [] 

    let orWord:String = getOrWord() 

    if (orWord == "") 
    { 
     namesToSearch.append(name) 
    } 
    else 
    { 
     namesToSearch = name.components(separatedBy: orWord) 
    } 

    if (namesToSearch.count > 0) 
    { 
     let contactStore = CNContactStore() 

     for nameSearch in namesToSearch 
     { 
      let predicateName = CNContact.predicateForContacts(matchingName: nameSearch) 

      let keys = [CNContactPhoneNumbersKey] 
      var contacts = [CNContact]() 
      do { 
       contacts = try contactStore.unifiedContacts(matching: predicateName, keysToFetch: keys as [CNKeyDescriptor]) 
       if (contacts.count > 0) 
       { 
        // keep only the ones that have at least 1 phone number 
        for contact in contacts 
        { 
         if (contact.phoneNumbers.count > 0) 
         { 
          contactsFound.append(contact) 
         } 
        } 

       } 
      } catch { 
       // not possible to fetch 
      } 
     } 
    } 

    return contactsFound 
} 
+0

ちょっと、私はちょっと同じ問題がありますが、自分のカスタム連絡先UIを構築しようとしています。セクションごとに連絡先の配列を取得したいつまり、セクションA、B、Cなどのすべての連絡先を取得します。私はそれらをテーブルビューに表示しようとしていますが、私はASCIIとASCII以外の文字と異なる言語をすべて考慮する必要があるという事実のために複雑です!したがって、リスト全体ではなくセクションで簡単に取得する方が簡単ですが –

関連する問題