2017-12-13 5 views
0

スポットライトの人物インデックスに基づいて私のデバイスが私に電話をかけるかどうかを予測したい。私はスポットライトのインデックスに人の情報をアップロードしています。システムは検索しているときに情報を提供しますが、誰かが呼び出しているときは表示しません。以下のコードはすべてこのようなことを行い、何が間違っているのか理解できません。CoreSpotlightを呼び出す方法を予測する方法

if people.count > 0 { 
    var peopleArray = [CSSearchableItem]() 
    var peopleGUIDs = [String]() 
    for person in people { 
     let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeText as String) 

     // Basic AttributeSet setup 
     attributeSet.title = person.nameForList 
     attributeSet.contentDescription = person.division?.title 

     // Add first phone number to AttributeSet 
     var phoneNumber: NSString? 
     let contacts = Array(person.contacts) 
     for contact in contacts { 
      if contact.type == "phone" { 
       phoneNumber = contact.value as NSString 
       break 
      } 
     } 
     if phoneNumber != nil { 
      if let preparedNumber = phoneNumber!.removingPercentEncoding { 
       attributeSet.phoneNumbers = [preparedNumber] 
       attributeSet.supportsPhoneCall = true 
      } 
     } 

     attributeSet.displayName = person.name 

     // Add photo number to AttributeSet 
     if let photoPath = person.photo { 
      let key = SDWebImageManager.shared().cacheKey(for: NSURL(string: photoPath) as URL!) 
      let image = SDImageCache.shared().imageFromDiskCache(forKey: key) 
      var data = Data() 
      if let image = image { 
       if let dataFromImage = UIImagePNGRepresentation(image) { 
        data = dataFromImage 
       } 
      } else { 
       data = dataFromImage 
      } 
      attributeSet.thumbnailData = data 
     } 

     peoplesGUIDs.append(person.id) 

     let item = CSSearchableItem(uniqueIdentifier: person.id, domainIdentifier: "com.it.companySpotlight", attributeSet: attributeSet) 
     peopleArray.append(item) 
    } 

    CSSearchableIndex.default().indexSearchableItems(peopleArray) { (error) in 
     DispatchQueue.main.async(execute: { 
      if let error = error { 
       print("Indexing error: \(error.localizedDescription)") 
      } else { 
       print("Search for people successfully indexed") 
      } 
     }) 
    } 

} 

誰でもこの問題の解決方法を知っていますか?

+2

CoreSpotlightはこれを行いません。発信者番号を登録するには、コールキット内線番号を作成する必要があります。 – Paulw11

答えて

0

短い時間の後、Paulw11は、私は、ユーザーCallKit拡張に必要なことを言ったので、解決策があります:

  1. プロジェクト「CallKIt拡張子」
  2. に新しいターゲットを追加したテキストを提供するために、アプリのグループを作成します。それはあなたの連絡先は、パフォーマンス向上のために数値昇順になっていることを確認してください
  3. がデータベースを使用することはできませんので、お使いの内線に電話番号を持つファイル
  4. 01をファイルに書き込むの連絡先その後
    if #available(iOS 10.0, *) { 
        let numbers = ["79175870629"] 
    
        let labels = ["Stranger name"] 
    
        // Replace it with your id 
        let groupId = "group.YOUR.ID" 
        let container = FileManager.default 
         .containerURL(forSecurityApplicationGroupIdentifier: groupId) 
        guard let fileUrl = FileManager.default 
         .containerURL(forSecurityApplicationGroupIdentifier: groupId)? 
         .appendingPathComponent("contacts") else { return } 
    
        var string = "" 
        for (number, label) in zip(numbers, labels) { 
         string += "\(number),\(label)\n" 
        } 
    
        try? string.write(to: fileUrl, atomically: true, encoding: .utf8) 
    
        CXCallDirectoryManager.sharedInstance.reloadExtension(
         withIdentifier: groupId) 
    } else { 
        // Fallback on earlier versions 
    } 
    
  5. この方法は、あなたが私の場合はreloadExtension

    override func beginRequest(with context: CXCallDirectoryExtensionContext) { 
    context.delegate = self 
    if #available(iOSApplicationExtension 11.0, *) { 
        if context.isIncremental { 
         addOrRemoveIncrementalBlockingPhoneNumbers(to: context) 
         addOrRemoveIncrementalIdentificationPhoneNumbers(to: context) 
        } else { 
         addAllBlockingPhoneNumbers(to: context) 
         addAllIdentificationPhoneNumbers(to: context) 
        } 
    } else { 
        addAllBlockingPhoneNumbers(to: context) 
        addAllIdentificationPhoneNumbers(to: context) 
    } 
    
    
    context.completeRequest() 
    

    }

  6. を呼び出すときに、私は唯一のaddAllIdentificationPhoneNumbersを実施し、読みと呼ばれる拡張機能にあなたにfrom this post

  7. をクラスLineReaderを追加ファイルから連絡先があります。 >電話 - - >コールブロッキング&識別 - >あなたのアプリとは反対迅速オンに

  8. テストアプリのデフォルト設定へ

    guard let fileUrl = FileManager.default 
          .containerURL(forSecurityApplicationGroupIdentifier: "group.YOUR.ID")? 
          .appendingPathComponent("contacts") else { return } 
    
         guard let reader = CBLineReader(path: fileUrl.path) else { return } 
         print("\(#function) \(fileUrl)") 
         for line in reader { 
          autoreleasepool { 
           let line = line.trimmingCharacters(in: .whitespacesAndNewlines) 
    
           var components = line.components(separatedBy: ",") 
    
           guard let phone = Int64(components[0]) else { return } 
           let name = components[1] 
    
           context.addIdentificationEntry(withNextSequentialPhoneNumber: phone, label: name) 
           print(#function + name) 
          } 
         } 
    
  9. ゴーによって生成された他のすべてのメソッドにロジックを追加する必要があります:-)それは誰かに役立つことを願っています

関連する問題