通過 Apple Configurator 2獲取ipa資源

步驟如下:

  1. 首先在App Store中下載 Apple Configurator 2 這個軟件

  2. 數(shù)據(jù)線連上手機停撞,登錄賬戶(APPLE ID),正常連上手機之后是這樣的


    image.png
  3. 選中手機转绷,點擊添加->應(yīng)用


    image.png
  4. 在應(yīng)用列表中選中想獲取資源的應(yīng)用伟件,選中后點擊添加


    image.png
  5. 然后應(yīng)用會顯示在添加中,等待


    image.png
  6. 下載完畢后可能出現(xiàn)沖突议经,不用管斧账,直接打開一個finder,快捷鍵shift+command+G煞肾,進入
    '~/Library/Group Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps/',
    就可以找到需要的資源的.ipa文件咧织,??注意:要拷貝出去,過一會可能會消失哦


    已經(jīng)存在扯旷?不用管拯爽,直接進入find,ipa包已下載.png
  7. 將.ipa改成.zip解壓钧忽,解壓后的層次結(jié)構(gòu)如下,可以看到.app文件逼肯。直接刪除.app后綴耸黑,會變成一個資源文件夾。


    image.png
  8. .app文件中包含Assets資源篮幢、可執(zhí)行文件大刊、Framework、bundle三椿、其他(數(shù)據(jù)庫缺菌、應(yīng)用啟動圖葫辐、應(yīng)用圖標、國際化資源伴郁、nib耿战、sb、plist焊傅、json剂陡、字體...)

  1. 如何打開Assets.car文件
  • 下載cartool
  • 編輯scheme


    image.png
  • 設(shè)置資源路徑和解壓路徑


    image.png
  • 設(shè)置好運行,不報錯的話狐胎,圖片資源都能正常在解壓路徑
  • 如果報錯鸭栖。替換cartoon -> main.m 文件
//
//  main.m
//  cartool
//
//  Created by Steven Troughton-Smith on 14/07/2013.
//  Copyright (c) 2013 High Caffeine Content. All rights reserved.
//
 
#import <Foundation/Foundation.h>
 
typedef enum _kCoreThemeIdiom {
    kCoreThemeIdiomUniversal,
    kCoreThemeIdiomPhone,
    kCoreThemeIdiomPad,
    kCoreThemeIdiomTV,
    kCoreThemeIdiomCar,
    kCoreThemeIdiomWatch,
    kCoreThemeIdiomMarketing
} kCoreThemeIdiom;
 
typedef NS_ENUM(NSInteger, UIUserInterfaceSizeClass) {
    UIUserInterfaceSizeClassUnspecified = 0,
    UIUserInterfaceSizeClassCompact     = 1,
    UIUserInterfaceSizeClassRegular     = 2,
};
 
@interface CUICommonAssetStorage : NSObject
 
-(NSArray *)allAssetKeys;
-(NSArray *)allRenditionNames;
 
-(id)initWithPath:(NSString *)p;
 
-(NSString *)versionString;
 
@end
 
@interface CUINamedImage : NSObject
 
@property(readonly) CGSize size;
@property(readonly) CGFloat scale;
@property(readonly) kCoreThemeIdiom idiom;
@property(readonly) UIUserInterfaceSizeClass sizeClassHorizontal;
@property(readonly) UIUserInterfaceSizeClass sizeClassVertical;
 
-(CGImageRef)image;
 
@end
 
@interface CUIRenditionKey : NSObject
@end
 
@interface CUIThemeFacet : NSObject
 
+(CUIThemeFacet *)themeWithContentsOfURL:(NSURL *)u error:(NSError **)e;
 
@end
 
@interface CUICatalog : NSObject
 
