LoginSignup
7
6

More than 5 years have passed since last update.

UIImagePickerControllerでフォトストリームの写真を選択した場合

Last updated at Posted at 2016-01-25

Xcode 7.2
Swift 2.1.1

assetURLは取れるんですが、Imageがついてきません
※訂正:「assetURLから PHAsset.fetchAssetsWithALAssetURLで取得出来ない」でした。m(_ _)m

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

    if(info[UIImagePickerControllerOriginalImage] != nil){
        //カメラ撮影、カメラロールなどから選択した場合はこちら
        //〜省略
    } else {
        // フォトストリームから選択した場合はここに入る
        //assetURLは取得可能
        let path:NSURL = info[UIImagePickerControllerReferenceURL] as! NSURL;
     // 以下の様にPHAssetとして取得しようとするとnilとなる
        let fetchResult: PHFetchResult = PHAsset.fetchAssetsWithALAssetURLs([path], options: optionsForFetch)
    }
}

色々と調べたり聞いたりしたものの、以下の方法で解決することにしました。
やっていることはassetUrlから識別IDだけ抜き出し。
Photos frameworkのPHFetchResultとしてはフォトストリームの写真が取得できるので、その全数をループで回して識別IDの一致をチェックする泥臭い方法。

func searchPHAsset(alURL:NSURL) -> PHAsset? {
    var phAsset : PHAsset?
    let str = alURL.absoluteString.characters.split("=").map(String.init)[1]

    let startIndex = 0
    let startOfString = str.startIndex.advancedBy(startIndex)
    let endOfString = str.startIndex.advancedBy(36)

    let range = Range(start:startOfString,end:endOfString)
    let localIDFragment = str.substringWithRange(range)

    let optionsForFetch = PHFetchOptions()
    optionsForFetch.includeHiddenAssets = true

    let fetchResultForPhotostream = PHAssetCollection.fetchAssetCollectionsWithType(PHAssetCollectionType.Album,subtype:PHAssetCollectionSubtype.AlbumMyPhotoStream, options: nil)
    if fetchResultForPhotostream.count > 0 {
        let photostream = fetchResultForPhotostream[0] as! PHAssetCollection
        let fetchResultForPhotostreamAssets = PHAsset.fetchAssetsInAssetCollection(photostream, options: optionsForFetch)
        if fetchResultForPhotostreamAssets.count >= 0 {
         var stop : Bool = false
         for var i = 0; i < fetchResultForPhotostreamAssets.count && !stop; i++ {
             let phAssetBeingCompared = fetcsultForPhotostreamAssets[i] as! PHAsset
                if phAssetBeingCompared.localIdentifier.rangeOfString(localIDFragment) != nil {
                    phAsset = phAssetBeingCompared
                    stop = true
                }
            }
            return phAsset
        }
    }
    return phAsset
}
7
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6