├── SelectVideoAndConvert ├── GCMImagePicker │ ├── add_01@2x.png │ ├── add_01@3x.png │ ├── GCMImagePickerController.h │ ├── GCMCollectionViewController.h │ ├── GCMGroupCell.h │ ├── GCMAssetsGroupController.h │ ├── GCMAssetModel.h │ ├── GCMGroupCell.m │ ├── GCMImagePickerController.m │ ├── GCMAssetsGroupController.m │ ├── GCMAssetModel.m │ └── GCMCollectionViewController.m ├── ViewController.h ├── AppDelegate.h ├── main.m ├── Assets.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json ├── Base.lproj │ ├── Main.storyboard │ └── LaunchScreen.storyboard ├── Info.plist ├── ViewController.m └── AppDelegate.m ├── SelectVideoAndConvert.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── macavilang.xcuserdatad │ │ └── UserInterfaceState.xcuserstate ├── xcuserdata │ └── macavilang.xcuserdatad │ │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ └── SelectVideoAndConvert.xcscheme └── project.pbxproj ├── SelectVideoAndConvertTests ├── Info.plist └── SelectVideoAndConvertTests.m ├── SelectVideoAndConvertUITests ├── Info.plist └── SelectVideoAndConvertUITests.m └── README.md /SelectVideoAndConvert/GCMImagePicker/add_01@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Snoopy008/SelectVideoAndConvert/HEAD/SelectVideoAndConvert/GCMImagePicker/add_01@2x.png -------------------------------------------------------------------------------- /SelectVideoAndConvert/GCMImagePicker/add_01@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Snoopy008/SelectVideoAndConvert/HEAD/SelectVideoAndConvert/GCMImagePicker/add_01@3x.png -------------------------------------------------------------------------------- /SelectVideoAndConvert.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /SelectVideoAndConvert.xcodeproj/project.xcworkspace/xcuserdata/macavilang.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Snoopy008/SelectVideoAndConvert/HEAD/SelectVideoAndConvert.xcodeproj/project.xcworkspace/xcuserdata/macavilang.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /SelectVideoAndConvert/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // SelectVideoAndConvert 4 | // 5 | // Created by macavilang on 16/7/4. 6 | // Copyright © 2016年 Snoopy. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /SelectVideoAndConvert/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // SelectVideoAndConvert 4 | // 5 | // Created by macavilang on 16/7/4. 6 | // Copyright © 2016年 Snoopy. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /SelectVideoAndConvert/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // SelectVideoAndConvert 4 | // 5 | // Created by macavilang on 16/7/4. 6 | // Copyright © 2016年 Snoopy. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /SelectVideoAndConvert/GCMImagePicker/GCMImagePickerController.h: -------------------------------------------------------------------------------- 1 | // 2 | // GCMImagePickerController.h 3 | // SelectMediumFile 4 | // 5 | // Created by macavilang on 16/6/28. 6 | // Copyright © 2016年 Snoopy. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface GCMImagePickerController : UINavigationController 12 | 13 | @property (nonatomic,copy) void(^didFinishSelectImageModels)(NSMutableArray *models); 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /SelectVideoAndConvert/GCMImagePicker/GCMCollectionViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // GCMCollectionViewController.h 3 | // SelectMediumFile 4 | // 5 | // Created by macavilang on 16/6/28. 6 | // Copyright © 2016年 Snoopy. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class ALAssetsGroup; 12 | @interface GCMCollectionViewController : UICollectionViewController 13 | 14 | @property (nonatomic,strong) ALAssetsGroup *group; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /SelectVideoAndConvert/GCMImagePicker/GCMGroupCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // GCMGroupCell.h 3 | // SelectMediumFile 4 | // 5 | // Created by macavilang on 16/6/28. 6 | // Copyright © 2016年 Snoopy. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface GCMGroupCell : UITableViewCell 13 | 14 | @property (nonatomic,strong) ALAssetsGroup *group; 15 | + (instancetype)groupCell:(UITableView *)tableView; 16 | @end 17 | -------------------------------------------------------------------------------- /SelectVideoAndConvert/GCMImagePicker/GCMAssetsGroupController.h: -------------------------------------------------------------------------------- 1 | // 2 | // GCMAssetsGroupController.h 3 | // SelectMediumFile 4 | // 5 | // Created by macavilang on 16/6/28. 6 | // Copyright © 2016年 Snoopy. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class ALAssetsLibrary; 12 | @interface GCMAssetsGroupController : UITableViewController 13 | 14 | @property (nonatomic,strong) ALAssetsLibrary *assetsLibrary; 15 | @property (nonatomic,strong) NSMutableArray *groups; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /SelectVideoAndConvert/GCMImagePicker/GCMAssetModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // GCMAssetModel.h 3 | // SelectMediumFile 4 | // 5 | // Created by macavilang on 16/6/28. 6 | // Copyright © 2016年 Snoopy. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface GCMAssetModel : NSObject 12 | 13 | @property (nonatomic,strong) UIImage *thumbnail;//缩略图 14 | @property (nonatomic,copy) NSURL *imageURL;//原图url,是AssetURL 15 | @property (nonatomic,assign) BOOL isSelected;//是否被选中 16 | 17 | @property (nonatomic,assign) BOOL isImage;//是否是图片 18 | @property (nonatomic,copy) NSString *sandboxPath;//文件存储在本地的路径 19 | @property (nonatomic,copy) NSString *fileName;//文件名 20 | @property (nonatomic,copy) NSData *fileData;//文件的NSData 21 | - (void)originalImage:(void (^)(UIImage *image))returnImage;//获取原图 22 | 23 | - (void) convertVideoWithModel:(GCMAssetModel *) model; 24 | @end 25 | -------------------------------------------------------------------------------- /SelectVideoAndConvertTests/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 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /SelectVideoAndConvertUITests/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 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /SelectVideoAndConvert.xcodeproj/xcuserdata/macavilang.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | SelectVideoAndConvert.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 4A4799121D2A5FEC0037A9DD 16 | 17 | primary 18 | 19 | 20 | 4A47992B1D2A5FEC0037A9DD 21 | 22 | primary 23 | 24 | 25 | 4A4799361D2A5FEC0037A9DD 26 | 27 | primary 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /SelectVideoAndConvertTests/SelectVideoAndConvertTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // SelectVideoAndConvertTests.m 3 | // SelectVideoAndConvertTests 4 | // 5 | // Created by macavilang on 16/7/4. 6 | // Copyright © 2016年 Snoopy. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface SelectVideoAndConvertTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation SelectVideoAndConvertTests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | // Put setup code here. This method is called before the invocation of each test method in the class. 20 | } 21 | 22 | - (void)tearDown { 23 | // Put teardown code here. This method is called after the invocation of each test method in the class. 24 | [super tearDown]; 25 | } 26 | 27 | - (void)testExample { 28 | // This is an example of a functional test case. 29 | // Use XCTAssert and related functions to verify your tests produce the correct results. 30 | } 31 | 32 | - (void)testPerformanceExample { 33 | // This is an example of a performance test case. 34 | [self measureBlock:^{ 35 | // Put the code you want to measure the time of here. 36 | }]; 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /SelectVideoAndConvert/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 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SelectVideoAndConvert 2 | 3 | Sorry,一直没来得及写说明文档,导致加了很多同行的QQ。 4 | 5 | 6 | 运行demo后你会发现界面一片空白,这是正常的。我用的触发方法是touchesBegan,所以你只需点击空白界面就会有反应。 7 | 8 | 每个人的需求会不一样,这也是我没把它做成framework的原因 9 | 10 | 在GCMGroupCell.m里,allAssets代表所有相册文件,allPhotos代表所有图片,allVideos代表所有视频 11 | ``` 12 | [group setAssetsFilter:[ALAssetsFilter allAssets]]; 13 | ``` 14 | 在GCMCollectionViewController.m里,只需要注意这个方法,根据需要把对应的注释掉 15 | ``` 16 | - (void)setGroup:(ALAssetsGroup *)group{ 17 | _group = group; 18 | [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop) { 19 | if (asset == nil) return ; 20 | GCMAssetModel *model = [[GCMAssetModel alloc] init]; 21 | if (![[asset valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) {//不是图片 22 | model.thumbnail = [UIImage imageWithCGImage:asset.thumbnail]; 23 | model.imageURL = asset.defaultRepresentation.url; 24 | model.isImage = NO; 25 | [self.assetModels addObject:model]; 26 | }else{//图片 27 | model.thumbnail = [UIImage imageWithCGImage:asset.thumbnail]; 28 | model.imageURL = asset.defaultRepresentation.url; 29 | model.isImage = YES; 30 | [self.assetModels addObject:model]; 31 | } 32 | }]; 33 | 34 | } 35 | ``` 36 | 视频压缩部分我就不做解说了,简书上对应有所说明 37 | 38 | 注:视频上传部分代码里没有,不过我已经将你所需要上传data放在Model里了,你拿着Model和接口对接一下就可以了。 39 | 请使用真机调试。 40 |   请认真看本人简书里《iOS存储之沙盒存储常用方法》这篇文章,这篇文章与这个功能的实现有莫大的关系,所以请务必要看。 41 | 42 | -------------------------------------------------------------------------------- /SelectVideoAndConvertUITests/SelectVideoAndConvertUITests.m: -------------------------------------------------------------------------------- 1 | // 2 | // SelectVideoAndConvertUITests.m 3 | // SelectVideoAndConvertUITests 4 | // 5 | // Created by macavilang on 16/7/4. 6 | // Copyright © 2016年 Snoopy. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface SelectVideoAndConvertUITests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation SelectVideoAndConvertUITests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | 22 | // In UI tests it is usually best to stop immediately when a failure occurs. 23 | self.continueAfterFailure = NO; 24 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. 25 | [[[XCUIApplication alloc] init] launch]; 26 | 27 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 28 | } 29 | 30 | - (void)tearDown { 31 | // Put teardown code here. This method is called after the invocation of each test method in the class. 32 | [super tearDown]; 33 | } 34 | 35 | - (void)testExample { 36 | // Use recording to get started writing UI tests. 37 | // Use XCTAssert and related functions to verify your tests produce the correct results. 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /SelectVideoAndConvert/Base.lproj/Main.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 | -------------------------------------------------------------------------------- /SelectVideoAndConvert/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 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /SelectVideoAndConvert/GCMImagePicker/GCMGroupCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // GCMGroupCell.m 3 | // SelectMediumFile 4 | // 5 | // Created by macavilang on 16/6/28. 6 | // Copyright © 2016年 Snoopy. All rights reserved. 7 | // 8 | 9 | #import "GCMGroupCell.h" 10 | #define MARGIN 10 11 | 12 | @implementation GCMGroupCell 13 | 14 | + (instancetype)groupCell:(UITableView *)tableView{ 15 | NSString *reusedId = @"groupCell"; 16 | GCMGroupCell *cell = [tableView dequeueReusableCellWithIdentifier:reusedId]; 17 | if (cell == nil) { 18 | cell = [[self alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reusedId]; 19 | } 20 | return cell; 21 | } 22 | - (void)setGroup:(ALAssetsGroup *)group{ 23 | //中文 24 | NSString *groupName = [group valueForProperty:ALAssetsGroupPropertyName]; 25 | if ([groupName isEqualToString:@"Camera Roll"]) { 26 | groupName = @"相机"; 27 | } else if ([groupName isEqualToString:@"My Photo Stream"]) { 28 | groupName = @"我的照片"; 29 | } 30 | //设置属性 31 | 32 | 33 | [group setAssetsFilter:[ALAssetsFilter allVideos]];//这里区分是所有相册文件还是图片或视频 34 | 35 | 36 | 37 | NSInteger groupCount = [group numberOfAssets]; 38 | self.textLabel.text = [NSString stringWithFormat:@"%@ (%ld)",groupName, (long)groupCount]; 39 | UIImage *image =[UIImage imageWithCGImage:group.posterImage] ; 40 | [self.imageView setImage:image]; 41 | self.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 42 | } 43 | 44 | 45 | - (void)layoutSubviews{ 46 | [super layoutSubviews]; 47 | CGFloat cellHeight = self.frame.size.height - 2 * MARGIN; 48 | self.imageView.frame = CGRectMake(MARGIN, MARGIN, cellHeight, cellHeight); 49 | } 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /SelectVideoAndConvert/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 | -------------------------------------------------------------------------------- /SelectVideoAndConvert/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // SelectVideoAndConvert 4 | // 5 | // Created by macavilang on 16/7/4. 6 | // Copyright © 2016年 Snoopy. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | #import "GCMImagePickerController.h" 11 | #import "GCMAssetModel.h" 12 | 13 | //生成随机数 14 | #define RandomNum (arc4random() % 9999999999999999) 15 | 16 | @interface ViewController () 17 | 18 | @end 19 | 20 | @implementation ViewController 21 | { 22 | NSMutableArray *videoModelArray; 23 | } 24 | 25 | - (void)viewDidLoad { 26 | [super viewDidLoad]; 27 | // Do any additional setup after loading the view, typically from a nib. 28 | videoModelArray = [NSMutableArray array]; 29 | } 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | //触发方法 39 | - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 40 | GCMImagePickerController *picker = [[GCMImagePickerController alloc] init]; 41 | //返回选中的原图 42 | [picker setDidFinishSelectImageModels:^(NSMutableArray *models) { 43 | NSLog(@"原图%@",models); 44 | for (GCMAssetModel *videoModel in models) { 45 | videoModel.fileName = [NSString stringWithFormat:@"%ld.mp4",RandomNum]; 46 | 47 | //转码压缩存储至本地(如果想修改存储路径和压缩比例看方法内部) 48 | [videoModel convertVideoWithModel:videoModel]; 49 | 50 | //所有数据都在模型数组里,想要的数据具体看模型,模型(GCMAssetModel)里面写的很清楚 51 | //解码是异步的,但指针始终指向videoModel这个对象,所以在这边打印fileData可能为null,这是正常现象,过十几秒fileData就有数据了。 52 | [videoModelArray addObject:videoModel]; 53 | } 54 | }]; 55 | [self presentViewController:picker animated:YES completion:nil]; 56 | } 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | - (void)didReceiveMemoryWarning { 67 | [super didReceiveMemoryWarning]; 68 | // Dispose of any resources that can be recreated. 69 | } 70 | 71 | @end 72 | -------------------------------------------------------------------------------- /SelectVideoAndConvert/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // SelectVideoAndConvert 4 | // 5 | // Created by macavilang on 16/7/4. 6 | // Copyright © 2016年 Snoopy. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | // Override point for customization after application launch. 20 | return YES; 21 | } 22 | 23 | - (void)applicationWillResignActive:(UIApplication *)application { 24 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 25 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 26 | } 27 | 28 | - (void)applicationDidEnterBackground:(UIApplication *)application { 29 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 30 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 31 | } 32 | 33 | - (void)applicationWillEnterForeground:(UIApplication *)application { 34 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 35 | } 36 | 37 | - (void)applicationDidBecomeActive:(UIApplication *)application { 38 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 39 | } 40 | 41 | - (void)applicationWillTerminate:(UIApplication *)application { 42 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 43 | } 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /SelectVideoAndConvert/GCMImagePicker/GCMImagePickerController.m: -------------------------------------------------------------------------------- 1 | // 2 | // GCMImagePickerController.m 3 | // SelectMediumFile 4 | // 5 | // Created by macavilang on 16/6/28. 6 | // Copyright © 2016年 Snoopy. All rights reserved. 7 | // 8 | 9 | #import "GCMImagePickerController.h" 10 | #import "GCMAssetsGroupController.h" 11 | 12 | @interface GCMImagePickerController () 13 | 14 | @property (nonatomic,strong) GCMAssetsGroupController *assetsGroupVC; 15 | 16 | @end 17 | 18 | @implementation GCMImagePickerController 19 | 20 | - (void)viewDidLoad { 21 | [super viewDidLoad]; 22 | 23 | } 24 | 25 | - (instancetype)init{ 26 | 27 | if (self = [super initWithRootViewController:self.assetsGroupVC]) { 28 | UINavigationBar *navBar = [UINavigationBar appearance]; 29 | //导航条背景色 30 | navBar.barTintColor = [UIColor redColor]; 31 | 32 | } 33 | return self; 34 | } 35 | 36 | 37 | - (instancetype)initWithRootViewController:(UIViewController *)rootViewController{ 38 | return [self init]; 39 | } 40 | - (GCMAssetsGroupController *)assetsGroupVC{ 41 | if (_assetsGroupVC == nil) { 42 | _assetsGroupVC = [[GCMAssetsGroupController alloc] init]; 43 | UILabel *titleLabel = [[UILabel alloc] init]; 44 | titleLabel.textColor = [UIColor whiteColor]; 45 | titleLabel.textAlignment = NSTextAlignmentCenter; 46 | titleLabel.text = @"选择相册"; 47 | titleLabel.font = [UIFont systemFontOfSize:22]; 48 | [titleLabel sizeToFit]; 49 | _assetsGroupVC.navigationItem.titleView = titleLabel; 50 | 51 | 52 | UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 60, 30)]; 53 | [backButton setTitle:@" 返回" forState:UIControlStateNormal]; 54 | [backButton setImage:[UIImage imageNamed:@"nav_back"] forState:UIControlStateNormal]; 55 | [backButton addTarget:self action:@selector(dismiss) forControlEvents:UIControlEventTouchUpInside]; 56 | UIBarButtonItem *leftButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; 57 | 58 | 59 | _assetsGroupVC.navigationItem.leftBarButtonItem = leftButtonItem; 60 | } 61 | return _assetsGroupVC; 62 | } 63 | 64 | 65 | - (void)dismiss{ 66 | [self dismissViewControllerAnimated:YES completion:nil]; 67 | } 68 | 69 | @end 70 | -------------------------------------------------------------------------------- /SelectVideoAndConvert/GCMImagePicker/GCMAssetsGroupController.m: -------------------------------------------------------------------------------- 1 | // 2 | // GCMAssetsGroupController.m 3 | // SelectMediumFile 4 | // 5 | // Created by macavilang on 16/6/28. 6 | // Copyright © 2016年 Snoopy. All rights reserved. 7 | // 8 | 9 | #import "GCMAssetsGroupController.h" 10 | #import "GCMGroupCell.h" 11 | #import "GCMCollectionViewController.h" 12 | #import 13 | 14 | 15 | @interface GCMAssetsGroupController () 16 | 17 | @end 18 | 19 | @implementation GCMAssetsGroupController 20 | 21 | 22 | - (ALAssetsLibrary *)assetsLibrary{ 23 | if (_assetsLibrary == nil) { 24 | _assetsLibrary = [[ALAssetsLibrary alloc] init]; 25 | } 26 | return _assetsLibrary; 27 | } 28 | - (NSMutableArray *)groups{ 29 | if (_groups == nil) { 30 | _groups = [NSMutableArray array]; 31 | dispatch_async(dispatch_get_main_queue(), ^{ 32 | [self.assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 33 | if(group){ 34 | [_groups addObject:group]; 35 | [self.tableView reloadData]; 36 | } 37 | } failureBlock:^(NSError *error) { 38 | UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"访问相册失败" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil]; 39 | [alertView show]; 40 | }]; 41 | }); 42 | } 43 | return _groups; 44 | } 45 | - (void)viewDidLoad { 46 | [super viewDidLoad]; 47 | self.tableView.tableFooterView = [[UIView alloc] init]; 48 | self.tableView.separatorInset = UIEdgeInsetsZero; 49 | 50 | //返回按钮 51 | UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 80, 30)]; 52 | [backButton setTitle:@" 返回相册" forState:UIControlStateNormal]; 53 | [backButton setImage:[UIImage imageNamed:@"nav_back"] forState:UIControlStateNormal]; 54 | UIBarButtonItem *leftButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; 55 | self.navigationItem.backBarButtonItem = leftButtonItem; 56 | } 57 | 58 | 59 | #pragma mark - -----------------代理方法----------------- 60 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 61 | return self.groups.count; 62 | } 63 | 64 | 65 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 66 | GCMGroupCell *cell = [GCMGroupCell groupCell:tableView]; 67 | ALAssetsGroup *group = [self.groups objectAtIndex:indexPath.row]; 68 | cell.group = group; 69 | return cell; 70 | } 71 | 72 | 73 | - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 74 | return 108; 75 | } 76 | 77 | 78 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 79 | GCMCollectionViewController *collectionVC = [[GCMCollectionViewController alloc] init]; 80 | collectionVC.group = self.groups[indexPath.row]; 81 | [self.navigationController pushViewController:collectionVC animated:YES]; 82 | } 83 | 84 | @end 85 | -------------------------------------------------------------------------------- /SelectVideoAndConvert/GCMImagePicker/GCMAssetModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // GCMAssetModel.m 3 | // SelectMediumFile 4 | // 5 | // Created by macavilang on 16/6/28. 6 | // Copyright © 2016年 Snoopy. All rights reserved. 7 | // 8 | 9 | #import "GCMAssetModel.h" 10 | #import 11 | #import 12 | 13 | @implementation GCMAssetModel 14 | 15 | - (void)originalImage:(void (^)(UIImage *))returnImage{ 16 | ALAssetsLibrary *lib = [[ALAssetsLibrary alloc] init]; 17 | [lib assetForURL:self.imageURL resultBlock:^(ALAsset *asset) { 18 | ALAssetRepresentation *rep = asset.defaultRepresentation; 19 | CGImageRef imageRef = rep.fullResolutionImage; 20 | UIImage *image = [UIImage imageWithCGImage:imageRef scale:rep.scale orientation:(UIImageOrientation)rep.orientation]; 21 | if (image) { 22 | returnImage(image); 23 | } 24 | } failureBlock:^(NSError *error) { 25 | 26 | }]; 27 | } 28 | 29 | - (void) convertVideoWithModel:(GCMAssetModel *) model 30 | { 31 | 32 | [self creatSandBoxFilePathIfNoExist]; 33 | //保存至沙盒路径 34 | NSString *pathDocuments = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 35 | NSString *videoPath = [NSString stringWithFormat:@"%@/Video", pathDocuments]; 36 | model.sandboxPath = [videoPath stringByAppendingPathComponent:model.fileName]; 37 | 38 | //转码配置 39 | AVURLAsset *asset = [AVURLAsset URLAssetWithURL:model.imageURL options:nil]; 40 | 41 | //AVAssetExportPresetMediumQuality可以更改,是枚举类型,官方有提供,更改该值可以改变视频的压缩比例 42 | AVAssetExportSession *exportSession= [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetMediumQuality]; 43 | exportSession.shouldOptimizeForNetworkUse = YES; 44 | exportSession.outputURL = [NSURL fileURLWithPath:model.sandboxPath]; 45 | //AVFileTypeMPEG4 文件输出类型,可以更改,是枚举类型,官方有提供,更改该值也可以改变视频的压缩比例 46 | exportSession.outputFileType = AVFileTypeMPEG4; 47 | [exportSession exportAsynchronouslyWithCompletionHandler:^{ 48 | int exportStatus = exportSession.status; 49 | NSLog(@"%d",exportStatus); 50 | switch (exportStatus) 51 | { 52 | case AVAssetExportSessionStatusFailed: 53 | { 54 | // log error to text view 55 | NSError *exportError = exportSession.error; 56 | NSLog (@"AVAssetExportSessionStatusFailed: %@", exportError); 57 | break; 58 | } 59 | case AVAssetExportSessionStatusCompleted: 60 | { 61 | NSLog(@"视频转码成功"); 62 | NSData *data = [NSData dataWithContentsOfFile:model.sandboxPath]; 63 | model.fileData = data; 64 | } 65 | } 66 | }]; 67 | 68 | } 69 | 70 | 71 | - (void)creatSandBoxFilePathIfNoExist 72 | { 73 | //沙盒路径 74 | NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 75 | NSString *documentDirectory = [paths objectAtIndex:0]; 76 | NSLog(@"databse--->%@",documentDirectory); 77 | 78 | NSFileManager *fileManager = [[NSFileManager alloc] init]; 79 | NSString *pathDocuments = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 80 | //创建目录 81 | NSString *createPath = [NSString stringWithFormat:@"%@/Video", pathDocuments]; 82 | // 判断文件夹是否存在,如果不存在,则创建 83 | if (![[NSFileManager defaultManager] fileExistsAtPath:createPath]) { 84 | [fileManager createDirectoryAtPath:createPath withIntermediateDirectories:YES attributes:nil error:nil]; 85 | } else { 86 | NSLog(@"FileImage is exists."); 87 | } 88 | } 89 | 90 | @end 91 | -------------------------------------------------------------------------------- /SelectVideoAndConvert.xcodeproj/xcuserdata/macavilang.xcuserdatad/xcschemes/SelectVideoAndConvert.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 43 | 49 | 50 | 51 | 52 | 53 | 59 | 60 | 61 | 62 | 63 | 64 | 74 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 95 | 101 | 102 | 103 | 104 | 106 | 107 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /SelectVideoAndConvert/GCMImagePicker/GCMCollectionViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // GCMCollectionViewController.m 3 | // SelectMediumFile 4 | // 5 | // Created by macavilang on 16/6/28. 6 | // Copyright © 2016年 Snoopy. All rights reserved. 7 | // 8 | 9 | #import "GCMCollectionViewController.h" 10 | #import 11 | #import "GCMAssetModel.h" 12 | #import "GCMImagePickerController.h" 13 | #import 14 | static const NSInteger MARGIN = 10; 15 | static const NSInteger COL = 4; 16 | #define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width) 17 | #define SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height) 18 | 19 | 20 | 21 | @interface GCMShowCell : UICollectionViewCell 22 | @property (nonatomic,weak) UIButton *selectedButton; 23 | @end 24 | 25 | @implementation GCMShowCell 26 | 27 | @end 28 | 29 | @interface GCMCollectionViewController () 30 | @property (nonatomic,strong) NSMutableArray *assetModels; 31 | //选中的模型 32 | @property (nonatomic,strong) NSMutableArray *selectedModels; 33 | @end 34 | 35 | @implementation GCMCollectionViewController 36 | { 37 | UIButton *bigImg; 38 | UIView *cover; 39 | } 40 | 41 | 42 | static NSString * const reuseIdentifier = @"Cell"; 43 | //设置类型 44 | - (instancetype)init 45 | { 46 | UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init]; 47 | flowLayout.minimumLineSpacing = MARGIN; 48 | flowLayout.minimumInteritemSpacing = MARGIN; 49 | CGFloat cellHeight = (SCREEN_WIDTH - (COL + 1) * MARGIN) / COL; 50 | flowLayout.itemSize = CGSizeMake(cellHeight, cellHeight); 51 | flowLayout.sectionInset = UIEdgeInsetsMake(10, 10, 10, 10); 52 | return [super initWithCollectionViewLayout:flowLayout]; 53 | } 54 | 55 | 56 | - (NSMutableArray *)assetModels{ 57 | if (_assetModels == nil) { 58 | _assetModels = [NSMutableArray array]; 59 | } 60 | return _assetModels; 61 | } 62 | - (NSMutableArray *)selectedModels{ 63 | if (_selectedModels == nil) { 64 | _selectedModels = [NSMutableArray array]; 65 | } 66 | return _selectedModels; 67 | } 68 | - (void)setGroup:(ALAssetsGroup *)group{ 69 | _group = group; 70 | [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop) { 71 | if (asset == nil) return ; 72 | GCMAssetModel *model = [[GCMAssetModel alloc] init]; 73 | if (![[asset valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) {//不是图片 74 | model.thumbnail = [UIImage imageWithCGImage:asset.thumbnail]; 75 | model.imageURL = asset.defaultRepresentation.url; 76 | model.isImage = NO; 77 | [self.assetModels addObject:model]; 78 | }else{//图片 79 | model.thumbnail = [UIImage imageWithCGImage:asset.thumbnail]; 80 | model.imageURL = asset.defaultRepresentation.url; 81 | model.isImage = YES; 82 | [self.assetModels addObject:model]; 83 | } 84 | 85 | }]; 86 | 87 | } 88 | - (void)viewDidLoad { 89 | [super viewDidLoad]; 90 | [self.collectionView registerClass:[GCMShowCell class] forCellWithReuseIdentifier:reuseIdentifier]; 91 | self.collectionView.backgroundColor = [UIColor whiteColor]; 92 | 93 | //右侧完成按钮 94 | UIButton *editButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40, 30)]; 95 | [editButton setTitle:@"完成" forState:UIControlStateNormal]; 96 | [editButton addTarget:self action:@selector(finishSelecting) forControlEvents:UIControlEventTouchUpInside]; 97 | UIBarButtonItem *rightButtonItem = [[UIBarButtonItem alloc] initWithCustomView:editButton]; 98 | self.navigationItem.rightBarButtonItem = rightButtonItem; 99 | 100 | } 101 | 102 | //出口,选择完成图片 103 | - (void)finishSelecting{ 104 | 105 | if ([self.navigationController isKindOfClass:[GCMImagePickerController class]]) { 106 | GCMImagePickerController *picker = (GCMImagePickerController *)self.navigationController; 107 | if (picker.didFinishSelectImageModels) { 108 | 109 | for (GCMAssetModel *model in self.assetModels) { 110 | if (model.isSelected) { 111 | [self.selectedModels addObject:model]; 112 | } 113 | } 114 | 115 | if (picker.didFinishSelectImageModels) { 116 | picker.didFinishSelectImageModels(self.selectedModels); 117 | } 118 | 119 | } 120 | } 121 | 122 | //移除 123 | [self dismissViewControllerAnimated:YES completion:nil]; 124 | 125 | } 126 | 127 | 128 | #pragma mark 129 | 130 | - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { 131 | 132 | return self.assetModels.count; 133 | 134 | } 135 | 136 | - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 137 | GCMShowCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath]; 138 | GCMAssetModel *model = self.assetModels[indexPath.item]; 139 | 140 | if (cell.backgroundView == nil) {//防止多次创建 141 | UIImageView *imageView = [[UIImageView alloc] init]; 142 | cell.backgroundView = imageView; 143 | } 144 | UIImageView *backView = (UIImageView *)cell.backgroundView; 145 | backView.image = model.thumbnail; 146 | if (cell.selectedButton == nil) {//防止多次创建 147 | UIButton *selectButton = [[UIButton alloc] init]; 148 | [selectButton setImage:[UIImage imageNamed:@"delect_02"] forState:UIControlStateNormal]; 149 | [selectButton setImage:[UIImage imageNamed:@"add_01"] forState:UIControlStateSelected]; 150 | CGFloat width = cell.bounds.size.width; 151 | selectButton.frame = CGRectMake(width - 30, 0, 30, 30); 152 | [cell.contentView addSubview:selectButton]; 153 | cell.selectedButton = selectButton; 154 | [selectButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 155 | } 156 | 157 | cell.selectedButton.tag = indexPath.item;//重新绑定 158 | cell.selectedButton.selected = model.isSelected;//恢复设定状态 159 | return cell; 160 | } 161 | - (void)buttonClicked:(UIButton *)sender{ 162 | sender.selected = !sender.selected; 163 | GCMAssetModel *model = self.assetModels[sender.tag]; 164 | //因为冲用的问题,不能根据选中状态来记录 165 | if (sender.selected == YES) {//选中了记录 166 | model.isSelected = YES; 167 | }else{//否则移除记录 168 | model.isSelected = NO; 169 | } 170 | } 171 | #pragma mark 172 | 173 | - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ 174 | GCMAssetModel *model = self.assetModels[indexPath.item]; 175 | if (model.isImage == NO) { 176 | 177 | MPMoviePlayerViewController* playerView = [[MPMoviePlayerViewController alloc] initWithContentURL:model.imageURL]; 178 | [self presentViewController:playerView animated:YES completion:nil]; 179 | }else{ 180 | 181 | cover = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)]; 182 | UIBlurEffect *blur = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; 183 | UIVisualEffectView *effectview = [[UIVisualEffectView alloc] initWithEffect:blur]; 184 | effectview.frame = cover.frame; 185 | [cover addSubview:effectview]; 186 | [self.view addSubview:cover]; 187 | bigImg = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)]; 188 | [bigImg addTarget:self action:@selector(removeBtn) forControlEvents:UIControlEventTouchUpInside]; 189 | [self.view addSubview:bigImg]; 190 | 191 | ALAssetsLibrary *lib = [[ALAssetsLibrary alloc] init]; 192 | [lib assetForURL:model.imageURL resultBlock:^(ALAsset *asset) { 193 | ALAssetRepresentation *assetRep = [asset defaultRepresentation]; 194 | CGImageRef imgRef = [assetRep fullResolutionImage]; 195 | UIImage *img = [UIImage imageWithCGImage:imgRef 196 | scale:assetRep.scale 197 | orientation:(UIImageOrientation)assetRep.orientation]; 198 | [bigImg setImage:img forState:UIControlStateNormal]; 199 | } failureBlock:^(NSError *error) { 200 | NSLog(@"相册图片访问失败"); 201 | }]; 202 | 203 | } 204 | } 205 | 206 | //移走大图 207 | - (void)removeBtn 208 | { 209 | [cover removeFromSuperview]; 210 | [bigImg removeFromSuperview]; 211 | 212 | } 213 | @end 214 | 215 | -------------------------------------------------------------------------------- /SelectVideoAndConvert.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 4A4799181D2A5FEC0037A9DD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A4799171D2A5FEC0037A9DD /* main.m */; }; 11 | 4A47991B1D2A5FEC0037A9DD /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A47991A1D2A5FEC0037A9DD /* AppDelegate.m */; }; 12 | 4A47991E1D2A5FEC0037A9DD /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A47991D1D2A5FEC0037A9DD /* ViewController.m */; }; 13 | 4A4799211D2A5FEC0037A9DD /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4A47991F1D2A5FEC0037A9DD /* Main.storyboard */; }; 14 | 4A4799231D2A5FEC0037A9DD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4A4799221D2A5FEC0037A9DD /* Assets.xcassets */; }; 15 | 4A4799261D2A5FEC0037A9DD /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4A4799241D2A5FEC0037A9DD /* LaunchScreen.storyboard */; }; 16 | 4A4799311D2A5FEC0037A9DD /* SelectVideoAndConvertTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A4799301D2A5FEC0037A9DD /* SelectVideoAndConvertTests.m */; }; 17 | 4A47993C1D2A5FEC0037A9DD /* SelectVideoAndConvertUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A47993B1D2A5FEC0037A9DD /* SelectVideoAndConvertUITests.m */; }; 18 | 4A4799561D2A5FFF0037A9DD /* add_01@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4A47994A1D2A5FFF0037A9DD /* add_01@2x.png */; }; 19 | 4A4799571D2A5FFF0037A9DD /* add_01@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4A47994B1D2A5FFF0037A9DD /* add_01@3x.png */; }; 20 | 4A4799581D2A5FFF0037A9DD /* GCMAssetModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A47994D1D2A5FFF0037A9DD /* GCMAssetModel.m */; }; 21 | 4A4799591D2A5FFF0037A9DD /* GCMAssetsGroupController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A47994F1D2A5FFF0037A9DD /* GCMAssetsGroupController.m */; }; 22 | 4A47995A1D2A5FFF0037A9DD /* GCMCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A4799511D2A5FFF0037A9DD /* GCMCollectionViewController.m */; }; 23 | 4A47995B1D2A5FFF0037A9DD /* GCMGroupCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A4799531D2A5FFF0037A9DD /* GCMGroupCell.m */; }; 24 | 4A47995C1D2A5FFF0037A9DD /* GCMImagePickerController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A4799551D2A5FFF0037A9DD /* GCMImagePickerController.m */; }; 25 | /* End PBXBuildFile section */ 26 | 27 | /* Begin PBXContainerItemProxy section */ 28 | 4A47992D1D2A5FEC0037A9DD /* PBXContainerItemProxy */ = { 29 | isa = PBXContainerItemProxy; 30 | containerPortal = 4A47990B1D2A5FEC0037A9DD /* Project object */; 31 | proxyType = 1; 32 | remoteGlobalIDString = 4A4799121D2A5FEC0037A9DD; 33 | remoteInfo = SelectVideoAndConvert; 34 | }; 35 | 4A4799381D2A5FEC0037A9DD /* PBXContainerItemProxy */ = { 36 | isa = PBXContainerItemProxy; 37 | containerPortal = 4A47990B1D2A5FEC0037A9DD /* Project object */; 38 | proxyType = 1; 39 | remoteGlobalIDString = 4A4799121D2A5FEC0037A9DD; 40 | remoteInfo = SelectVideoAndConvert; 41 | }; 42 | /* End PBXContainerItemProxy section */ 43 | 44 | /* Begin PBXFileReference section */ 45 | 4A4799131D2A5FEC0037A9DD /* SelectVideoAndConvert.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SelectVideoAndConvert.app; sourceTree = BUILT_PRODUCTS_DIR; }; 46 | 4A4799171D2A5FEC0037A9DD /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 47 | 4A4799191D2A5FEC0037A9DD /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 48 | 4A47991A1D2A5FEC0037A9DD /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 49 | 4A47991C1D2A5FEC0037A9DD /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 50 | 4A47991D1D2A5FEC0037A9DD /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 51 | 4A4799201D2A5FEC0037A9DD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 52 | 4A4799221D2A5FEC0037A9DD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 53 | 4A4799251D2A5FEC0037A9DD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 54 | 4A4799271D2A5FEC0037A9DD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 55 | 4A47992C1D2A5FEC0037A9DD /* SelectVideoAndConvertTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SelectVideoAndConvertTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 56 | 4A4799301D2A5FEC0037A9DD /* SelectVideoAndConvertTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SelectVideoAndConvertTests.m; sourceTree = ""; }; 57 | 4A4799321D2A5FEC0037A9DD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 58 | 4A4799371D2A5FEC0037A9DD /* SelectVideoAndConvertUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SelectVideoAndConvertUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 59 | 4A47993B1D2A5FEC0037A9DD /* SelectVideoAndConvertUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SelectVideoAndConvertUITests.m; sourceTree = ""; }; 60 | 4A47993D1D2A5FEC0037A9DD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 61 | 4A47994A1D2A5FFF0037A9DD /* add_01@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "add_01@2x.png"; sourceTree = ""; }; 62 | 4A47994B1D2A5FFF0037A9DD /* add_01@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "add_01@3x.png"; sourceTree = ""; }; 63 | 4A47994C1D2A5FFF0037A9DD /* GCMAssetModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCMAssetModel.h; sourceTree = ""; }; 64 | 4A47994D1D2A5FFF0037A9DD /* GCMAssetModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCMAssetModel.m; sourceTree = ""; }; 65 | 4A47994E1D2A5FFF0037A9DD /* GCMAssetsGroupController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCMAssetsGroupController.h; sourceTree = ""; }; 66 | 4A47994F1D2A5FFF0037A9DD /* GCMAssetsGroupController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCMAssetsGroupController.m; sourceTree = ""; }; 67 | 4A4799501D2A5FFF0037A9DD /* GCMCollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCMCollectionViewController.h; sourceTree = ""; }; 68 | 4A4799511D2A5FFF0037A9DD /* GCMCollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCMCollectionViewController.m; sourceTree = ""; }; 69 | 4A4799521D2A5FFF0037A9DD /* GCMGroupCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCMGroupCell.h; sourceTree = ""; }; 70 | 4A4799531D2A5FFF0037A9DD /* GCMGroupCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCMGroupCell.m; sourceTree = ""; }; 71 | 4A4799541D2A5FFF0037A9DD /* GCMImagePickerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCMImagePickerController.h; sourceTree = ""; }; 72 | 4A4799551D2A5FFF0037A9DD /* GCMImagePickerController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCMImagePickerController.m; sourceTree = ""; }; 73 | /* End PBXFileReference section */ 74 | 75 | /* Begin PBXFrameworksBuildPhase section */ 76 | 4A4799101D2A5FEC0037A9DD /* Frameworks */ = { 77 | isa = PBXFrameworksBuildPhase; 78 | buildActionMask = 2147483647; 79 | files = ( 80 | ); 81 | runOnlyForDeploymentPostprocessing = 0; 82 | }; 83 | 4A4799291D2A5FEC0037A9DD /* Frameworks */ = { 84 | isa = PBXFrameworksBuildPhase; 85 | buildActionMask = 2147483647; 86 | files = ( 87 | ); 88 | runOnlyForDeploymentPostprocessing = 0; 89 | }; 90 | 4A4799341D2A5FEC0037A9DD /* Frameworks */ = { 91 | isa = PBXFrameworksBuildPhase; 92 | buildActionMask = 2147483647; 93 | files = ( 94 | ); 95 | runOnlyForDeploymentPostprocessing = 0; 96 | }; 97 | /* End PBXFrameworksBuildPhase section */ 98 | 99 | /* Begin PBXGroup section */ 100 | 4A47990A1D2A5FEC0037A9DD = { 101 | isa = PBXGroup; 102 | children = ( 103 | 4A4799151D2A5FEC0037A9DD /* SelectVideoAndConvert */, 104 | 4A47992F1D2A5FEC0037A9DD /* SelectVideoAndConvertTests */, 105 | 4A47993A1D2A5FEC0037A9DD /* SelectVideoAndConvertUITests */, 106 | 4A4799141D2A5FEC0037A9DD /* Products */, 107 | ); 108 | sourceTree = ""; 109 | }; 110 | 4A4799141D2A5FEC0037A9DD /* Products */ = { 111 | isa = PBXGroup; 112 | children = ( 113 | 4A4799131D2A5FEC0037A9DD /* SelectVideoAndConvert.app */, 114 | 4A47992C1D2A5FEC0037A9DD /* SelectVideoAndConvertTests.xctest */, 115 | 4A4799371D2A5FEC0037A9DD /* SelectVideoAndConvertUITests.xctest */, 116 | ); 117 | name = Products; 118 | sourceTree = ""; 119 | }; 120 | 4A4799151D2A5FEC0037A9DD /* SelectVideoAndConvert */ = { 121 | isa = PBXGroup; 122 | children = ( 123 | 4A4799491D2A5FFF0037A9DD /* GCMImagePicker */, 124 | 4A4799191D2A5FEC0037A9DD /* AppDelegate.h */, 125 | 4A47991A1D2A5FEC0037A9DD /* AppDelegate.m */, 126 | 4A47991C1D2A5FEC0037A9DD /* ViewController.h */, 127 | 4A47991D1D2A5FEC0037A9DD /* ViewController.m */, 128 | 4A47991F1D2A5FEC0037A9DD /* Main.storyboard */, 129 | 4A4799221D2A5FEC0037A9DD /* Assets.xcassets */, 130 | 4A4799241D2A5FEC0037A9DD /* LaunchScreen.storyboard */, 131 | 4A4799271D2A5FEC0037A9DD /* Info.plist */, 132 | 4A4799161D2A5FEC0037A9DD /* Supporting Files */, 133 | ); 134 | path = SelectVideoAndConvert; 135 | sourceTree = ""; 136 | }; 137 | 4A4799161D2A5FEC0037A9DD /* Supporting Files */ = { 138 | isa = PBXGroup; 139 | children = ( 140 | 4A4799171D2A5FEC0037A9DD /* main.m */, 141 | ); 142 | name = "Supporting Files"; 143 | sourceTree = ""; 144 | }; 145 | 4A47992F1D2A5FEC0037A9DD /* SelectVideoAndConvertTests */ = { 146 | isa = PBXGroup; 147 | children = ( 148 | 4A4799301D2A5FEC0037A9DD /* SelectVideoAndConvertTests.m */, 149 | 4A4799321D2A5FEC0037A9DD /* Info.plist */, 150 | ); 151 | path = SelectVideoAndConvertTests; 152 | sourceTree = ""; 153 | }; 154 | 4A47993A1D2A5FEC0037A9DD /* SelectVideoAndConvertUITests */ = { 155 | isa = PBXGroup; 156 | children = ( 157 | 4A47993B1D2A5FEC0037A9DD /* SelectVideoAndConvertUITests.m */, 158 | 4A47993D1D2A5FEC0037A9DD /* Info.plist */, 159 | ); 160 | path = SelectVideoAndConvertUITests; 161 | sourceTree = ""; 162 | }; 163 | 4A4799491D2A5FFF0037A9DD /* GCMImagePicker */ = { 164 | isa = PBXGroup; 165 | children = ( 166 | 4A47994A1D2A5FFF0037A9DD /* add_01@2x.png */, 167 | 4A47994B1D2A5FFF0037A9DD /* add_01@3x.png */, 168 | 4A47994C1D2A5FFF0037A9DD /* GCMAssetModel.h */, 169 | 4A47994D1D2A5FFF0037A9DD /* GCMAssetModel.m */, 170 | 4A47994E1D2A5FFF0037A9DD /* GCMAssetsGroupController.h */, 171 | 4A47994F1D2A5FFF0037A9DD /* GCMAssetsGroupController.m */, 172 | 4A4799501D2A5FFF0037A9DD /* GCMCollectionViewController.h */, 173 | 4A4799511D2A5FFF0037A9DD /* GCMCollectionViewController.m */, 174 | 4A4799521D2A5FFF0037A9DD /* GCMGroupCell.h */, 175 | 4A4799531D2A5FFF0037A9DD /* GCMGroupCell.m */, 176 | 4A4799541D2A5FFF0037A9DD /* GCMImagePickerController.h */, 177 | 4A4799551D2A5FFF0037A9DD /* GCMImagePickerController.m */, 178 | ); 179 | path = GCMImagePicker; 180 | sourceTree = ""; 181 | }; 182 | /* End PBXGroup section */ 183 | 184 | /* Begin PBXNativeTarget section */ 185 | 4A4799121D2A5FEC0037A9DD /* SelectVideoAndConvert */ = { 186 | isa = PBXNativeTarget; 187 | buildConfigurationList = 4A4799401D2A5FEC0037A9DD /* Build configuration list for PBXNativeTarget "SelectVideoAndConvert" */; 188 | buildPhases = ( 189 | 4A47990F1D2A5FEC0037A9DD /* Sources */, 190 | 4A4799101D2A5FEC0037A9DD /* Frameworks */, 191 | 4A4799111D2A5FEC0037A9DD /* Resources */, 192 | ); 193 | buildRules = ( 194 | ); 195 | dependencies = ( 196 | ); 197 | name = SelectVideoAndConvert; 198 | productName = SelectVideoAndConvert; 199 | productReference = 4A4799131D2A5FEC0037A9DD /* SelectVideoAndConvert.app */; 200 | productType = "com.apple.product-type.application"; 201 | }; 202 | 4A47992B1D2A5FEC0037A9DD /* SelectVideoAndConvertTests */ = { 203 | isa = PBXNativeTarget; 204 | buildConfigurationList = 4A4799431D2A5FEC0037A9DD /* Build configuration list for PBXNativeTarget "SelectVideoAndConvertTests" */; 205 | buildPhases = ( 206 | 4A4799281D2A5FEC0037A9DD /* Sources */, 207 | 4A4799291D2A5FEC0037A9DD /* Frameworks */, 208 | 4A47992A1D2A5FEC0037A9DD /* Resources */, 209 | ); 210 | buildRules = ( 211 | ); 212 | dependencies = ( 213 | 4A47992E1D2A5FEC0037A9DD /* PBXTargetDependency */, 214 | ); 215 | name = SelectVideoAndConvertTests; 216 | productName = SelectVideoAndConvertTests; 217 | productReference = 4A47992C1D2A5FEC0037A9DD /* SelectVideoAndConvertTests.xctest */; 218 | productType = "com.apple.product-type.bundle.unit-test"; 219 | }; 220 | 4A4799361D2A5FEC0037A9DD /* SelectVideoAndConvertUITests */ = { 221 | isa = PBXNativeTarget; 222 | buildConfigurationList = 4A4799461D2A5FEC0037A9DD /* Build configuration list for PBXNativeTarget "SelectVideoAndConvertUITests" */; 223 | buildPhases = ( 224 | 4A4799331D2A5FEC0037A9DD /* Sources */, 225 | 4A4799341D2A5FEC0037A9DD /* Frameworks */, 226 | 4A4799351D2A5FEC0037A9DD /* Resources */, 227 | ); 228 | buildRules = ( 229 | ); 230 | dependencies = ( 231 | 4A4799391D2A5FEC0037A9DD /* PBXTargetDependency */, 232 | ); 233 | name = SelectVideoAndConvertUITests; 234 | productName = SelectVideoAndConvertUITests; 235 | productReference = 4A4799371D2A5FEC0037A9DD /* SelectVideoAndConvertUITests.xctest */; 236 | productType = "com.apple.product-type.bundle.ui-testing"; 237 | }; 238 | /* End PBXNativeTarget section */ 239 | 240 | /* Begin PBXProject section */ 241 | 4A47990B1D2A5FEC0037A9DD /* Project object */ = { 242 | isa = PBXProject; 243 | attributes = { 244 | LastUpgradeCheck = 0730; 245 | ORGANIZATIONNAME = Snoopy; 246 | TargetAttributes = { 247 | 4A4799121D2A5FEC0037A9DD = { 248 | CreatedOnToolsVersion = 7.3.1; 249 | DevelopmentTeam = X5WRLK634K; 250 | }; 251 | 4A47992B1D2A5FEC0037A9DD = { 252 | CreatedOnToolsVersion = 7.3.1; 253 | DevelopmentTeam = X5WRLK634K; 254 | TestTargetID = 4A4799121D2A5FEC0037A9DD; 255 | }; 256 | 4A4799361D2A5FEC0037A9DD = { 257 | CreatedOnToolsVersion = 7.3.1; 258 | DevelopmentTeam = X5WRLK634K; 259 | TestTargetID = 4A4799121D2A5FEC0037A9DD; 260 | }; 261 | }; 262 | }; 263 | buildConfigurationList = 4A47990E1D2A5FEC0037A9DD /* Build configuration list for PBXProject "SelectVideoAndConvert" */; 264 | compatibilityVersion = "Xcode 3.2"; 265 | developmentRegion = English; 266 | hasScannedForEncodings = 0; 267 | knownRegions = ( 268 | en, 269 | Base, 270 | ); 271 | mainGroup = 4A47990A1D2A5FEC0037A9DD; 272 | productRefGroup = 4A4799141D2A5FEC0037A9DD /* Products */; 273 | projectDirPath = ""; 274 | projectRoot = ""; 275 | targets = ( 276 | 4A4799121D2A5FEC0037A9DD /* SelectVideoAndConvert */, 277 | 4A47992B1D2A5FEC0037A9DD /* SelectVideoAndConvertTests */, 278 | 4A4799361D2A5FEC0037A9DD /* SelectVideoAndConvertUITests */, 279 | ); 280 | }; 281 | /* End PBXProject section */ 282 | 283 | /* Begin PBXResourcesBuildPhase section */ 284 | 4A4799111D2A5FEC0037A9DD /* Resources */ = { 285 | isa = PBXResourcesBuildPhase; 286 | buildActionMask = 2147483647; 287 | files = ( 288 | 4A4799571D2A5FFF0037A9DD /* add_01@3x.png in Resources */, 289 | 4A4799261D2A5FEC0037A9DD /* LaunchScreen.storyboard in Resources */, 290 | 4A4799231D2A5FEC0037A9DD /* Assets.xcassets in Resources */, 291 | 4A4799211D2A5FEC0037A9DD /* Main.storyboard in Resources */, 292 | 4A4799561D2A5FFF0037A9DD /* add_01@2x.png in Resources */, 293 | ); 294 | runOnlyForDeploymentPostprocessing = 0; 295 | }; 296 | 4A47992A1D2A5FEC0037A9DD /* Resources */ = { 297 | isa = PBXResourcesBuildPhase; 298 | buildActionMask = 2147483647; 299 | files = ( 300 | ); 301 | runOnlyForDeploymentPostprocessing = 0; 302 | }; 303 | 4A4799351D2A5FEC0037A9DD /* Resources */ = { 304 | isa = PBXResourcesBuildPhase; 305 | buildActionMask = 2147483647; 306 | files = ( 307 | ); 308 | runOnlyForDeploymentPostprocessing = 0; 309 | }; 310 | /* End PBXResourcesBuildPhase section */ 311 | 312 | /* Begin PBXSourcesBuildPhase section */ 313 | 4A47990F1D2A5FEC0037A9DD /* Sources */ = { 314 | isa = PBXSourcesBuildPhase; 315 | buildActionMask = 2147483647; 316 | files = ( 317 | 4A47991E1D2A5FEC0037A9DD /* ViewController.m in Sources */, 318 | 4A47995C1D2A5FFF0037A9DD /* GCMImagePickerController.m in Sources */, 319 | 4A47991B1D2A5FEC0037A9DD /* AppDelegate.m in Sources */, 320 | 4A47995A1D2A5FFF0037A9DD /* GCMCollectionViewController.m in Sources */, 321 | 4A47995B1D2A5FFF0037A9DD /* GCMGroupCell.m in Sources */, 322 | 4A4799591D2A5FFF0037A9DD /* GCMAssetsGroupController.m in Sources */, 323 | 4A4799581D2A5FFF0037A9DD /* GCMAssetModel.m in Sources */, 324 | 4A4799181D2A5FEC0037A9DD /* main.m in Sources */, 325 | ); 326 | runOnlyForDeploymentPostprocessing = 0; 327 | }; 328 | 4A4799281D2A5FEC0037A9DD /* Sources */ = { 329 | isa = PBXSourcesBuildPhase; 330 | buildActionMask = 2147483647; 331 | files = ( 332 | 4A4799311D2A5FEC0037A9DD /* SelectVideoAndConvertTests.m in Sources */, 333 | ); 334 | runOnlyForDeploymentPostprocessing = 0; 335 | }; 336 | 4A4799331D2A5FEC0037A9DD /* Sources */ = { 337 | isa = PBXSourcesBuildPhase; 338 | buildActionMask = 2147483647; 339 | files = ( 340 | 4A47993C1D2A5FEC0037A9DD /* SelectVideoAndConvertUITests.m in Sources */, 341 | ); 342 | runOnlyForDeploymentPostprocessing = 0; 343 | }; 344 | /* End PBXSourcesBuildPhase section */ 345 | 346 | /* Begin PBXTargetDependency section */ 347 | 4A47992E1D2A5FEC0037A9DD /* PBXTargetDependency */ = { 348 | isa = PBXTargetDependency; 349 | target = 4A4799121D2A5FEC0037A9DD /* SelectVideoAndConvert */; 350 | targetProxy = 4A47992D1D2A5FEC0037A9DD /* PBXContainerItemProxy */; 351 | }; 352 | 4A4799391D2A5FEC0037A9DD /* PBXTargetDependency */ = { 353 | isa = PBXTargetDependency; 354 | target = 4A4799121D2A5FEC0037A9DD /* SelectVideoAndConvert */; 355 | targetProxy = 4A4799381D2A5FEC0037A9DD /* PBXContainerItemProxy */; 356 | }; 357 | /* End PBXTargetDependency section */ 358 | 359 | /* Begin PBXVariantGroup section */ 360 | 4A47991F1D2A5FEC0037A9DD /* Main.storyboard */ = { 361 | isa = PBXVariantGroup; 362 | children = ( 363 | 4A4799201D2A5FEC0037A9DD /* Base */, 364 | ); 365 | name = Main.storyboard; 366 | sourceTree = ""; 367 | }; 368 | 4A4799241D2A5FEC0037A9DD /* LaunchScreen.storyboard */ = { 369 | isa = PBXVariantGroup; 370 | children = ( 371 | 4A4799251D2A5FEC0037A9DD /* Base */, 372 | ); 373 | name = LaunchScreen.storyboard; 374 | sourceTree = ""; 375 | }; 376 | /* End PBXVariantGroup section */ 377 | 378 | /* Begin XCBuildConfiguration section */ 379 | 4A47993E1D2A5FEC0037A9DD /* Debug */ = { 380 | isa = XCBuildConfiguration; 381 | buildSettings = { 382 | ALWAYS_SEARCH_USER_PATHS = NO; 383 | CLANG_ANALYZER_NONNULL = YES; 384 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 385 | CLANG_CXX_LIBRARY = "libc++"; 386 | CLANG_ENABLE_MODULES = YES; 387 | CLANG_ENABLE_OBJC_ARC = YES; 388 | CLANG_WARN_BOOL_CONVERSION = YES; 389 | CLANG_WARN_CONSTANT_CONVERSION = YES; 390 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 391 | CLANG_WARN_EMPTY_BODY = YES; 392 | CLANG_WARN_ENUM_CONVERSION = YES; 393 | CLANG_WARN_INT_CONVERSION = YES; 394 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 395 | CLANG_WARN_UNREACHABLE_CODE = YES; 396 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 397 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 398 | COPY_PHASE_STRIP = NO; 399 | DEBUG_INFORMATION_FORMAT = dwarf; 400 | ENABLE_STRICT_OBJC_MSGSEND = YES; 401 | ENABLE_TESTABILITY = YES; 402 | GCC_C_LANGUAGE_STANDARD = gnu99; 403 | GCC_DYNAMIC_NO_PIC = NO; 404 | GCC_NO_COMMON_BLOCKS = YES; 405 | GCC_OPTIMIZATION_LEVEL = 0; 406 | GCC_PREPROCESSOR_DEFINITIONS = ( 407 | "DEBUG=1", 408 | "$(inherited)", 409 | ); 410 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 411 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 412 | GCC_WARN_UNDECLARED_SELECTOR = YES; 413 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 414 | GCC_WARN_UNUSED_FUNCTION = YES; 415 | GCC_WARN_UNUSED_VARIABLE = YES; 416 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 417 | MTL_ENABLE_DEBUG_INFO = YES; 418 | ONLY_ACTIVE_ARCH = YES; 419 | SDKROOT = iphoneos; 420 | TARGETED_DEVICE_FAMILY = "1,2"; 421 | }; 422 | name = Debug; 423 | }; 424 | 4A47993F1D2A5FEC0037A9DD /* Release */ = { 425 | isa = XCBuildConfiguration; 426 | buildSettings = { 427 | ALWAYS_SEARCH_USER_PATHS = NO; 428 | CLANG_ANALYZER_NONNULL = YES; 429 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 430 | CLANG_CXX_LIBRARY = "libc++"; 431 | CLANG_ENABLE_MODULES = YES; 432 | CLANG_ENABLE_OBJC_ARC = YES; 433 | CLANG_WARN_BOOL_CONVERSION = YES; 434 | CLANG_WARN_CONSTANT_CONVERSION = YES; 435 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 436 | CLANG_WARN_EMPTY_BODY = YES; 437 | CLANG_WARN_ENUM_CONVERSION = YES; 438 | CLANG_WARN_INT_CONVERSION = YES; 439 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 440 | CLANG_WARN_UNREACHABLE_CODE = YES; 441 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 442 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 443 | COPY_PHASE_STRIP = NO; 444 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 445 | ENABLE_NS_ASSERTIONS = NO; 446 | ENABLE_STRICT_OBJC_MSGSEND = YES; 447 | GCC_C_LANGUAGE_STANDARD = gnu99; 448 | GCC_NO_COMMON_BLOCKS = YES; 449 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 450 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 451 | GCC_WARN_UNDECLARED_SELECTOR = YES; 452 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 453 | GCC_WARN_UNUSED_FUNCTION = YES; 454 | GCC_WARN_UNUSED_VARIABLE = YES; 455 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 456 | MTL_ENABLE_DEBUG_INFO = NO; 457 | SDKROOT = iphoneos; 458 | TARGETED_DEVICE_FAMILY = "1,2"; 459 | VALIDATE_PRODUCT = YES; 460 | }; 461 | name = Release; 462 | }; 463 | 4A4799411D2A5FEC0037A9DD /* Debug */ = { 464 | isa = XCBuildConfiguration; 465 | buildSettings = { 466 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 467 | INFOPLIST_FILE = SelectVideoAndConvert/Info.plist; 468 | IPHONEOS_DEPLOYMENT_TARGET = 8.2; 469 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 470 | PRODUCT_BUNDLE_IDENTIFIER = Vilang.SelectVideoAndConvert; 471 | PRODUCT_NAME = "$(TARGET_NAME)"; 472 | }; 473 | name = Debug; 474 | }; 475 | 4A4799421D2A5FEC0037A9DD /* Release */ = { 476 | isa = XCBuildConfiguration; 477 | buildSettings = { 478 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 479 | INFOPLIST_FILE = SelectVideoAndConvert/Info.plist; 480 | IPHONEOS_DEPLOYMENT_TARGET = 8.2; 481 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 482 | PRODUCT_BUNDLE_IDENTIFIER = Vilang.SelectVideoAndConvert; 483 | PRODUCT_NAME = "$(TARGET_NAME)"; 484 | }; 485 | name = Release; 486 | }; 487 | 4A4799441D2A5FEC0037A9DD /* Debug */ = { 488 | isa = XCBuildConfiguration; 489 | buildSettings = { 490 | BUNDLE_LOADER = "$(TEST_HOST)"; 491 | INFOPLIST_FILE = SelectVideoAndConvertTests/Info.plist; 492 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 493 | PRODUCT_BUNDLE_IDENTIFIER = Vilang.SelectVideoAndConvertTests; 494 | PRODUCT_NAME = "$(TARGET_NAME)"; 495 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SelectVideoAndConvert.app/SelectVideoAndConvert"; 496 | }; 497 | name = Debug; 498 | }; 499 | 4A4799451D2A5FEC0037A9DD /* Release */ = { 500 | isa = XCBuildConfiguration; 501 | buildSettings = { 502 | BUNDLE_LOADER = "$(TEST_HOST)"; 503 | INFOPLIST_FILE = SelectVideoAndConvertTests/Info.plist; 504 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 505 | PRODUCT_BUNDLE_IDENTIFIER = Vilang.SelectVideoAndConvertTests; 506 | PRODUCT_NAME = "$(TARGET_NAME)"; 507 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SelectVideoAndConvert.app/SelectVideoAndConvert"; 508 | }; 509 | name = Release; 510 | }; 511 | 4A4799471D2A5FEC0037A9DD /* Debug */ = { 512 | isa = XCBuildConfiguration; 513 | buildSettings = { 514 | INFOPLIST_FILE = SelectVideoAndConvertUITests/Info.plist; 515 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 516 | PRODUCT_BUNDLE_IDENTIFIER = Vilang.SelectVideoAndConvertUITests; 517 | PRODUCT_NAME = "$(TARGET_NAME)"; 518 | TEST_TARGET_NAME = SelectVideoAndConvert; 519 | }; 520 | name = Debug; 521 | }; 522 | 4A4799481D2A5FEC0037A9DD /* Release */ = { 523 | isa = XCBuildConfiguration; 524 | buildSettings = { 525 | INFOPLIST_FILE = SelectVideoAndConvertUITests/Info.plist; 526 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 527 | PRODUCT_BUNDLE_IDENTIFIER = Vilang.SelectVideoAndConvertUITests; 528 | PRODUCT_NAME = "$(TARGET_NAME)"; 529 | TEST_TARGET_NAME = SelectVideoAndConvert; 530 | }; 531 | name = Release; 532 | }; 533 | /* End XCBuildConfiguration section */ 534 | 535 | /* Begin XCConfigurationList section */ 536 | 4A47990E1D2A5FEC0037A9DD /* Build configuration list for PBXProject "SelectVideoAndConvert" */ = { 537 | isa = XCConfigurationList; 538 | buildConfigurations = ( 539 | 4A47993E1D2A5FEC0037A9DD /* Debug */, 540 | 4A47993F1D2A5FEC0037A9DD /* Release */, 541 | ); 542 | defaultConfigurationIsVisible = 0; 543 | defaultConfigurationName = Release; 544 | }; 545 | 4A4799401D2A5FEC0037A9DD /* Build configuration list for PBXNativeTarget "SelectVideoAndConvert" */ = { 546 | isa = XCConfigurationList; 547 | buildConfigurations = ( 548 | 4A4799411D2A5FEC0037A9DD /* Debug */, 549 | 4A4799421D2A5FEC0037A9DD /* Release */, 550 | ); 551 | defaultConfigurationIsVisible = 0; 552 | }; 553 | 4A4799431D2A5FEC0037A9DD /* Build configuration list for PBXNativeTarget "SelectVideoAndConvertTests" */ = { 554 | isa = XCConfigurationList; 555 | buildConfigurations = ( 556 | 4A4799441D2A5FEC0037A9DD /* Debug */, 557 | 4A4799451D2A5FEC0037A9DD /* Release */, 558 | ); 559 | defaultConfigurationIsVisible = 0; 560 | }; 561 | 4A4799461D2A5FEC0037A9DD /* Build configuration list for PBXNativeTarget "SelectVideoAndConvertUITests" */ = { 562 | isa = XCConfigurationList; 563 | buildConfigurations = ( 564 | 4A4799471D2A5FEC0037A9DD /* Debug */, 565 | 4A4799481D2A5FEC0037A9DD /* Release */, 566 | ); 567 | defaultConfigurationIsVisible = 0; 568 | }; 569 | /* End XCConfigurationList section */ 570 | }; 571 | rootObject = 4A47990B1D2A5FEC0037A9DD /* Project object */; 572 | } 573 | --------------------------------------------------------------------------------