@property(readonly) bool isVectorBased;
-(id)initWithURL:(NSURL *)URL error:(NSError **)error;
-(id)initWithName:(NSString *)n fromBundle:(NSBundle *)b;
-(id)allKeys;
-(id)allImageNames;
-(CUINamedImage *)imageWithName:(NSString *)n scaleFactor:(CGFloat)s;
-(CUINamedImage *)imageWithName:(NSString *)n scaleFactor:(CGFloat)s deviceIdiom:(int)idiom;
-(NSArray *)imagesWithName:(NSString *)n;
 
@end
 
 
 
void CGImageWriteToFile(CGImageRef image, NSString *path)
{
    CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:path];
    CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypePNG, 1, NULL);
    CGImageDestinationAddImage(destination, image, nil);
    
    if (!CGImageDestinationFinalize(destination)) {
        NSLog(@"Failed to write image to %@", path);
    }
    
    CFRelease(destination);
}
 
NSString *idiomSuffixForCoreThemeIdiom(kCoreThemeIdiom idiom)
{
    switch (idiom) {
        case kCoreThemeIdiomUniversal:
            return @"";
            break;
        case kCoreThemeIdiomPhone:
            return @"~iphone";
            break;
        case kCoreThemeIdiomPad:
            return @"~ipad";
            break;
        case kCoreThemeIdiomTV:
            return @"~tv";
            break;
        case kCoreThemeIdiomCar:
            return @"~carplay";
            break;
        case kCoreThemeIdiomWatch:
            return @"~watch";
            break;
        case kCoreThemeIdiomMarketing:
            return @"~marketing";
            break;
        default:
            break;
    }
    
    return @"";
}
 
NSString *sizeClassSuffixForSizeClass(UIUserInterfaceSizeClass sizeClass)
{
    switch (sizeClass)
    {
        case UIUserInterfaceSizeClassCompact:
            return @"C";
            break;
        case UIUserInterfaceSizeClassRegular:
            return @"R";
            break;
        default:
            return @"A";
    }
}
 
NSMutableArray *getImagesArray(CUICatalog *catalog, NSString *key)
{
    NSMutableArray *images = [[NSMutableArray alloc] initWithCapacity:5];
 
    for (NSNumber *scaleFactor in @[@1, @2, @3])
    {
        CUINamedImage *image = [catalog imageWithName:key scaleFactor:scaleFactor.doubleValue];
 
        if (image && image.scale == scaleFactor.floatValue) [images addObject:image];
    }
 
    return images;
}
 
