5

CoreSpotlight api とNSUserActivityapi の組み合わせを使用してアプリ コンテンツのインデックスを作成しています。検索結果をタップするまではすべてうまくいきます。continueUserActivity メソッドの userActivity で渡される userInfo には、1 つの項目のみが含まれますkCSSearchableItemActivityIdentifier。私の他のカスタムキーはnilです。

アイテムをインデックス化するための私のコードは次のとおりです..

class MyTestViewController:UIViewController{
     viewDidLoad(){
        searchHandler = SearchHandler()
        searchHandler.index(items)
     }
 }

 class  SearchHandler{
         var activity: NSUserActivity!

         func index(items:[Item]){
            for item in items{
         let attributeSet = getSearchItemAttribute(item)
                if let attributeSet =  attributeSet{
                    let searchableItem = CSSearchableItem(uniqueIdentifier: item.uniqueId, domainIdentifier:itemType.groupId(), attributeSet: attributeSet)
                    searchableItem.expirationDate = item.expirationDate
                    addToSpotlight([searchableItem])
                }

            activity = NSUserActivity(activityType: searchPrivacy.activity())
            activity.delegate = delegate

            //meta data
            activity.title = item.title

            var userInfoDic = [NSObject:AnyObject]()
            userInfoDic["indexItemType"] = itemType.rawValue
            userInfoDic["address"] = item.title
            activity.userInfo = userInfoDic

            if item.expirationDate != nil { activity.expirationDate = item.expirationDate! }
            if item.keywords != nil { activity.keywords = item.keywords! }
            activity.contentAttributeSet = attributeSet

            //eligibility
            activity.eligibleForHandoff = false
            activity.eligibleForSearch = true
            activity.eligibleForPublicIndexing = true
            activity.requiredUserInfoKeys = Set(["indexItemType","address"])

            activity.becomeCurrent()
            }
 }

 private  func getSearchItemAttribute(item:Item) ->CSSearchableItemAttributeSet?{
    if item.contentType != nil { // add an entry to core spot light
        let attributeSet = CSSearchableItemAttributeSet(itemContentType: item.contentType!)
        attributeSet.relatedUniqueIdentifier = item.uniqueId
        HALog.i("item.uniqueId= \(item.uniqueId)")
        attributeSet.title = item.title
        attributeSet.thumbnailData = item.thumbnailData
        attributeSet.thumbnailURL = item.thumbnailUrl
        attributeSet.rating = item.ratings
        attributeSet.ratingDescription = item.ratingDescription
        attributeSet.contentDescription = item.contentDescription
        return attributeSet
    }
    return nil
}

private  func addToSpotlight(searchableItems:[CSSearchableItem]) {

    CSSearchableIndex.defaultSearchableIndex().indexSearchableItems(searchableItems) { (error) -> Void in
        if let error = error {
            HALog.e("Deindexing error: \(error.localizedDescription)")
        } else {
            HALog.i("Search item successfully indexed!")
        }
    }

   }
}

userInfo の indexItemType またはアドレス キーにアクセスしようとすると、常に nil になります。

私はこれらのスレッドからすべての解決策を試しました:

  1. iOS 9 - null を示す NSUserActivity userinfo プロパティ

  2. http://helpprogramming.xyz/question/31328032/ios-9-nsuseractivity-userinfo-property-showing-null

上記のどれも私の問題を解決しませんでした。現在、iOS 9 で Xcode 7 を使用しています。

4

2 に答える 2

2

CSSearchableIndex を使用すると、userInfo で kCSSearchableItemActivityIdentifier のみを受け取ります。userInfo でカスタム プロパティを設定および取得するには、userActivity を becomeCurrent に設定する必要があります。

CSSearchableIndex の呼び出しをスタブ化し、それが機能するかどうかを確認します (userInfo を保存する前に割り当てが解除される可能性があるため、nsuseractivity オブジェクトがビュー/モデルの強力なプロパティであることも確認する必要があります)。

以下のスレッドの情報が役に立ちました。

https://forums.developer.apple.com/thread/9690

于 2015-10-20T07:41:29.027 に答える