├── .gitignore ├── .swiftlint.yml ├── .travis.yml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── Package.swift ├── Podfile ├── Podfile.lock ├── README.md ├── RxPhotos.podspec ├── RxPhotos.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── xcshareddata │ └── xcschemes │ └── RxPhotos.xcscheme ├── RxPhotos.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── Source ├── Extensions │ ├── PHAsset+Rx.swift │ ├── PHAssetResourceManager+Rx.swift │ ├── PHImageManager+Rx.swift │ ├── PHLivePhoto+Rx.swift │ ├── PHLivePhotoEditingContext+Rx.swift │ └── PHPhotoLibrary+Rx.swift ├── Info.plist ├── Results │ ├── AssetExportSessionRequestResult.swift │ ├── AssetRequestResult.swift │ ├── ContentEditRequestResult.swift │ ├── ImageDataRequestResult.swift │ ├── ImageRequestResult.swift │ ├── LivePhotoRequestResult.swift │ └── PlayerItemRequestResult.swift ├── RxPHPhotoLibraryObserver.swift ├── RxPhotoError.swift └── RxPhotos.h ├── Tests ├── CheckCocoaPodsQualityIndexes.rb ├── Info.plist └── RxPhotosTests.swift └── iOS Example ├── Podfile ├── Podfile.lock ├── Source ├── AppDelegate.swift ├── Assets.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── Info.plist └── ViewController.swift ├── iOS Example.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── xcshareddata │ └── xcschemes │ └── iOS Example.xcscheme └── iOS Example.xcworkspace ├── contents.xcworkspacedata └── xcshareddata └── IDEWorkspaceChecks.plist /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xccheckout 23 | *.xcscmblueprint 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | *.ipa 28 | *.dSYM.zip 29 | *.dSYM 30 | 31 | ## Playgrounds 32 | timeline.xctimeline 33 | playground.xcworkspace 34 | 35 | # Swift Package Manager 36 | # 37 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 38 | # Packages/ 39 | # Package.pins 40 | # Package.resolved 41 | .build/ 42 | 43 | # CocoaPods 44 | # 45 | # We recommend against adding the Pods directory to your .gitignore. However 46 | # you should judge for yourself, the pros and cons are mentioned at: 47 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 48 | # 49 | Pods/ 50 | 51 | # Carthage 52 | # 53 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 54 | # Carthage/Checkouts 55 | 56 | Carthage/Build 57 | 58 | # fastlane 59 | # 60 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 61 | # screenshots whenever they are needed. 62 | # For more information about the recommended setup visit: 63 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 64 | 65 | fastlane/report.xml 66 | fastlane/Preview.html 67 | fastlane/screenshots 68 | fastlane/test_output -------------------------------------------------------------------------------- /.swiftlint.yml: -------------------------------------------------------------------------------- 1 | excluded: 2 | - Pods 3 | - iOS Example -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: ruby 2 | rvm: 3 | - 2.2 4 | 5 | script: 6 | - yes | ./configure -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | All notable changes to this project will be documented in this file. 3 | `RxPhotos` adheres to [Semantic Versioning](http://semver.org/). 4 | 5 | ## [1.0.1](https://github.com/Istered/RxPhotos/releases/tag/1.0.1) 6 | Released on 2018-04-02. 7 | 8 | ### Removed 9 | - PHImageManagerError. 10 | - Removed by [Anton Romanov](https://github.com/istered). 11 | 12 | ## [1.0.0](https://github.com/Istered/RxPhotos/releases/tag/1.0.0) 13 | Released on 2018-04-01. 14 | 15 | ### Added 16 | - Initial release of RxPhotos. 17 | - Added by [Anton Romanov](https://github.com/istered). 18 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | All contributors are welcome. Please use issues and pull requests to contribute to the project. And update [CHANGELOG.md](CHANGELOG.md) when committing. 4 | 5 | ## Making a change 6 | 7 | When you commit a change, please add a note to [CHANGELOG.md](CHANGELOG.md). 8 | 9 | ## Release process 10 | 11 | 1. Confirm the build is [passing in travis](https://travis-ci.org/istered/RxPhotos) 12 | 1. This automatically checks the Podfile is building 13 | 2. Push a release commit 14 | 1. Create a new Master section at the top 15 | 2. Rename the old Master section like: 16 | ## [1.0.5](https://github.com/istered/RxPhotos/releases/tag/1.0.5) 17 | Released on 2016-02-14. 18 | 3. Update the Podspec version number 19 | 3. Create a GitHub release 20 | 1. Tag the release (like `1.0.5`) 21 | 2. Paste notes from [CHANGELOG.md](CHANGELOG.md) 22 | 3. Push the Podspec to CocoaPods 23 | 1. `pod trunk push` 24 | 4. Create Carthage binaries 25 | 1. `carthage build --no-skip-current` 26 | 2. `carthage archive RxPhotos` 27 | 3. Add to the GitHub release 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2018 Anton Romanov 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | import PackageDescription 2 | 3 | let package = Package( 4 | name: "RxPhotos" 5 | ) 6 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | platform :ios, '10.0' 2 | 3 | target 'RxPhotos' do 4 | use_frameworks! 5 | inhibit_all_warnings! 6 | 7 | pod 'RxSwift' 8 | pod 'SwiftLint' 9 | 10 | target 'RxPhotosTests' do 11 | inherit! :search_paths 12 | end 13 | 14 | end 15 | 16 | target 'iOS Example' do 17 | pod 'RxSwift' 18 | end 19 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - RxSwift (4.1.2) 3 | - SwiftLint (0.25.0) 4 | 5 | DEPENDENCIES: 6 | - RxSwift 7 | - SwiftLint 8 | 9 | SPEC CHECKSUMS: 10 | RxSwift: e49536837d9901277638493ea537394d4b55f570 11 | SwiftLint: e14651157288e9e01d6e1a71db7014fb5744a8ea 12 | 13 | PODFILE CHECKSUM: 4ba2d643ee737a655f81c3b110da75c1473b02a8 14 | 15 | COCOAPODS: 1.4.0 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RxPhotos 2 | 3 | [![CI Status](http://img.shields.io/travis/istered/RxPhotos.svg?style=flat)](https://travis-ci.org/istered/RxPhotos) 4 | [![Version](https://img.shields.io/cocoapods/v/RxPhotos.svg?style=flat)](https://cocoapods.org/pods/RxPhotos) 5 | [![License](https://img.shields.io/cocoapods/l/RxPhotos.svg?style=flat)](https://cocoapods.org/pods/RxPhotos) 6 | [![Platform](https://img.shields.io/cocoapods/p/RxPhotos.svg?style=flat)](https://cocoapods.org/pods/RxPhotos) 7 | [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) 8 | 9 | This library is a tiny wrapper around some callback-based Photos' framework functions. 10 | 11 | ## Usage 12 | 13 | Request image: 14 | ```swift 15 | PHImageManager.default().rx.requestImage( 16 | for: asset, 17 | targetSize: CGSize(width: 120, height: 200), 18 | contentMode: PHImageContentMode.aspectFit, 19 | options: nil 20 | ).subscribe(onNext: { image in 21 | // 22 | }).disposed(by: disposeBag) 23 | ``` 24 | 25 | Watch PHPhotoLibrary changes: 26 | ```swift 27 | PHPhotoLibrary.shared().rx.photoLibraryChange 28 | .subscribe(onNext: { change in 29 | // 30 | }).disposed(by: disposeBag) 31 | ``` 32 | 33 | Request authorization: 34 | ```swift 35 | PHPhotoLibrary.rx.requestAuthorization() 36 | .subscribe(onSuccess: { status in 37 | // 38 | }).disposed(by: disposeBag) 39 | ``` 40 | 41 | Perform changes on photo library: 42 | ```swift 43 | PHPhotoLibrary.shared().rx.performChanges({ /**/ }) 44 | .subscribe(onSuccess: { result in 45 | // 46 | }).disposed(by: disposeBag) 47 | ``` 48 | 49 | ## Installation 50 | 51 | ### CocoaPods 52 | 53 | [CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects. You can install it with the following command: 54 | 55 | ```bash 56 | $ gem install cocoapods 57 | ``` 58 | 59 | To integrate RxPhotos into your Xcode project using CocoaPods, specify it in your `Podfile`: 60 | 61 | ```ruby 62 | use_frameworks! 63 | 64 | pod 'RxPhotos' 65 | ``` 66 | 67 | Then, run the following command: 68 | 69 | ```bash 70 | $ pod install 71 | ``` 72 | 73 | 74 | ### Carthage 75 | 76 | [Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. 77 | 78 | You can install Carthage with [Homebrew](http://brew.sh/) using the following command: 79 | 80 | ```bash 81 | $ brew update 82 | $ brew install carthage 83 | ``` 84 | 85 | To integrate RxPhotos into your Xcode project using Carthage, specify it in your `Cartfile`: 86 | 87 | ```ogdl 88 | github "istered/RxPhotos" 89 | ``` 90 | 91 | Run `carthage update` to build the framework and drag the built `RxPhotos`.framework into your Xcode project. 92 | 93 | 94 | ## Dependencies 95 | * [RxSwift](https://github.com/ReactiveX/RxSwift) ~> 4.0 96 | 97 | ## Requirements 98 | * iOS 10+ 99 | * Swift 4.0+ 100 | 101 | ## Author 102 | 103 | Anton Romanov 104 | 105 | 106 | ## License 107 | 108 | RxPhotos is available under the MIT license. See the LICENSE file for more info. 109 | -------------------------------------------------------------------------------- /RxPhotos.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = 'RxPhotos' 3 | s.version = '1.0.1' 4 | s.license = { :type => 'MIT', :file => 'LICENSE' } 5 | s.summary = 'Reactive extensions for Photos framework.' 6 | s.homepage = 'https://github.com/istered/RxPhotos' 7 | s.authors = { 'Anton Romanov' => 'istered@outlook.com' } 8 | s.source = { :git => 'https://github.com/istered/RxPhotos.git', :tag => s.version } 9 | s.source_files = 'Source/**/*.{h,m,swift}' 10 | s.swift_version = '4.0' 11 | s.frameworks = 'UIKit', 'Foundation', 'AVFoundation', 'Photos' 12 | 13 | s.dependency 'RxSwift', '~> 4.0' 14 | 15 | s.ios.deployment_target = '10.0' 16 | end -------------------------------------------------------------------------------- /RxPhotos.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 4964B0C7DE81C3F15E5385E7 /* Pods_RxPhotos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3FED1BA971B8C43E9F48644B /* Pods_RxPhotos.framework */; }; 11 | CA2DA41B1825ED6D7D7A42C5 /* Pods_RxPhotosTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B49B9FC965DEAB1AA752F01 /* Pods_RxPhotosTests.framework */; }; 12 | D93F1CA21EAEDB6E009A7474 /* RxPhotos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D93F1C981EAEDB6E009A7474 /* RxPhotos.framework */; }; 13 | D93F1CA71EAEDB6E009A7474 /* RxPhotosTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D93F1CA61EAEDB6E009A7474 /* RxPhotosTests.swift */; }; 14 | D93F1CA91EAEDB6E009A7474 /* RxPhotos.h in Headers */ = {isa = PBXBuildFile; fileRef = D93F1C9B1EAEDB6E009A7474 /* RxPhotos.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15 | DD0F877B2070EEA200ADEFEF /* PHImageManager+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD0F877A2070EEA200ADEFEF /* PHImageManager+Rx.swift */; }; 16 | DD8E2E5E2070F04D008A5AC2 /* ImageRequestResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8E2E5D2070F04D008A5AC2 /* ImageRequestResult.swift */; }; 17 | DD8E2E602070F09A008A5AC2 /* AssetRequestResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8E2E5F2070F09A008A5AC2 /* AssetRequestResult.swift */; }; 18 | DD8E2E622070F350008A5AC2 /* ImageDataRequestResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8E2E612070F350008A5AC2 /* ImageDataRequestResult.swift */; }; 19 | DD8E2E642070F433008A5AC2 /* PlayerItemRequestResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8E2E632070F433008A5AC2 /* PlayerItemRequestResult.swift */; }; 20 | DD8E2E662070F51F008A5AC2 /* AssetExportSessionRequestResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8E2E652070F51F008A5AC2 /* AssetExportSessionRequestResult.swift */; }; 21 | DD8E2E682070F5E2008A5AC2 /* LivePhotoRequestResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8E2E672070F5E2008A5AC2 /* LivePhotoRequestResult.swift */; }; 22 | DDC0E7812070FDC60051A0DB /* PHPhotoLibrary+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDC0E7802070FDC60051A0DB /* PHPhotoLibrary+Rx.swift */; }; 23 | DDC0E78720712CCF0051A0DB /* RxPHPhotoLibraryObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDC0E78620712CCF0051A0DB /* RxPHPhotoLibraryObserver.swift */; }; 24 | DDC0E78920712EB40051A0DB /* PHAsset+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDC0E78820712EB40051A0DB /* PHAsset+Rx.swift */; }; 25 | DDC0E78B20712F730051A0DB /* ContentEditRequestResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDC0E78A20712F730051A0DB /* ContentEditRequestResult.swift */; }; 26 | DDC0E78D2071309C0051A0DB /* RxPhotoError.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDC0E78C2071309C0051A0DB /* RxPhotoError.swift */; }; 27 | DDC0E790207135FA0051A0DB /* PHLivePhoto+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDC0E78F207135FA0051A0DB /* PHLivePhoto+Rx.swift */; }; 28 | DDC0E792207137F40051A0DB /* PHLivePhotoEditingContext+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDC0E791207137F40051A0DB /* PHLivePhotoEditingContext+Rx.swift */; }; 29 | DDC0E794207139AC0051A0DB /* PHAssetResourceManager+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDC0E793207139AC0051A0DB /* PHAssetResourceManager+Rx.swift */; }; 30 | /* End PBXBuildFile section */ 31 | 32 | /* Begin PBXContainerItemProxy section */ 33 | D93F1CA31EAEDB6E009A7474 /* PBXContainerItemProxy */ = { 34 | isa = PBXContainerItemProxy; 35 | containerPortal = D93F1C8F1EAEDB6E009A7474 /* Project object */; 36 | proxyType = 1; 37 | remoteGlobalIDString = D93F1C971EAEDB6E009A7474; 38 | remoteInfo = RxPhotos; 39 | }; 40 | /* End PBXContainerItemProxy section */ 41 | 42 | /* Begin PBXFileReference section */ 43 | 22233396156713BE5A181A86 /* Pods-RxPhotosTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RxPhotosTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RxPhotosTests/Pods-RxPhotosTests.debug.xcconfig"; sourceTree = ""; }; 44 | 3FED1BA971B8C43E9F48644B /* Pods_RxPhotos.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RxPhotos.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | 8B49B9FC965DEAB1AA752F01 /* Pods_RxPhotosTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RxPhotosTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 46 | 97606ABDFCEAB6B4C1F3AE6F /* Pods-RxPhotosTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RxPhotosTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-RxPhotosTests/Pods-RxPhotosTests.release.xcconfig"; sourceTree = ""; }; 47 | 9A61EE4C0F3E8CBBE9DEC72F /* Pods-RxPhotos.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RxPhotos.release.xcconfig"; path = "Pods/Target Support Files/Pods-RxPhotos/Pods-RxPhotos.release.xcconfig"; sourceTree = ""; }; 48 | D93F1C981EAEDB6E009A7474 /* RxPhotos.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxPhotos.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | D93F1C9B1EAEDB6E009A7474 /* RxPhotos.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RxPhotos.h; sourceTree = ""; }; 50 | D93F1C9C1EAEDB6E009A7474 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 51 | D93F1CA11EAEDB6E009A7474 /* RxPhotosTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RxPhotosTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 52 | D93F1CA61EAEDB6E009A7474 /* RxPhotosTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RxPhotosTests.swift; sourceTree = ""; }; 53 | D93F1CA81EAEDB6E009A7474 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54 | DD0F877A2070EEA200ADEFEF /* PHImageManager+Rx.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PHImageManager+Rx.swift"; sourceTree = ""; }; 55 | DD8E2E5D2070F04D008A5AC2 /* ImageRequestResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageRequestResult.swift; sourceTree = ""; }; 56 | DD8E2E5F2070F09A008A5AC2 /* AssetRequestResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssetRequestResult.swift; sourceTree = ""; }; 57 | DD8E2E612070F350008A5AC2 /* ImageDataRequestResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageDataRequestResult.swift; sourceTree = ""; }; 58 | DD8E2E632070F433008A5AC2 /* PlayerItemRequestResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerItemRequestResult.swift; sourceTree = ""; }; 59 | DD8E2E652070F51F008A5AC2 /* AssetExportSessionRequestResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssetExportSessionRequestResult.swift; sourceTree = ""; }; 60 | DD8E2E672070F5E2008A5AC2 /* LivePhotoRequestResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LivePhotoRequestResult.swift; sourceTree = ""; }; 61 | DDC0E7802070FDC60051A0DB /* PHPhotoLibrary+Rx.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PHPhotoLibrary+Rx.swift"; sourceTree = ""; }; 62 | DDC0E78620712CCF0051A0DB /* RxPHPhotoLibraryObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RxPHPhotoLibraryObserver.swift; sourceTree = ""; }; 63 | DDC0E78820712EB40051A0DB /* PHAsset+Rx.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PHAsset+Rx.swift"; sourceTree = ""; }; 64 | DDC0E78A20712F730051A0DB /* ContentEditRequestResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentEditRequestResult.swift; sourceTree = ""; }; 65 | DDC0E78C2071309C0051A0DB /* RxPhotoError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RxPhotoError.swift; sourceTree = ""; }; 66 | DDC0E78F207135FA0051A0DB /* PHLivePhoto+Rx.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PHLivePhoto+Rx.swift"; sourceTree = ""; }; 67 | DDC0E791207137F40051A0DB /* PHLivePhotoEditingContext+Rx.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PHLivePhotoEditingContext+Rx.swift"; sourceTree = ""; }; 68 | DDC0E793207139AC0051A0DB /* PHAssetResourceManager+Rx.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PHAssetResourceManager+Rx.swift"; sourceTree = ""; }; 69 | ED984F529D5365D409CD1C24 /* Pods-RxPhotos.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RxPhotos.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RxPhotos/Pods-RxPhotos.debug.xcconfig"; sourceTree = ""; }; 70 | /* End PBXFileReference section */ 71 | 72 | /* Begin PBXFrameworksBuildPhase section */ 73 | D93F1C941EAEDB6E009A7474 /* Frameworks */ = { 74 | isa = PBXFrameworksBuildPhase; 75 | buildActionMask = 2147483647; 76 | files = ( 77 | 4964B0C7DE81C3F15E5385E7 /* Pods_RxPhotos.framework in Frameworks */, 78 | ); 79 | runOnlyForDeploymentPostprocessing = 0; 80 | }; 81 | D93F1C9E1EAEDB6E009A7474 /* Frameworks */ = { 82 | isa = PBXFrameworksBuildPhase; 83 | buildActionMask = 2147483647; 84 | files = ( 85 | D93F1CA21EAEDB6E009A7474 /* RxPhotos.framework in Frameworks */, 86 | CA2DA41B1825ED6D7D7A42C5 /* Pods_RxPhotosTests.framework in Frameworks */, 87 | ); 88 | runOnlyForDeploymentPostprocessing = 0; 89 | }; 90 | /* End PBXFrameworksBuildPhase section */ 91 | 92 | /* Begin PBXGroup section */ 93 | CD79CBCAD0AA1AE2EEEC79CA /* Frameworks */ = { 94 | isa = PBXGroup; 95 | children = ( 96 | 3FED1BA971B8C43E9F48644B /* Pods_RxPhotos.framework */, 97 | 8B49B9FC965DEAB1AA752F01 /* Pods_RxPhotosTests.framework */, 98 | ); 99 | name = Frameworks; 100 | sourceTree = ""; 101 | }; 102 | D93F1C8E1EAEDB6E009A7474 = { 103 | isa = PBXGroup; 104 | children = ( 105 | D93F1C9A1EAEDB6E009A7474 /* Source */, 106 | D93F1CA51EAEDB6E009A7474 /* Tests */, 107 | D93F1C991EAEDB6E009A7474 /* Products */, 108 | E9F560222B695140902F2413 /* Pods */, 109 | CD79CBCAD0AA1AE2EEEC79CA /* Frameworks */, 110 | ); 111 | sourceTree = ""; 112 | }; 113 | D93F1C991EAEDB6E009A7474 /* Products */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | D93F1C981EAEDB6E009A7474 /* RxPhotos.framework */, 117 | D93F1CA11EAEDB6E009A7474 /* RxPhotosTests.xctest */, 118 | ); 119 | name = Products; 120 | sourceTree = ""; 121 | }; 122 | D93F1C9A1EAEDB6E009A7474 /* Source */ = { 123 | isa = PBXGroup; 124 | children = ( 125 | DDC0E78E207133890051A0DB /* Extensions */, 126 | DD8E2E5A2070F020008A5AC2 /* Results */, 127 | D93F1C9B1EAEDB6E009A7474 /* RxPhotos.h */, 128 | D93F1C9C1EAEDB6E009A7474 /* Info.plist */, 129 | DDC0E78C2071309C0051A0DB /* RxPhotoError.swift */, 130 | DDC0E78620712CCF0051A0DB /* RxPHPhotoLibraryObserver.swift */, 131 | ); 132 | path = Source; 133 | sourceTree = ""; 134 | }; 135 | D93F1CA51EAEDB6E009A7474 /* Tests */ = { 136 | isa = PBXGroup; 137 | children = ( 138 | D93F1CA61EAEDB6E009A7474 /* RxPhotosTests.swift */, 139 | D93F1CA81EAEDB6E009A7474 /* Info.plist */, 140 | ); 141 | path = Tests; 142 | sourceTree = ""; 143 | }; 144 | DD8E2E5A2070F020008A5AC2 /* Results */ = { 145 | isa = PBXGroup; 146 | children = ( 147 | DD8E2E5D2070F04D008A5AC2 /* ImageRequestResult.swift */, 148 | DD8E2E5F2070F09A008A5AC2 /* AssetRequestResult.swift */, 149 | DD8E2E612070F350008A5AC2 /* ImageDataRequestResult.swift */, 150 | DD8E2E632070F433008A5AC2 /* PlayerItemRequestResult.swift */, 151 | DD8E2E652070F51F008A5AC2 /* AssetExportSessionRequestResult.swift */, 152 | DD8E2E672070F5E2008A5AC2 /* LivePhotoRequestResult.swift */, 153 | DDC0E78A20712F730051A0DB /* ContentEditRequestResult.swift */, 154 | ); 155 | path = Results; 156 | sourceTree = ""; 157 | }; 158 | DDC0E78E207133890051A0DB /* Extensions */ = { 159 | isa = PBXGroup; 160 | children = ( 161 | DDC0E78820712EB40051A0DB /* PHAsset+Rx.swift */, 162 | DD0F877A2070EEA200ADEFEF /* PHImageManager+Rx.swift */, 163 | DDC0E7802070FDC60051A0DB /* PHPhotoLibrary+Rx.swift */, 164 | DDC0E78F207135FA0051A0DB /* PHLivePhoto+Rx.swift */, 165 | DDC0E791207137F40051A0DB /* PHLivePhotoEditingContext+Rx.swift */, 166 | DDC0E793207139AC0051A0DB /* PHAssetResourceManager+Rx.swift */, 167 | ); 168 | path = Extensions; 169 | sourceTree = ""; 170 | }; 171 | E9F560222B695140902F2413 /* Pods */ = { 172 | isa = PBXGroup; 173 | children = ( 174 | ED984F529D5365D409CD1C24 /* Pods-RxPhotos.debug.xcconfig */, 175 | 9A61EE4C0F3E8CBBE9DEC72F /* Pods-RxPhotos.release.xcconfig */, 176 | 22233396156713BE5A181A86 /* Pods-RxPhotosTests.debug.xcconfig */, 177 | 97606ABDFCEAB6B4C1F3AE6F /* Pods-RxPhotosTests.release.xcconfig */, 178 | ); 179 | name = Pods; 180 | sourceTree = ""; 181 | }; 182 | /* End PBXGroup section */ 183 | 184 | /* Begin PBXHeadersBuildPhase section */ 185 | D93F1C951EAEDB6E009A7474 /* Headers */ = { 186 | isa = PBXHeadersBuildPhase; 187 | buildActionMask = 2147483647; 188 | files = ( 189 | D93F1CA91EAEDB6E009A7474 /* RxPhotos.h in Headers */, 190 | ); 191 | runOnlyForDeploymentPostprocessing = 0; 192 | }; 193 | /* End PBXHeadersBuildPhase section */ 194 | 195 | /* Begin PBXNativeTarget section */ 196 | D93F1C971EAEDB6E009A7474 /* RxPhotos */ = { 197 | isa = PBXNativeTarget; 198 | buildConfigurationList = D93F1CAC1EAEDB6E009A7474 /* Build configuration list for PBXNativeTarget "RxPhotos" */; 199 | buildPhases = ( 200 | 11C0AB480A3DBDA737BF1482 /* [CP] Check Pods Manifest.lock */, 201 | DD8E2E6A2070FAD7008A5AC2 /* SwiftLint */, 202 | D93F1C931EAEDB6E009A7474 /* Sources */, 203 | D93F1C941EAEDB6E009A7474 /* Frameworks */, 204 | D93F1C951EAEDB6E009A7474 /* Headers */, 205 | D93F1C961EAEDB6E009A7474 /* Resources */, 206 | C4B86CD657ADA1DB4C8E511A /* [CP] Copy Pods Resources */, 207 | ); 208 | buildRules = ( 209 | ); 210 | dependencies = ( 211 | ); 212 | name = RxPhotos; 213 | productName = RxPhotos; 214 | productReference = D93F1C981EAEDB6E009A7474 /* RxPhotos.framework */; 215 | productType = "com.apple.product-type.framework"; 216 | }; 217 | D93F1CA01EAEDB6E009A7474 /* RxPhotosTests */ = { 218 | isa = PBXNativeTarget; 219 | buildConfigurationList = D93F1CAF1EAEDB6E009A7474 /* Build configuration list for PBXNativeTarget "RxPhotosTests" */; 220 | buildPhases = ( 221 | DBE594FA507EF38472DBECBB /* [CP] Check Pods Manifest.lock */, 222 | D93F1C9D1EAEDB6E009A7474 /* Sources */, 223 | D93F1C9E1EAEDB6E009A7474 /* Frameworks */, 224 | D93F1C9F1EAEDB6E009A7474 /* Resources */, 225 | 2C7A351791915626EAB70C1C /* [CP] Embed Pods Frameworks */, 226 | AF23777EEE4B58C64CED1BB4 /* [CP] Copy Pods Resources */, 227 | ); 228 | buildRules = ( 229 | ); 230 | dependencies = ( 231 | D93F1CA41EAEDB6E009A7474 /* PBXTargetDependency */, 232 | ); 233 | name = RxPhotosTests; 234 | productName = RxPhotosTests; 235 | productReference = D93F1CA11EAEDB6E009A7474 /* RxPhotosTests.xctest */; 236 | productType = "com.apple.product-type.bundle.unit-test"; 237 | }; 238 | /* End PBXNativeTarget section */ 239 | 240 | /* Begin PBXProject section */ 241 | D93F1C8F1EAEDB6E009A7474 /* Project object */ = { 242 | isa = PBXProject; 243 | attributes = { 244 | LastSwiftUpdateCheck = 0830; 245 | LastUpgradeCheck = 0930; 246 | ORGANIZATIONNAME = Istered; 247 | TargetAttributes = { 248 | D93F1C971EAEDB6E009A7474 = { 249 | CreatedOnToolsVersion = 8.3.2; 250 | LastSwiftMigration = 0930; 251 | ProvisioningStyle = Automatic; 252 | }; 253 | D93F1CA01EAEDB6E009A7474 = { 254 | CreatedOnToolsVersion = 8.3.2; 255 | LastSwiftMigration = 0930; 256 | ProvisioningStyle = Automatic; 257 | }; 258 | }; 259 | }; 260 | buildConfigurationList = D93F1C921EAEDB6E009A7474 /* Build configuration list for PBXProject "RxPhotos" */; 261 | compatibilityVersion = "Xcode 3.2"; 262 | developmentRegion = English; 263 | hasScannedForEncodings = 0; 264 | knownRegions = ( 265 | en, 266 | ); 267 | mainGroup = D93F1C8E1EAEDB6E009A7474; 268 | productRefGroup = D93F1C991EAEDB6E009A7474 /* Products */; 269 | projectDirPath = ""; 270 | projectRoot = ""; 271 | targets = ( 272 | D93F1C971EAEDB6E009A7474 /* RxPhotos */, 273 | D93F1CA01EAEDB6E009A7474 /* RxPhotosTests */, 274 | ); 275 | }; 276 | /* End PBXProject section */ 277 | 278 | /* Begin PBXResourcesBuildPhase section */ 279 | D93F1C961EAEDB6E009A7474 /* Resources */ = { 280 | isa = PBXResourcesBuildPhase; 281 | buildActionMask = 2147483647; 282 | files = ( 283 | ); 284 | runOnlyForDeploymentPostprocessing = 0; 285 | }; 286 | D93F1C9F1EAEDB6E009A7474 /* Resources */ = { 287 | isa = PBXResourcesBuildPhase; 288 | buildActionMask = 2147483647; 289 | files = ( 290 | ); 291 | runOnlyForDeploymentPostprocessing = 0; 292 | }; 293 | /* End PBXResourcesBuildPhase section */ 294 | 295 | /* Begin PBXShellScriptBuildPhase section */ 296 | 11C0AB480A3DBDA737BF1482 /* [CP] Check Pods Manifest.lock */ = { 297 | isa = PBXShellScriptBuildPhase; 298 | buildActionMask = 2147483647; 299 | files = ( 300 | ); 301 | inputPaths = ( 302 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 303 | "${PODS_ROOT}/Manifest.lock", 304 | ); 305 | name = "[CP] Check Pods Manifest.lock"; 306 | outputPaths = ( 307 | "$(DERIVED_FILE_DIR)/Pods-RxPhotos-checkManifestLockResult.txt", 308 | ); 309 | runOnlyForDeploymentPostprocessing = 0; 310 | shellPath = /bin/sh; 311 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 312 | showEnvVarsInLog = 0; 313 | }; 314 | 2C7A351791915626EAB70C1C /* [CP] Embed Pods Frameworks */ = { 315 | isa = PBXShellScriptBuildPhase; 316 | buildActionMask = 2147483647; 317 | files = ( 318 | ); 319 | inputPaths = ( 320 | "${SRCROOT}/Pods/Target Support Files/Pods-RxPhotosTests/Pods-RxPhotosTests-frameworks.sh", 321 | "${BUILT_PRODUCTS_DIR}/RxSwift/RxSwift.framework", 322 | ); 323 | name = "[CP] Embed Pods Frameworks"; 324 | outputPaths = ( 325 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxSwift.framework", 326 | ); 327 | runOnlyForDeploymentPostprocessing = 0; 328 | shellPath = /bin/sh; 329 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-RxPhotosTests/Pods-RxPhotosTests-frameworks.sh\"\n"; 330 | showEnvVarsInLog = 0; 331 | }; 332 | AF23777EEE4B58C64CED1BB4 /* [CP] Copy Pods Resources */ = { 333 | isa = PBXShellScriptBuildPhase; 334 | buildActionMask = 2147483647; 335 | files = ( 336 | ); 337 | inputPaths = ( 338 | ); 339 | name = "[CP] Copy Pods Resources"; 340 | outputPaths = ( 341 | ); 342 | runOnlyForDeploymentPostprocessing = 0; 343 | shellPath = /bin/sh; 344 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-RxPhotosTests/Pods-RxPhotosTests-resources.sh\"\n"; 345 | showEnvVarsInLog = 0; 346 | }; 347 | C4B86CD657ADA1DB4C8E511A /* [CP] Copy Pods Resources */ = { 348 | isa = PBXShellScriptBuildPhase; 349 | buildActionMask = 2147483647; 350 | files = ( 351 | ); 352 | inputPaths = ( 353 | ); 354 | name = "[CP] Copy Pods Resources"; 355 | outputPaths = ( 356 | ); 357 | runOnlyForDeploymentPostprocessing = 0; 358 | shellPath = /bin/sh; 359 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-RxPhotos/Pods-RxPhotos-resources.sh\"\n"; 360 | showEnvVarsInLog = 0; 361 | }; 362 | DBE594FA507EF38472DBECBB /* [CP] Check Pods Manifest.lock */ = { 363 | isa = PBXShellScriptBuildPhase; 364 | buildActionMask = 2147483647; 365 | files = ( 366 | ); 367 | inputPaths = ( 368 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 369 | "${PODS_ROOT}/Manifest.lock", 370 | ); 371 | name = "[CP] Check Pods Manifest.lock"; 372 | outputPaths = ( 373 | "$(DERIVED_FILE_DIR)/Pods-RxPhotosTests-checkManifestLockResult.txt", 374 | ); 375 | runOnlyForDeploymentPostprocessing = 0; 376 | shellPath = /bin/sh; 377 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 378 | showEnvVarsInLog = 0; 379 | }; 380 | DD8E2E6A2070FAD7008A5AC2 /* SwiftLint */ = { 381 | isa = PBXShellScriptBuildPhase; 382 | buildActionMask = 2147483647; 383 | files = ( 384 | ); 385 | inputPaths = ( 386 | ); 387 | name = SwiftLint; 388 | outputPaths = ( 389 | ); 390 | runOnlyForDeploymentPostprocessing = 0; 391 | shellPath = /bin/sh; 392 | shellScript = "\"${PODS_ROOT}/SwiftLint/swiftlint\""; 393 | }; 394 | /* End PBXShellScriptBuildPhase section */ 395 | 396 | /* Begin PBXSourcesBuildPhase section */ 397 | D93F1C931EAEDB6E009A7474 /* Sources */ = { 398 | isa = PBXSourcesBuildPhase; 399 | buildActionMask = 2147483647; 400 | files = ( 401 | DDC0E790207135FA0051A0DB /* PHLivePhoto+Rx.swift in Sources */, 402 | DDC0E792207137F40051A0DB /* PHLivePhotoEditingContext+Rx.swift in Sources */, 403 | DDC0E78720712CCF0051A0DB /* RxPHPhotoLibraryObserver.swift in Sources */, 404 | DD8E2E602070F09A008A5AC2 /* AssetRequestResult.swift in Sources */, 405 | DD8E2E682070F5E2008A5AC2 /* LivePhotoRequestResult.swift in Sources */, 406 | DD8E2E5E2070F04D008A5AC2 /* ImageRequestResult.swift in Sources */, 407 | DDC0E78920712EB40051A0DB /* PHAsset+Rx.swift in Sources */, 408 | DDC0E78B20712F730051A0DB /* ContentEditRequestResult.swift in Sources */, 409 | DDC0E78D2071309C0051A0DB /* RxPhotoError.swift in Sources */, 410 | DDC0E794207139AC0051A0DB /* PHAssetResourceManager+Rx.swift in Sources */, 411 | DDC0E7812070FDC60051A0DB /* PHPhotoLibrary+Rx.swift in Sources */, 412 | DD8E2E642070F433008A5AC2 /* PlayerItemRequestResult.swift in Sources */, 413 | DD8E2E662070F51F008A5AC2 /* AssetExportSessionRequestResult.swift in Sources */, 414 | DD8E2E622070F350008A5AC2 /* ImageDataRequestResult.swift in Sources */, 415 | DD0F877B2070EEA200ADEFEF /* PHImageManager+Rx.swift in Sources */, 416 | ); 417 | runOnlyForDeploymentPostprocessing = 0; 418 | }; 419 | D93F1C9D1EAEDB6E009A7474 /* Sources */ = { 420 | isa = PBXSourcesBuildPhase; 421 | buildActionMask = 2147483647; 422 | files = ( 423 | D93F1CA71EAEDB6E009A7474 /* RxPhotosTests.swift in Sources */, 424 | ); 425 | runOnlyForDeploymentPostprocessing = 0; 426 | }; 427 | /* End PBXSourcesBuildPhase section */ 428 | 429 | /* Begin PBXTargetDependency section */ 430 | D93F1CA41EAEDB6E009A7474 /* PBXTargetDependency */ = { 431 | isa = PBXTargetDependency; 432 | target = D93F1C971EAEDB6E009A7474 /* RxPhotos */; 433 | targetProxy = D93F1CA31EAEDB6E009A7474 /* PBXContainerItemProxy */; 434 | }; 435 | /* End PBXTargetDependency section */ 436 | 437 | /* Begin XCBuildConfiguration section */ 438 | D93F1CAA1EAEDB6E009A7474 /* Debug */ = { 439 | isa = XCBuildConfiguration; 440 | buildSettings = { 441 | ALWAYS_SEARCH_USER_PATHS = NO; 442 | CLANG_ANALYZER_NONNULL = YES; 443 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 444 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 445 | CLANG_CXX_LIBRARY = "libc++"; 446 | CLANG_ENABLE_MODULES = YES; 447 | CLANG_ENABLE_OBJC_ARC = YES; 448 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 449 | CLANG_WARN_BOOL_CONVERSION = YES; 450 | CLANG_WARN_COMMA = YES; 451 | CLANG_WARN_CONSTANT_CONVERSION = YES; 452 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 453 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 454 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 455 | CLANG_WARN_EMPTY_BODY = YES; 456 | CLANG_WARN_ENUM_CONVERSION = YES; 457 | CLANG_WARN_INFINITE_RECURSION = YES; 458 | CLANG_WARN_INT_CONVERSION = YES; 459 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 460 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 461 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 462 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 463 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 464 | CLANG_WARN_STRICT_PROTOTYPES = YES; 465 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 466 | CLANG_WARN_UNREACHABLE_CODE = YES; 467 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 468 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 469 | COPY_PHASE_STRIP = NO; 470 | CURRENT_PROJECT_VERSION = 1; 471 | DEBUG_INFORMATION_FORMAT = dwarf; 472 | ENABLE_STRICT_OBJC_MSGSEND = YES; 473 | ENABLE_TESTABILITY = YES; 474 | GCC_C_LANGUAGE_STANDARD = gnu99; 475 | GCC_DYNAMIC_NO_PIC = NO; 476 | GCC_NO_COMMON_BLOCKS = YES; 477 | GCC_OPTIMIZATION_LEVEL = 0; 478 | GCC_PREPROCESSOR_DEFINITIONS = ( 479 | "DEBUG=1", 480 | "$(inherited)", 481 | ); 482 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 483 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 484 | GCC_WARN_UNDECLARED_SELECTOR = YES; 485 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 486 | GCC_WARN_UNUSED_FUNCTION = YES; 487 | GCC_WARN_UNUSED_VARIABLE = YES; 488 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 489 | MTL_ENABLE_DEBUG_INFO = YES; 490 | ONLY_ACTIVE_ARCH = YES; 491 | SDKROOT = iphoneos; 492 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 493 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 494 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 495 | TARGETED_DEVICE_FAMILY = "1,2"; 496 | VERSIONING_SYSTEM = "apple-generic"; 497 | VERSION_INFO_PREFIX = ""; 498 | }; 499 | name = Debug; 500 | }; 501 | D93F1CAB1EAEDB6E009A7474 /* Release */ = { 502 | isa = XCBuildConfiguration; 503 | buildSettings = { 504 | ALWAYS_SEARCH_USER_PATHS = NO; 505 | CLANG_ANALYZER_NONNULL = YES; 506 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 507 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 508 | CLANG_CXX_LIBRARY = "libc++"; 509 | CLANG_ENABLE_MODULES = YES; 510 | CLANG_ENABLE_OBJC_ARC = YES; 511 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 512 | CLANG_WARN_BOOL_CONVERSION = YES; 513 | CLANG_WARN_COMMA = YES; 514 | CLANG_WARN_CONSTANT_CONVERSION = YES; 515 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 516 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 517 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 518 | CLANG_WARN_EMPTY_BODY = YES; 519 | CLANG_WARN_ENUM_CONVERSION = YES; 520 | CLANG_WARN_INFINITE_RECURSION = YES; 521 | CLANG_WARN_INT_CONVERSION = YES; 522 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 523 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 524 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 525 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 526 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 527 | CLANG_WARN_STRICT_PROTOTYPES = YES; 528 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 529 | CLANG_WARN_UNREACHABLE_CODE = YES; 530 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 531 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 532 | COPY_PHASE_STRIP = NO; 533 | CURRENT_PROJECT_VERSION = 1; 534 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 535 | ENABLE_NS_ASSERTIONS = NO; 536 | ENABLE_STRICT_OBJC_MSGSEND = YES; 537 | GCC_C_LANGUAGE_STANDARD = gnu99; 538 | GCC_NO_COMMON_BLOCKS = YES; 539 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 540 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 541 | GCC_WARN_UNDECLARED_SELECTOR = YES; 542 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 543 | GCC_WARN_UNUSED_FUNCTION = YES; 544 | GCC_WARN_UNUSED_VARIABLE = YES; 545 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 546 | MTL_ENABLE_DEBUG_INFO = NO; 547 | SDKROOT = iphoneos; 548 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 549 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 550 | TARGETED_DEVICE_FAMILY = "1,2"; 551 | VALIDATE_PRODUCT = YES; 552 | VERSIONING_SYSTEM = "apple-generic"; 553 | VERSION_INFO_PREFIX = ""; 554 | }; 555 | name = Release; 556 | }; 557 | D93F1CAD1EAEDB6E009A7474 /* Debug */ = { 558 | isa = XCBuildConfiguration; 559 | baseConfigurationReference = ED984F529D5365D409CD1C24 /* Pods-RxPhotos.debug.xcconfig */; 560 | buildSettings = { 561 | CLANG_ENABLE_MODULES = YES; 562 | CODE_SIGN_IDENTITY = ""; 563 | DEFINES_MODULE = YES; 564 | DEVELOPMENT_TEAM = ""; 565 | DYLIB_COMPATIBILITY_VERSION = 1; 566 | DYLIB_CURRENT_VERSION = 1; 567 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 568 | INFOPLIST_FILE = Source/Info.plist; 569 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 570 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 571 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 572 | PRODUCT_BUNDLE_IDENTIFIER = com.istered.RxPhotos; 573 | PRODUCT_NAME = "$(TARGET_NAME)"; 574 | SKIP_INSTALL = YES; 575 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 576 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 577 | SWIFT_VERSION = 4.0; 578 | }; 579 | name = Debug; 580 | }; 581 | D93F1CAE1EAEDB6E009A7474 /* Release */ = { 582 | isa = XCBuildConfiguration; 583 | baseConfigurationReference = 9A61EE4C0F3E8CBBE9DEC72F /* Pods-RxPhotos.release.xcconfig */; 584 | buildSettings = { 585 | CLANG_ENABLE_MODULES = YES; 586 | CODE_SIGN_IDENTITY = ""; 587 | DEFINES_MODULE = YES; 588 | DEVELOPMENT_TEAM = ""; 589 | DYLIB_COMPATIBILITY_VERSION = 1; 590 | DYLIB_CURRENT_VERSION = 1; 591 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 592 | INFOPLIST_FILE = Source/Info.plist; 593 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 594 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 595 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 596 | PRODUCT_BUNDLE_IDENTIFIER = com.istered.RxPhotos; 597 | PRODUCT_NAME = "$(TARGET_NAME)"; 598 | SKIP_INSTALL = YES; 599 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 600 | SWIFT_VERSION = 4.0; 601 | }; 602 | name = Release; 603 | }; 604 | D93F1CB01EAEDB6E009A7474 /* Debug */ = { 605 | isa = XCBuildConfiguration; 606 | baseConfigurationReference = 22233396156713BE5A181A86 /* Pods-RxPhotosTests.debug.xcconfig */; 607 | buildSettings = { 608 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 609 | DEVELOPMENT_TEAM = ""; 610 | INFOPLIST_FILE = Tests/Info.plist; 611 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 612 | PRODUCT_BUNDLE_IDENTIFIER = com.istered.RxPhotosTests; 613 | PRODUCT_NAME = "$(TARGET_NAME)"; 614 | SWIFT_SWIFT3_OBJC_INFERENCE = On; 615 | SWIFT_VERSION = 4.0; 616 | }; 617 | name = Debug; 618 | }; 619 | D93F1CB11EAEDB6E009A7474 /* Release */ = { 620 | isa = XCBuildConfiguration; 621 | baseConfigurationReference = 97606ABDFCEAB6B4C1F3AE6F /* Pods-RxPhotosTests.release.xcconfig */; 622 | buildSettings = { 623 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 624 | DEVELOPMENT_TEAM = ""; 625 | INFOPLIST_FILE = Tests/Info.plist; 626 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 627 | PRODUCT_BUNDLE_IDENTIFIER = com.istered.RxPhotosTests; 628 | PRODUCT_NAME = "$(TARGET_NAME)"; 629 | SWIFT_SWIFT3_OBJC_INFERENCE = On; 630 | SWIFT_VERSION = 4.0; 631 | }; 632 | name = Release; 633 | }; 634 | /* End XCBuildConfiguration section */ 635 | 636 | /* Begin XCConfigurationList section */ 637 | D93F1C921EAEDB6E009A7474 /* Build configuration list for PBXProject "RxPhotos" */ = { 638 | isa = XCConfigurationList; 639 | buildConfigurations = ( 640 | D93F1CAA1EAEDB6E009A7474 /* Debug */, 641 | D93F1CAB1EAEDB6E009A7474 /* Release */, 642 | ); 643 | defaultConfigurationIsVisible = 0; 644 | defaultConfigurationName = Release; 645 | }; 646 | D93F1CAC1EAEDB6E009A7474 /* Build configuration list for PBXNativeTarget "RxPhotos" */ = { 647 | isa = XCConfigurationList; 648 | buildConfigurations = ( 649 | D93F1CAD1EAEDB6E009A7474 /* Debug */, 650 | D93F1CAE1EAEDB6E009A7474 /* Release */, 651 | ); 652 | defaultConfigurationIsVisible = 0; 653 | defaultConfigurationName = Release; 654 | }; 655 | D93F1CAF1EAEDB6E009A7474 /* Build configuration list for PBXNativeTarget "RxPhotosTests" */ = { 656 | isa = XCConfigurationList; 657 | buildConfigurations = ( 658 | D93F1CB01EAEDB6E009A7474 /* Debug */, 659 | D93F1CB11EAEDB6E009A7474 /* Release */, 660 | ); 661 | defaultConfigurationIsVisible = 0; 662 | defaultConfigurationName = Release; 663 | }; 664 | /* End XCConfigurationList section */ 665 | }; 666 | rootObject = D93F1C8F1EAEDB6E009A7474 /* Project object */; 667 | } 668 | -------------------------------------------------------------------------------- /RxPhotos.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /RxPhotos.xcodeproj/xcshareddata/xcschemes/RxPhotos.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 65 | 71 | 72 | 73 | 74 | 75 | 76 | 82 | 83 | 89 | 90 | 91 | 92 | 94 | 95 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /RxPhotos.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /RxPhotos.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Source/Extensions/PHAsset+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PHAsset+Rx.swift 3 | // RxPhotos 4 | // 5 | // Created by Anton Romanov on 01/04/2018. 6 | // Copyright © 2018 Istered. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Photos 11 | import RxSwift 12 | 13 | extension Reactive where Base: PHAsset { 14 | public func requestContentEditingInput(with options: PHContentEditingInputRequestOptions?) 15 | -> Single { 16 | return Single.create { [weak base] single in 17 | 18 | let requestId = base?.requestContentEditingInput( 19 | with: options, 20 | completionHandler: { input, info in 21 | if let error = RxPhotoError(info: info) { 22 | single(.error(error)) 23 | } else { 24 | single(.success(ContentEditRequestResult(editingInput: input, info: info))) 25 | } 26 | }) 27 | 28 | return Disposables.create { 29 | requestId.map { base?.cancelContentEditingInputRequest($0) } 30 | } 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Source/Extensions/PHAssetResourceManager+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PHAssetResourceManager+Rx.swift 3 | // RxPhotos 4 | // 5 | // Created by Anton Romanov on 01/04/2018. 6 | // Copyright © 2018 Istered. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Photos 11 | import RxSwift 12 | 13 | extension Reactive where Base: PHAssetResourceManager { 14 | public func requestData(for resource: PHAssetResource, options: PHAssetResourceRequestOptions?) 15 | -> Observable { 16 | return Observable.create { [weak base] observable in 17 | 18 | let requestId = base?.requestData( 19 | for: resource, 20 | options: options, 21 | dataReceivedHandler: { data in 22 | observable.onNext(data) 23 | }, 24 | completionHandler: { error in 25 | if let error = error { 26 | observable.onError(error) 27 | } else { 28 | observable.onCompleted() 29 | } 30 | }) 31 | 32 | return Disposables.create { 33 | requestId.map { base?.cancelDataRequest($0) } 34 | } 35 | } 36 | } 37 | 38 | public func writeData(for resource: PHAssetResource, 39 | toFile fileURL: URL, 40 | options: PHAssetResourceRequestOptions?) -> Completable { 41 | return Completable.create { [weak base] completable in 42 | base?.writeData(for: resource, toFile: fileURL, options: options) { error in 43 | if let error = error { 44 | completable(.error(error)) 45 | } else { 46 | completable(.completed) 47 | } 48 | } 49 | 50 | return Disposables.create() 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Source/Extensions/PHImageManager+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PHImageManager+Rx.swift 3 | // RxPhotos 4 | // 5 | // Created by Anton Romanov on 01/04/2018. 6 | // Copyright © 2018 Istered. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Photos 11 | import RxSwift 12 | 13 | public extension Reactive where Base: PHImageManager { 14 | public func requestImage(for asset: PHAsset, 15 | targetSize: CGSize, 16 | contentMode: PHImageContentMode, 17 | options: PHImageRequestOptions?) -> Observable { 18 | return Observable.create { [weak base] observable in 19 | 20 | let requestId = base?.requestImage( 21 | for: asset, 22 | targetSize: targetSize, 23 | contentMode: contentMode, 24 | options: options, 25 | resultHandler: { image, info in 26 | if let info = info, let error = RxPhotoError(info: info) { 27 | observable.onError(error) 28 | } else { 29 | observable.onNext(ImageRequestResult(image: image, info: info)) 30 | 31 | if options?.isSynchronous == true || info?[PHImageResultIsDegradedKey] == nil { 32 | observable.onCompleted() 33 | } 34 | } 35 | }) 36 | 37 | return Disposables.create { 38 | requestId.map { base?.cancelImageRequest($0) } 39 | } 40 | } 41 | } 42 | 43 | public func requestAVAsset(forVideo asset: PHAsset, 44 | options: PHVideoRequestOptions?) -> Single { 45 | return Single.create { [weak base] single in 46 | 47 | let requestId = base?.requestAVAsset( 48 | forVideo: asset, 49 | options: options, 50 | resultHandler: { asset, mix, info in 51 | if let info = info, let error = RxPhotoError(info: info) { 52 | single(.error(error)) 53 | } else { 54 | single(.success(AssetRequestResult(asset: asset, audioMix: mix, info: info))) 55 | } 56 | }) 57 | 58 | return Disposables.create { 59 | requestId.map { base?.cancelImageRequest($0) } 60 | } 61 | } 62 | } 63 | 64 | public func requestImageData(for asset: PHAsset, 65 | options: PHImageRequestOptions?) -> Single { 66 | return Single.create { [weak base] single in 67 | 68 | let requestId = base?.requestImageData( 69 | for: asset, 70 | options: options, 71 | resultHandler: { data, UTI, orientation, info in 72 | if let info = info, let error = RxPhotoError(info: info) { 73 | single(.error(error)) 74 | } else { 75 | let result = ImageDataRequestResult(data: data, UTI: UTI, orientation: orientation, info: info) 76 | single(.success(result)) 77 | } 78 | }) 79 | 80 | return Disposables.create { 81 | requestId.map { base?.cancelImageRequest($0) } 82 | } 83 | } 84 | } 85 | 86 | public func requestPlayerItem(forVideo asset: PHAsset, 87 | options: PHVideoRequestOptions?) -> Single { 88 | return Single.create { [weak base] single in 89 | 90 | let requestId = base?.requestPlayerItem( 91 | forVideo: asset, 92 | options: options, 93 | resultHandler: { playerItem, info in 94 | if let info = info, let error = RxPhotoError(info: info) { 95 | single(.error(error)) 96 | } else { 97 | single(.success(PlayerItemRequestResult(playerItem: playerItem, info: info))) 98 | } 99 | }) 100 | 101 | return Disposables.create { 102 | requestId.map { base?.cancelImageRequest($0) } 103 | } 104 | } 105 | } 106 | 107 | public func requestExportSession(forVideo asset: PHAsset, 108 | options: PHVideoRequestOptions?, 109 | exportPreset: String) -> Single { 110 | return Single.create { [weak base] single in 111 | 112 | let requestId = base?.requestExportSession( 113 | forVideo: asset, 114 | options: options, 115 | exportPreset: exportPreset, 116 | resultHandler: { session, info in 117 | if let info = info, let error = RxPhotoError(info: info) { 118 | single(.error(error)) 119 | } else { 120 | single(.success(AssetExportSessionRequestResult(session: session, info: info))) 121 | } 122 | }) 123 | 124 | return Disposables.create { 125 | requestId.map { base?.cancelImageRequest($0) } 126 | } 127 | } 128 | } 129 | 130 | public func requestLivePhoto(for asset: PHAsset, 131 | targetSize: CGSize, 132 | contentMode: PHImageContentMode, 133 | options: PHLivePhotoRequestOptions?) -> Observable { 134 | return Observable.create { [weak base] observable in 135 | 136 | let requestId = base?.requestLivePhoto( 137 | for: asset, 138 | targetSize: targetSize, 139 | contentMode: contentMode, 140 | options: options, 141 | resultHandler: { livePhoto, info in 142 | if let info = info, let error = RxPhotoError(info: info) { 143 | observable.onError(error) 144 | } else { 145 | observable.onNext(LivePhotoRequestResult(livePhoto: livePhoto, info: info)) 146 | 147 | if info?[PHImageResultIsDegradedKey] == nil { 148 | observable.onCompleted() 149 | } 150 | } 151 | }) 152 | 153 | return Disposables.create { 154 | requestId.map { base?.cancelImageRequest($0) } 155 | } 156 | } 157 | } 158 | } 159 | -------------------------------------------------------------------------------- /Source/Extensions/PHLivePhoto+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PHLivePhoto+Rx.swift 3 | // RxPhotos 4 | // 5 | // Created by Anton Romanov on 01/04/2018. 6 | // Copyright © 2018 Istered. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Photos 11 | import RxSwift 12 | 13 | extension Reactive where Base: PHLivePhoto { 14 | public static func request(withResourceFileURLs fileURLs: [URL], 15 | placeholderImage image: UIImage?, 16 | targetSize: CGSize, 17 | contentMode: PHImageContentMode) -> Observable { 18 | return Observable.create { observable in 19 | 20 | let requestId = PHLivePhoto.request( 21 | withResourceFileURLs: fileURLs, 22 | placeholderImage: image, 23 | targetSize: targetSize, 24 | contentMode: contentMode, 25 | resultHandler: { livePhoto, info in 26 | if let error = RxPhotoError(info: info) { 27 | observable.onError(error) 28 | } else { 29 | observable.onNext(LivePhotoRequestResult(livePhoto: livePhoto, info: info)) 30 | 31 | if info[PHLivePhotoInfoIsDegradedKey] == nil { 32 | observable.onCompleted() 33 | } 34 | } 35 | }) 36 | 37 | return Disposables.create { 38 | PHLivePhoto.cancelRequest(withRequestID: requestId) 39 | } 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /Source/Extensions/PHLivePhotoEditingContext+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PHLivePhotoEditingContext+Rx.swift 3 | // RxPhotos 4 | // 5 | // Created by Anton Romanov on 01/04/2018. 6 | // Copyright © 2018 Istered. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Photos 11 | import RxSwift 12 | 13 | extension Reactive where Base: PHLivePhotoEditingContext { 14 | public func saveLivePhoto(to output: PHContentEditingOutput, 15 | options: [String: Any]? = nil) -> Single { 16 | return Single.create { [weak base] single in 17 | base?.saveLivePhoto(to: output, options: options) { result, error in 18 | if let error = error { 19 | single(.error(error)) 20 | } else { 21 | single(.success(result)) 22 | } 23 | } 24 | 25 | return Disposables.create() 26 | } 27 | } 28 | 29 | public func prepareLivePhotoForPlayback(withTargetSize targetSize: CGSize, 30 | options: [String: Any]? = nil) -> Single { 31 | return Single.create { [weak base] single in 32 | base?.prepareLivePhotoForPlayback(withTargetSize: targetSize, options: options) { livePhoto, error in 33 | if let error = error { 34 | single(.error(error)) 35 | } else { 36 | single(.success(LivePhotoRequestResult(livePhoto: livePhoto, info: [:]))) 37 | } 38 | } 39 | 40 | return Disposables.create() 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Source/Extensions/PHPhotoLibrary+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PHPhotoLibrary+Rx.swift 3 | // RxPhotos 4 | // 5 | // Created by Anton Romanov on 01/04/2018. 6 | // Copyright © 2018 Istered. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Photos 11 | import RxSwift 12 | 13 | extension Reactive where Base: PHPhotoLibrary { 14 | public static func requestAuthorization() -> Single { 15 | return Single.create { single in 16 | PHPhotoLibrary.requestAuthorization { status in 17 | single(.success(status)) 18 | } 19 | 20 | return Disposables.create() 21 | } 22 | } 23 | 24 | public func performChanges(_ changeBlock: @escaping () -> Void) -> Single { 25 | return Single.create { [weak base] single in 26 | base?.performChanges(changeBlock) { result, error in 27 | if let error = error { 28 | single(.error(error)) 29 | } else { 30 | single(.success(result)) 31 | } 32 | } 33 | 34 | return Disposables.create() 35 | } 36 | } 37 | 38 | public var photoLibraryChange: Observable { 39 | let changeObserver = RxPHPhotoLibraryObserver() 40 | base.register(changeObserver) 41 | 42 | return Observable.create { [weak base] observable in 43 | changeObserver.changeCallback = observable.onNext 44 | 45 | return Disposables.create { 46 | base?.unregisterChangeObserver(changeObserver) 47 | } 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /Source/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Source/Results/AssetExportSessionRequestResult.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AssetExportSessionRequestResult.swift 3 | // RxPhotos 4 | // 5 | // Created by Anton Romanov on 01/04/2018. 6 | // Copyright © 2018 Istered. All rights reserved. 7 | // 8 | 9 | import AVFoundation 10 | 11 | public struct AssetExportSessionRequestResult { 12 | public let session: AVAssetExportSession? 13 | public let info: [AnyHashable: Any] 14 | 15 | internal init(session: AVAssetExportSession?, info: [AnyHashable: Any]?) { 16 | self.session = session 17 | self.info = info ?? [:] 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Source/Results/AssetRequestResult.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AssetRequestResult.swift 3 | // RxPhotos 4 | // 5 | // Created by Anton Romanov on 01/04/2018. 6 | // Copyright © 2018 Istered. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import AVFoundation 11 | 12 | public struct AssetRequestResult { 13 | public let asset: AVAsset? 14 | public let audioMix: AVAudioMix? 15 | public let info: [AnyHashable: Any] 16 | 17 | internal init(asset: AVAsset?, audioMix: AVAudioMix?, info: [AnyHashable: Any]?) { 18 | self.asset = asset 19 | self.audioMix = audioMix 20 | self.info = info ?? [:] 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Source/Results/ContentEditRequestResult.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentEditRequestResult.swift 3 | // RxPhotos 4 | // 5 | // Created by Anton Romanov on 01/04/2018. 6 | // Copyright © 2018 Istered. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Photos 11 | 12 | public struct ContentEditRequestResult { 13 | public let editingInput: PHContentEditingInput? 14 | public let info: [AnyHashable: Any] 15 | 16 | internal init(editingInput: PHContentEditingInput?, info: [AnyHashable: Any]?) { 17 | self.editingInput = editingInput 18 | self.info = info ?? [:] 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Source/Results/ImageDataRequestResult.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImageDataRequestResult.swift 3 | // RxPhotos 4 | // 5 | // Created by Anton Romanov on 01/04/2018. 6 | // Copyright © 2018 Istered. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public struct ImageDataRequestResult { 12 | public let data: Data? 13 | public let UTI: String? 14 | public let orientation: UIImageOrientation 15 | public let info: [AnyHashable: Any] 16 | 17 | internal init(data: Data?, UTI: String?, orientation: UIImageOrientation, info: [AnyHashable: Any]?) { 18 | self.data = data 19 | self.UTI = UTI 20 | self.orientation = orientation 21 | self.info = info ?? [:] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Source/Results/ImageRequestResult.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImageRequestResult.swift 3 | // RxPhotos 4 | // 5 | // Created by Anton Romanov on 01/04/2018. 6 | // Copyright © 2018 Istered. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public struct ImageRequestResult { 12 | public let image: UIImage? 13 | public let info: [AnyHashable: Any] 14 | 15 | internal init(image: UIImage?, info: [AnyHashable: Any]?) { 16 | self.image = image 17 | self.info = info ?? [:] 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Source/Results/LivePhotoRequestResult.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LivePhotoRequestResult.swift 3 | // RxPhotos 4 | // 5 | // Created by Anton Romanov on 01/04/2018. 6 | // Copyright © 2018 Istered. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Photos 11 | 12 | public struct LivePhotoRequestResult { 13 | public let livePhoto: PHLivePhoto? 14 | public let info: [AnyHashable: Any] 15 | 16 | internal init(livePhoto: PHLivePhoto?, info: [AnyHashable: Any]?) { 17 | self.livePhoto = livePhoto 18 | self.info = info ?? [:] 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Source/Results/PlayerItemRequestResult.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlayerItemRequestResult.swift 3 | // RxPhotos 4 | // 5 | // Created by Anton Romanov on 01/04/2018. 6 | // Copyright © 2018 Istered. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import AVFoundation 11 | 12 | public struct PlayerItemRequestResult { 13 | public let playerItem: AVPlayerItem? 14 | public let info: [AnyHashable: Any] 15 | 16 | internal init(playerItem: AVPlayerItem?, info: [AnyHashable: Any]?) { 17 | self.playerItem = playerItem 18 | self.info = info ?? [:] 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Source/RxPHPhotoLibraryObserver.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxPHPhotoLibraryObserver.swift 3 | // RxPhotos 4 | // 5 | // Created by Anton Romanov on 01/04/2018. 6 | // Copyright © 2018 Istered. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Photos 11 | 12 | internal final class RxPHPhotoLibraryObserver: NSObject, PHPhotoLibraryChangeObserver { 13 | var changeCallback: ((PHChange) -> Void)? 14 | 15 | func photoLibraryDidChange(_ changeInstance: PHChange) { 16 | changeCallback?(changeInstance) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Source/RxPhotoError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxPhotoError.swift 3 | // RxPhotos 4 | // 5 | // Created by Anton Romanov on 01/04/2018. 6 | // Copyright © 2018 Istered. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Photos 11 | 12 | public enum RxPhotoError: Error { 13 | case underlying(NSError, [AnyHashable: Any]) 14 | case cancelled([AnyHashable: Any]) 15 | 16 | init?(info: [AnyHashable: Any]) { 17 | if let error = info[PHImageErrorKey] as? NSError { 18 | self = .underlying(error, info) 19 | } else if let error = info[PHContentEditingInputErrorKey] as? NSError { 20 | self = .underlying(error, info) 21 | } else if let error = info[PHLivePhotoInfoErrorKey] as? NSError { 22 | self = .underlying(error, info) 23 | } else if let canceled = info[PHImageCancelledKey] as? Bool, canceled { 24 | self = .cancelled(info) 25 | } else if let canceled = info[PHContentEditingInputCancelledKey] as? Bool, canceled { 26 | self = .cancelled(info) 27 | } else if let canceled = info[PHLivePhotoInfoCancelledKey] as? Bool, canceled { 28 | self = .cancelled(info) 29 | } else { 30 | return nil 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Source/RxPhotos.h: -------------------------------------------------------------------------------- 1 | // 2 | // RxPhotos.h 3 | // RxPhotos 4 | // 5 | // Created by Anton Romanov on Apr 1, 2018. 6 | // Copyright © 2018 Istered. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for RxPhotos. 12 | FOUNDATION_EXPORT double RxPhotosVersionNumber; 13 | 14 | //! Project version string for RxPhotos. 15 | FOUNDATION_EXPORT const unsigned char RxPhotosVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | -------------------------------------------------------------------------------- /Tests/CheckCocoaPodsQualityIndexes.rb: -------------------------------------------------------------------------------- 1 | #!/bin/ruby 2 | 3 | # 4 | # CheckCocoaPodsQualityIndexes.rb 5 | # by William Entriken, version 1.0.1 6 | # Part of https://github.com/fulldecent/swift3-module-template 7 | # 8 | # The validates that all controllable quality metrics receive maximum score 9 | # from CocoaPods's scoring quality algorithm 10 | # 11 | # Usage: ruby CheckCocoaPodsQualityIndexes.rb PODNAME 12 | # 13 | 14 | require "json" 15 | require "uri" 16 | require "net/http" 17 | 18 | pod_name = ARGV.shift 19 | 20 | puts "Reviewing CocoaPods's quality metrics for #{pod_name}" 21 | puts "Metrics documentation: https://guides.cocoapods.org/making/quality-indexes.html" 22 | puts "Modifiers from: https://cocoadocs-api-cocoapods-org.herokuapp.com/pods/#{pod_name}/stats" 23 | puts "Raw data from: http://metrics.cocoapods.org/api/v1/pods/#{pod_name}" 24 | puts "NOTE: You must pust a new version to CocoaPods to get new metrics!" 25 | puts "" 26 | 27 | uri = URI.parse('https://cocoadocs-api-cocoapods-org.herokuapp.com/pods/FDTake/stats') 28 | http = Net::HTTP.new(uri.host, uri.port) 29 | http.use_ssl = true if uri.scheme == 'https' 30 | request = Net::HTTP::Get.new uri 31 | response = http.request(request) 32 | 33 | if !response.is_a? Net::HTTPOK 34 | puts "HTTP fetching error!" 35 | exit 1 36 | end 37 | 38 | passing = true 39 | for metric in JSON.parse(response.body)['metrics'] 40 | if ['Verified Owner', 'Very Popular', 'Popular'].include? metric['title'] 41 | puts "SKIPPED\tYou cannot control: " + metric['title'] 42 | next 43 | end 44 | if metric['modifier'] >= 0 45 | if metric['applies_for_pod'] 46 | puts "GOOD\tEarned points for: " + metric['title'] 47 | else 48 | puts "BAD\tMissed points for: " + metric['title'] 49 | passing = false 50 | end 51 | else 52 | if metric['applies_for_pod'] 53 | puts "BAD\tLost points for: " + metric['title'] 54 | passing = false 55 | else 56 | puts "GOOD\tAvoided penalty for: " + metric['title'] 57 | end 58 | end 59 | end 60 | 61 | exit passing ? 0 : 1 62 | -------------------------------------------------------------------------------- /Tests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Tests/RxPhotosTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxPhotosTests.swift 3 | // RxPhotosTests 4 | // 5 | // Created by Anton Romanov on Apr 1, 2018. 6 | // Copyright © 2018 Istered. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import RxPhotos 11 | 12 | class RxPhotosTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testExample() { 25 | // This is an example of a functional test case. 26 | // Use XCTAssert and related functions to verify your tests produce the correct results. 27 | } 28 | 29 | func testPerformanceExample() { 30 | // This is an example of a performance test case. 31 | self.measure { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /iOS Example/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | target 'iOS Example' do 5 | # Comment the next line if you're not using Swift and don't want to use dynamic frameworks 6 | use_frameworks! 7 | inhibit_all_warnings! 8 | 9 | # Pods for iOS Example 10 | 11 | pod 'RxSwift' 12 | pod 'RxPhotos', :path => '../' 13 | 14 | end 15 | -------------------------------------------------------------------------------- /iOS Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - RxPhotos (1.0.1): 3 | - RxSwift (~> 4.0) 4 | - RxSwift (4.1.2) 5 | 6 | DEPENDENCIES: 7 | - RxPhotos (from `../`) 8 | - RxSwift 9 | 10 | EXTERNAL SOURCES: 11 | RxPhotos: 12 | :path: ../ 13 | 14 | SPEC CHECKSUMS: 15 | RxPhotos: 710c60c216ee3a190c56e106e455ccffcad90728 16 | RxSwift: e49536837d9901277638493ea537394d4b55f570 17 | 18 | PODFILE CHECKSUM: 9493d17dfd137cfdb314e89b1e6a055719f2cab0 19 | 20 | COCOAPODS: 1.4.0 21 | -------------------------------------------------------------------------------- /iOS Example/Source/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // iOS Example 4 | // 5 | // Created by Anton Romanov on Apr 1, 2018. 6 | // Copyright © 2018 Istered. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | func application(_ application: UIApplication, 17 | didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 18 | return true 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /iOS Example/Source/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "ipad", 35 | "size" : "29x29", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "29x29", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "40x40", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "40x40", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "76x76", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "76x76", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /iOS Example/Source/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /iOS Example/Source/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /iOS Example/Source/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | NSPhotoLibraryUsageDescription 38 | NSPhotoLibraryUsageDescription 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /iOS Example/Source/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // iOS Example 4 | // 5 | // Created by Anton Romanov on Apr 1, 2018. 6 | // Copyright © 2018 Istered. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Photos 11 | import RxPhotos 12 | 13 | class ViewController: UIViewController { 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | } 17 | 18 | override func didReceiveMemoryWarning() { 19 | super.didReceiveMemoryWarning() 20 | // Dispose of any resources that can be recreated. 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /iOS Example/iOS Example.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | D5804E1B2E809BF6E2B5A46A /* Pods_iOS_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FE191D22C636AA4903C39027 /* Pods_iOS_Example.framework */; }; 11 | D93F1CC41EAEDD3F009A7474 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D93F1CC31EAEDD3F009A7474 /* AppDelegate.swift */; }; 12 | D93F1CC61EAEDD3F009A7474 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D93F1CC51EAEDD3F009A7474 /* ViewController.swift */; }; 13 | D93F1CC91EAEDD3F009A7474 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D93F1CC71EAEDD3F009A7474 /* Main.storyboard */; }; 14 | D93F1CCB1EAEDD3F009A7474 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D93F1CCA1EAEDD3F009A7474 /* Assets.xcassets */; }; 15 | D93F1CCE1EAEDD3F009A7474 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D93F1CCC1EAEDD3F009A7474 /* LaunchScreen.storyboard */; }; 16 | D93F1CD71EAEE00D009A7474 /* RxPhotos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D93F1CD61EAEE00D009A7474 /* RxPhotos.framework */; }; 17 | /* End PBXBuildFile section */ 18 | 19 | /* Begin PBXFileReference section */ 20 | 148A4FB781A2EEFCB71A4FD3 /* Pods-iOS Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iOS Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-iOS Example/Pods-iOS Example.debug.xcconfig"; sourceTree = ""; }; 21 | 25AB3BD9BC45DF89B95328D8 /* Pods-iOS Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iOS Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-iOS Example/Pods-iOS Example.release.xcconfig"; sourceTree = ""; }; 22 | D93F1CC01EAEDD3F009A7474 /* iOS Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "iOS Example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 23 | D93F1CC31EAEDD3F009A7474 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 24 | D93F1CC51EAEDD3F009A7474 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 25 | D93F1CC81EAEDD3F009A7474 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 26 | D93F1CCA1EAEDD3F009A7474 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 27 | D93F1CCD1EAEDD3F009A7474 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 28 | D93F1CCF1EAEDD3F009A7474 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 29 | D93F1CD61EAEE00D009A7474 /* RxPhotos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxPhotos.framework; path = "../../../Library/Developer/Xcode/DerivedData/RxPhotos-ghiobiksiyymbygbpisckcynbsdi/Build/Products/Debug-iphonesimulator/RxPhotos.framework"; sourceTree = ""; }; 30 | DDC0E782207128A80051A0DB /* Pods_RxPhotos.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Pods_RxPhotos.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 31 | DDC0E784207128B20051A0DB /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 32 | FE191D22C636AA4903C39027 /* Pods_iOS_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_iOS_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 33 | /* End PBXFileReference section */ 34 | 35 | /* Begin PBXFrameworksBuildPhase section */ 36 | D93F1CBD1EAEDD3F009A7474 /* Frameworks */ = { 37 | isa = PBXFrameworksBuildPhase; 38 | buildActionMask = 2147483647; 39 | files = ( 40 | D93F1CD71EAEE00D009A7474 /* RxPhotos.framework in Frameworks */, 41 | D5804E1B2E809BF6E2B5A46A /* Pods_iOS_Example.framework in Frameworks */, 42 | ); 43 | runOnlyForDeploymentPostprocessing = 0; 44 | }; 45 | /* End PBXFrameworksBuildPhase section */ 46 | 47 | /* Begin PBXGroup section */ 48 | CDF8342396C13850FE2A671B /* Pods */ = { 49 | isa = PBXGroup; 50 | children = ( 51 | 148A4FB781A2EEFCB71A4FD3 /* Pods-iOS Example.debug.xcconfig */, 52 | 25AB3BD9BC45DF89B95328D8 /* Pods-iOS Example.release.xcconfig */, 53 | ); 54 | name = Pods; 55 | sourceTree = ""; 56 | }; 57 | D93F1CB71EAEDD3F009A7474 = { 58 | isa = PBXGroup; 59 | children = ( 60 | D93F1CC21EAEDD3F009A7474 /* Source */, 61 | D93F1CC11EAEDD3F009A7474 /* Products */, 62 | D93F1CD51EAEE00D009A7474 /* Frameworks */, 63 | CDF8342396C13850FE2A671B /* Pods */, 64 | ); 65 | sourceTree = ""; 66 | }; 67 | D93F1CC11EAEDD3F009A7474 /* Products */ = { 68 | isa = PBXGroup; 69 | children = ( 70 | D93F1CC01EAEDD3F009A7474 /* iOS Example.app */, 71 | ); 72 | name = Products; 73 | sourceTree = ""; 74 | }; 75 | D93F1CC21EAEDD3F009A7474 /* Source */ = { 76 | isa = PBXGroup; 77 | children = ( 78 | D93F1CC31EAEDD3F009A7474 /* AppDelegate.swift */, 79 | D93F1CC51EAEDD3F009A7474 /* ViewController.swift */, 80 | D93F1CC71EAEDD3F009A7474 /* Main.storyboard */, 81 | D93F1CCA1EAEDD3F009A7474 /* Assets.xcassets */, 82 | D93F1CCC1EAEDD3F009A7474 /* LaunchScreen.storyboard */, 83 | D93F1CCF1EAEDD3F009A7474 /* Info.plist */, 84 | ); 85 | path = Source; 86 | sourceTree = ""; 87 | }; 88 | D93F1CD51EAEE00D009A7474 /* Frameworks */ = { 89 | isa = PBXGroup; 90 | children = ( 91 | DDC0E784207128B20051A0DB /* RxSwift.framework */, 92 | DDC0E782207128A80051A0DB /* Pods_RxPhotos.framework */, 93 | D93F1CD61EAEE00D009A7474 /* RxPhotos.framework */, 94 | FE191D22C636AA4903C39027 /* Pods_iOS_Example.framework */, 95 | ); 96 | name = Frameworks; 97 | sourceTree = ""; 98 | }; 99 | /* End PBXGroup section */ 100 | 101 | /* Begin PBXNativeTarget section */ 102 | D93F1CBF1EAEDD3F009A7474 /* iOS Example */ = { 103 | isa = PBXNativeTarget; 104 | buildConfigurationList = D93F1CD21EAEDD3F009A7474 /* Build configuration list for PBXNativeTarget "iOS Example" */; 105 | buildPhases = ( 106 | 05C5CDBDF1705D2ABABCB014 /* [CP] Check Pods Manifest.lock */, 107 | D93F1CBC1EAEDD3F009A7474 /* Sources */, 108 | D93F1CBD1EAEDD3F009A7474 /* Frameworks */, 109 | D93F1CBE1EAEDD3F009A7474 /* Resources */, 110 | 2FF06A3F132418FE19A0BB86 /* [CP] Embed Pods Frameworks */, 111 | FB8FCED89FEE1B5FFE22F548 /* [CP] Copy Pods Resources */, 112 | ); 113 | buildRules = ( 114 | ); 115 | dependencies = ( 116 | ); 117 | name = "iOS Example"; 118 | productName = "iOS Example"; 119 | productReference = D93F1CC01EAEDD3F009A7474 /* iOS Example.app */; 120 | productType = "com.apple.product-type.application"; 121 | }; 122 | /* End PBXNativeTarget section */ 123 | 124 | /* Begin PBXProject section */ 125 | D93F1CB81EAEDD3F009A7474 /* Project object */ = { 126 | isa = PBXProject; 127 | attributes = { 128 | LastSwiftUpdateCheck = 0830; 129 | LastUpgradeCheck = 0930; 130 | ORGANIZATIONNAME = Istered; 131 | TargetAttributes = { 132 | D93F1CBF1EAEDD3F009A7474 = { 133 | CreatedOnToolsVersion = 8.3.2; 134 | LastSwiftMigration = 0930; 135 | ProvisioningStyle = Automatic; 136 | }; 137 | }; 138 | }; 139 | buildConfigurationList = D93F1CBB1EAEDD3F009A7474 /* Build configuration list for PBXProject "iOS Example" */; 140 | compatibilityVersion = "Xcode 3.2"; 141 | developmentRegion = English; 142 | hasScannedForEncodings = 0; 143 | knownRegions = ( 144 | en, 145 | Base, 146 | ); 147 | mainGroup = D93F1CB71EAEDD3F009A7474; 148 | productRefGroup = D93F1CC11EAEDD3F009A7474 /* Products */; 149 | projectDirPath = ""; 150 | projectRoot = ""; 151 | targets = ( 152 | D93F1CBF1EAEDD3F009A7474 /* iOS Example */, 153 | ); 154 | }; 155 | /* End PBXProject section */ 156 | 157 | /* Begin PBXResourcesBuildPhase section */ 158 | D93F1CBE1EAEDD3F009A7474 /* Resources */ = { 159 | isa = PBXResourcesBuildPhase; 160 | buildActionMask = 2147483647; 161 | files = ( 162 | D93F1CCE1EAEDD3F009A7474 /* LaunchScreen.storyboard in Resources */, 163 | D93F1CCB1EAEDD3F009A7474 /* Assets.xcassets in Resources */, 164 | D93F1CC91EAEDD3F009A7474 /* Main.storyboard in Resources */, 165 | ); 166 | runOnlyForDeploymentPostprocessing = 0; 167 | }; 168 | /* End PBXResourcesBuildPhase section */ 169 | 170 | /* Begin PBXShellScriptBuildPhase section */ 171 | 05C5CDBDF1705D2ABABCB014 /* [CP] Check Pods Manifest.lock */ = { 172 | isa = PBXShellScriptBuildPhase; 173 | buildActionMask = 2147483647; 174 | files = ( 175 | ); 176 | inputPaths = ( 177 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 178 | "${PODS_ROOT}/Manifest.lock", 179 | ); 180 | name = "[CP] Check Pods Manifest.lock"; 181 | outputPaths = ( 182 | "$(DERIVED_FILE_DIR)/Pods-iOS Example-checkManifestLockResult.txt", 183 | ); 184 | runOnlyForDeploymentPostprocessing = 0; 185 | shellPath = /bin/sh; 186 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 187 | showEnvVarsInLog = 0; 188 | }; 189 | 2FF06A3F132418FE19A0BB86 /* [CP] Embed Pods Frameworks */ = { 190 | isa = PBXShellScriptBuildPhase; 191 | buildActionMask = 2147483647; 192 | files = ( 193 | ); 194 | inputPaths = ( 195 | "${SRCROOT}/Pods/Target Support Files/Pods-iOS Example/Pods-iOS Example-frameworks.sh", 196 | "${BUILT_PRODUCTS_DIR}/RxPhotos/RxPhotos.framework", 197 | "${BUILT_PRODUCTS_DIR}/RxSwift/RxSwift.framework", 198 | ); 199 | name = "[CP] Embed Pods Frameworks"; 200 | outputPaths = ( 201 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxPhotos.framework", 202 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxSwift.framework", 203 | ); 204 | runOnlyForDeploymentPostprocessing = 0; 205 | shellPath = /bin/sh; 206 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-iOS Example/Pods-iOS Example-frameworks.sh\"\n"; 207 | showEnvVarsInLog = 0; 208 | }; 209 | FB8FCED89FEE1B5FFE22F548 /* [CP] Copy Pods Resources */ = { 210 | isa = PBXShellScriptBuildPhase; 211 | buildActionMask = 2147483647; 212 | files = ( 213 | ); 214 | inputPaths = ( 215 | ); 216 | name = "[CP] Copy Pods Resources"; 217 | outputPaths = ( 218 | ); 219 | runOnlyForDeploymentPostprocessing = 0; 220 | shellPath = /bin/sh; 221 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-iOS Example/Pods-iOS Example-resources.sh\"\n"; 222 | showEnvVarsInLog = 0; 223 | }; 224 | /* End PBXShellScriptBuildPhase section */ 225 | 226 | /* Begin PBXSourcesBuildPhase section */ 227 | D93F1CBC1EAEDD3F009A7474 /* Sources */ = { 228 | isa = PBXSourcesBuildPhase; 229 | buildActionMask = 2147483647; 230 | files = ( 231 | D93F1CC61EAEDD3F009A7474 /* ViewController.swift in Sources */, 232 | D93F1CC41EAEDD3F009A7474 /* AppDelegate.swift in Sources */, 233 | ); 234 | runOnlyForDeploymentPostprocessing = 0; 235 | }; 236 | /* End PBXSourcesBuildPhase section */ 237 | 238 | /* Begin PBXVariantGroup section */ 239 | D93F1CC71EAEDD3F009A7474 /* Main.storyboard */ = { 240 | isa = PBXVariantGroup; 241 | children = ( 242 | D93F1CC81EAEDD3F009A7474 /* Base */, 243 | ); 244 | name = Main.storyboard; 245 | sourceTree = ""; 246 | }; 247 | D93F1CCC1EAEDD3F009A7474 /* LaunchScreen.storyboard */ = { 248 | isa = PBXVariantGroup; 249 | children = ( 250 | D93F1CCD1EAEDD3F009A7474 /* Base */, 251 | ); 252 | name = LaunchScreen.storyboard; 253 | sourceTree = ""; 254 | }; 255 | /* End PBXVariantGroup section */ 256 | 257 | /* Begin XCBuildConfiguration section */ 258 | D93F1CD01EAEDD3F009A7474 /* Debug */ = { 259 | isa = XCBuildConfiguration; 260 | buildSettings = { 261 | ALWAYS_SEARCH_USER_PATHS = NO; 262 | CLANG_ANALYZER_NONNULL = YES; 263 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 264 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 265 | CLANG_CXX_LIBRARY = "libc++"; 266 | CLANG_ENABLE_MODULES = YES; 267 | CLANG_ENABLE_OBJC_ARC = YES; 268 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 269 | CLANG_WARN_BOOL_CONVERSION = YES; 270 | CLANG_WARN_COMMA = YES; 271 | CLANG_WARN_CONSTANT_CONVERSION = YES; 272 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 273 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 274 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 275 | CLANG_WARN_EMPTY_BODY = YES; 276 | CLANG_WARN_ENUM_CONVERSION = YES; 277 | CLANG_WARN_INFINITE_RECURSION = YES; 278 | CLANG_WARN_INT_CONVERSION = YES; 279 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 280 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 281 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 282 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 283 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 284 | CLANG_WARN_STRICT_PROTOTYPES = YES; 285 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 286 | CLANG_WARN_UNREACHABLE_CODE = YES; 287 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 288 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 289 | COPY_PHASE_STRIP = NO; 290 | DEBUG_INFORMATION_FORMAT = dwarf; 291 | ENABLE_STRICT_OBJC_MSGSEND = YES; 292 | ENABLE_TESTABILITY = YES; 293 | GCC_C_LANGUAGE_STANDARD = gnu99; 294 | GCC_DYNAMIC_NO_PIC = NO; 295 | GCC_NO_COMMON_BLOCKS = YES; 296 | GCC_OPTIMIZATION_LEVEL = 0; 297 | GCC_PREPROCESSOR_DEFINITIONS = ( 298 | "DEBUG=1", 299 | "$(inherited)", 300 | ); 301 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 302 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 303 | GCC_WARN_UNDECLARED_SELECTOR = YES; 304 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 305 | GCC_WARN_UNUSED_FUNCTION = YES; 306 | GCC_WARN_UNUSED_VARIABLE = YES; 307 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 308 | MTL_ENABLE_DEBUG_INFO = YES; 309 | ONLY_ACTIVE_ARCH = YES; 310 | SDKROOT = iphoneos; 311 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 312 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 313 | TARGETED_DEVICE_FAMILY = "1,2"; 314 | }; 315 | name = Debug; 316 | }; 317 | D93F1CD11EAEDD3F009A7474 /* Release */ = { 318 | isa = XCBuildConfiguration; 319 | buildSettings = { 320 | ALWAYS_SEARCH_USER_PATHS = NO; 321 | CLANG_ANALYZER_NONNULL = YES; 322 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 323 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 324 | CLANG_CXX_LIBRARY = "libc++"; 325 | CLANG_ENABLE_MODULES = YES; 326 | CLANG_ENABLE_OBJC_ARC = YES; 327 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 328 | CLANG_WARN_BOOL_CONVERSION = YES; 329 | CLANG_WARN_COMMA = YES; 330 | CLANG_WARN_CONSTANT_CONVERSION = YES; 331 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 332 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 333 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 334 | CLANG_WARN_EMPTY_BODY = YES; 335 | CLANG_WARN_ENUM_CONVERSION = YES; 336 | CLANG_WARN_INFINITE_RECURSION = YES; 337 | CLANG_WARN_INT_CONVERSION = YES; 338 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 339 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 340 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 341 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 342 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 343 | CLANG_WARN_STRICT_PROTOTYPES = YES; 344 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 345 | CLANG_WARN_UNREACHABLE_CODE = YES; 346 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 347 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 348 | COPY_PHASE_STRIP = NO; 349 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 350 | ENABLE_NS_ASSERTIONS = NO; 351 | ENABLE_STRICT_OBJC_MSGSEND = YES; 352 | GCC_C_LANGUAGE_STANDARD = gnu99; 353 | GCC_NO_COMMON_BLOCKS = YES; 354 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 355 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 356 | GCC_WARN_UNDECLARED_SELECTOR = YES; 357 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 358 | GCC_WARN_UNUSED_FUNCTION = YES; 359 | GCC_WARN_UNUSED_VARIABLE = YES; 360 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 361 | MTL_ENABLE_DEBUG_INFO = NO; 362 | SDKROOT = iphoneos; 363 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 364 | TARGETED_DEVICE_FAMILY = "1,2"; 365 | VALIDATE_PRODUCT = YES; 366 | }; 367 | name = Release; 368 | }; 369 | D93F1CD31EAEDD3F009A7474 /* Debug */ = { 370 | isa = XCBuildConfiguration; 371 | baseConfigurationReference = 148A4FB781A2EEFCB71A4FD3 /* Pods-iOS Example.debug.xcconfig */; 372 | buildSettings = { 373 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 374 | DEVELOPMENT_TEAM = ""; 375 | INFOPLIST_FILE = Source/Info.plist; 376 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 377 | PRODUCT_BUNDLE_IDENTIFIER = "com.istered.iOS-Example"; 378 | PRODUCT_NAME = "$(TARGET_NAME)"; 379 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 380 | SWIFT_VERSION = 4.0; 381 | }; 382 | name = Debug; 383 | }; 384 | D93F1CD41EAEDD3F009A7474 /* Release */ = { 385 | isa = XCBuildConfiguration; 386 | baseConfigurationReference = 25AB3BD9BC45DF89B95328D8 /* Pods-iOS Example.release.xcconfig */; 387 | buildSettings = { 388 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 389 | DEVELOPMENT_TEAM = ""; 390 | INFOPLIST_FILE = Source/Info.plist; 391 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 392 | PRODUCT_BUNDLE_IDENTIFIER = "com.istered.iOS-Example"; 393 | PRODUCT_NAME = "$(TARGET_NAME)"; 394 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 395 | SWIFT_VERSION = 4.0; 396 | }; 397 | name = Release; 398 | }; 399 | /* End XCBuildConfiguration section */ 400 | 401 | /* Begin XCConfigurationList section */ 402 | D93F1CBB1EAEDD3F009A7474 /* Build configuration list for PBXProject "iOS Example" */ = { 403 | isa = XCConfigurationList; 404 | buildConfigurations = ( 405 | D93F1CD01EAEDD3F009A7474 /* Debug */, 406 | D93F1CD11EAEDD3F009A7474 /* Release */, 407 | ); 408 | defaultConfigurationIsVisible = 0; 409 | defaultConfigurationName = Release; 410 | }; 411 | D93F1CD21EAEDD3F009A7474 /* Build configuration list for PBXNativeTarget "iOS Example" */ = { 412 | isa = XCConfigurationList; 413 | buildConfigurations = ( 414 | D93F1CD31EAEDD3F009A7474 /* Debug */, 415 | D93F1CD41EAEDD3F009A7474 /* Release */, 416 | ); 417 | defaultConfigurationIsVisible = 0; 418 | defaultConfigurationName = Release; 419 | }; 420 | /* End XCConfigurationList section */ 421 | }; 422 | rootObject = D93F1CB81EAEDD3F009A7474 /* Project object */; 423 | } 424 | -------------------------------------------------------------------------------- /iOS Example/iOS Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /iOS Example/iOS Example.xcodeproj/xcshareddata/xcschemes/iOS Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /iOS Example/iOS Example.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /iOS Example/iOS Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | --------------------------------------------------------------------------------