void exportCarFileAtPath(NSString * carPath, NSString *outputDirectoryPath)
{
    NSError *error = nil;
    
    outputDirectoryPath = [outputDirectoryPath stringByExpandingTildeInPath];
    
//    CUIThemeFacet *facet = [CUIThemeFacet themeWithContentsOfURL:[NSURL fileURLWithPath:carPath] error:&error];
//
//    CUICatalog *catalog = [[CUICatalog alloc] init];
//
//    /* Override CUICatalog to point to a file rather than a bundle */
//    [catalog setValue:facet forKey:@"_storageRef"];
    
    /* CUICommonAssetStorage won't link */
    
    
    CUICatalog *catalog = nil;
    if ([CUICatalog instancesRespondToSelector:@selector(initWithURL:error:)]) {
        /* If CUICatalog has the URL API (Mojave), use it. */
        catalog = [[CUICatalog alloc] initWithURL:[NSURL fileURLWithPath:carPath] error:&error];
    } else {
        CUIThemeFacet *facet = [CUIThemeFacet themeWithContentsOfURL:[NSURL fileURLWithPath:carPath] error:&error];
        catalog = [[CUICatalog alloc] init];
        /* Override CUICatalog to point to a file rather than a bundle */
        [catalog setValue:facet forKey:@"_storageRef"];
    }
    NSCAssert(!error, @"Error attempting to open asset catalog (%@): %@", carPath, error);
    
    CUICommonAssetStorage *storage = [[NSClassFromString(@"CUICommonAssetStorage") alloc] initWithPath:carPath];
    
    for (NSString *key in [storage allRenditionNames])
    {
        printf("%s\n", [key UTF8String]);
        
        NSArray* pathComponents = [key pathComponents];
        if (pathComponents.count > 1)
        {
            // Create subdirectories for namespaced assets (those with names like "some/namespace/image-name")
            NSArray* subdirectoryComponents = [pathComponents subarrayWithRange:NSMakeRange(0, pathComponents.count - 1)];
            
            NSString* subdirectoryPath = [outputDirectoryPath copy];
            for (NSString* pathComponent in subdirectoryComponents)
            {
                subdirectoryPath = [subdirectoryPath stringByAppendingPathComponent:pathComponent];
            }
            
            [[NSFileManager defaultManager] createDirectoryAtPath:subdirectoryPath
                                      withIntermediateDirectories:YES
                                                       attributes:nil
                                                            error:&error];
        }
        
        NSMutableArray *images = getImagesArray(catalog, key);
        for( CUINamedImage *image in images )
        {
            if( CGSizeEqualToSize(image.size, CGSizeZero) )
                printf("\tnil image?\n");
            else
            {
                CGImageRef cgImage = [image image];
                NSString *idiomSuffix = idiomSuffixForCoreThemeIdiom(image.idiom);
                
                NSString *sizeClassSuffix = @"";
                
                if (image.sizeClassHorizontal || image.sizeClassVertical)
                {
                    sizeClassSuffix = [NSString stringWithFormat:@"-%@x%@", sizeClassSuffixForSizeClass(image.sizeClassHorizontal), sizeClassSuffixForSizeClass(image.sizeClassVertical)];
                }
                
                NSString *scale = image.scale > 1.0 ? [NSString stringWithFormat:@"@%dx", (int)floor(image.scale)] : @"";
                NSString *name = [NSString stringWithFormat:@"%@%@%@%@.png", key, idiomSuffix, sizeClassSuffix, scale];
                printf("\t%s\n", [name UTF8String]);
                if( outputDirectoryPath )
                    CGImageWriteToFile(cgImage, [outputDirectoryPath stringByAppendingPathComponent:name]);
            }
        }
    }
}
 
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        
        if (argc < 2)
        {
            printf("Usage: cartool <path to Assets.car> [outputDirectory]\n");
            return -1;
        }
        
        exportCarFileAtPath([NSString stringWithUTF8String:argv[1]], argc > 2 ? [NSString stringWithUTF8String:argv[2]] : nil);
    }
    return 0;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市握巢,隨后出現(xiàn)的幾起案子晕鹊,更是在濱河造成了極大的恐慌,老刑警劉巖暴浦,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溅话,死亡現(xiàn)場離奇詭異,居然都是意外死亡肉渴,警方通過查閱死者的電腦和手機公荧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來同规,“玉大人循狰,你說我怎么就攤上這事∪祝” “怎么了绪钥?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長关炼。 經(jīng)常有香客問我程腹,道長,這世上最難降的妖魔是什么儒拂? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任寸潦,我火速辦了婚禮,結(jié)果婚禮上社痛,老公的妹妹穿的比我還像新娘见转。我一直安慰自己,他們只是感情好蒜哀,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布斩箫。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乘客。 梳的紋絲不亂的頭發(fā)上狐血,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音易核,去河邊找鬼匈织。 笑死,一個胖子當著我的面吹牛耸成,可吹牛的內(nèi)容都是我干的报亩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼井氢,長吁一口氣:“原來是場噩夢啊……” “哼弦追!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起花竞,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤劲件,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后约急,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體零远,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年厌蔽,在試婚紗的時候發(fā)現(xiàn)自己被綠了牵辣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡奴饮,死狀恐怖纬向,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情戴卜,我是刑警寧澤逾条,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站投剥,受9級特大地震影響师脂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜江锨,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一吃警、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啄育,春花似錦汤徽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浮毯,卻和暖如春完疫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背债蓝。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工壳鹤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人饰迹。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓芳誓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親啊鸭。 傳聞我的和親對象是個殘疾皇子锹淌,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355