OS X рдХреЗ рд▓рд┐рдП рдХреНрд╡рд┐рдХ рд▓реБрдХ рдкреНрд▓рдЧрдЗрди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛

рдХреНрд╡рд┐рдХ рд▓реБрдХ OS X рдореЗрдВ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ рдЬреЛ рдердВрдмрдиреЗрд▓ (рдЖрдЗрдХрди) рдФрд░ рдкреНрд░реАрд╡реНрдпреВ рдмрдирд╛рддрд╛ рд╣реИ (рдлрд╛рдЗрдВрдбрд░ рдореЗрдВ рд╕реНрдкреЗрд╕ рдмрд╛рд░ рджрдмрд╛рдХрд░ рдлрд╛рдЗрд▓ рдХрд╛ рд╡рд┐рд╡рд░рдг / рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдВрдбреЛ)ред рдпрд╣ рдХрдИ рдорд╛рдирдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдЖрдк рдХреНрдпреВрдПрд▓ рдкреНрд▓рдЧрдЗрдиреНрд╕ - рдЖрдЗрдХрди рдЬрдирд░реЗрдЯрд░ рдФрд░ / рдпрд╛ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдирдХреЗ рдкрд╛рд╕ рдкреНрд░рд╛рд░реВрдк .qlgenerator , ~/Library/QuickLook рдФрд░ /Library/QuickLook .qlgenerator рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред

рдореИрдВ iOS рдХреЗ рддрд╣рдд, рдХрднреА-рдХрднреА OSX рдХреЗ рддрд╣рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрддрд╛ рд╣реВрдВред рдЬрдм рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ .mobileprovision - рдкреНрд░реЛрд╡рд┐рдЬрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧ-рдЗрди рджреЗрдЦрд╛, рддреЛ рдореИрдВ рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рдХреНрд╡рд┐рдХрд▓реАрдХ рдЬреЗрдирд░реЗрдЯрд░ рдкрд░ рдЖрдпрд╛ рдерд╛ред
.mobileprovision/.provisionprofile - рдПрдХ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдЬрд┐рд╕рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ рдЗрдВрд╕реНрдЯрд╛рд▓реЗрд╢рди рдХреЗ рд▓рд┐рдП рдордВрдЬреВрд░реА рджреА рдЧрдИ рд╣реИ, рдЖрдИрдУрдПрд╕ рдФрд░ рдУрдПрд╕рдПрдХреНрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреИрд░рд╛рдореАрдЯрд░ред

рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХреНрд╡рд┐рдХ рд▓реБрдХ рдкреНрд▓рдЧ-рдЗрди рдХреЗ рджрд┐рдЦрддрд╛ рд╣реИ:

рдХрд┐рд╕реА рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЪрдпрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ TestFlight рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрд╣ рд╕рдордЭрдирд╛ рдХрд┐ рдХреМрди рд╕рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд┐рд╕ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХреЛ рд▓реЗрдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрднрд╡ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдУрдкрди-рд╕реЛрд░реНрд╕ рдкреНрд░реЛрд╡рд┐рдЬрдирд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдлрд┐рд░ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рдФрд░ рд╡рд┐рд╕реНрддреГрдд ipaql ред IPaql рдХреЗ рд▓реЗрдЦрдХ рдиреЗ рд╕рд┐рд╕реНрдЯрдо рдЬрд╛рд░реА рд╣реЛрдиреЗ рдХреЗ рдЫрд╣ рдорд╣реАрдиреЗ рдмрд╛рдж рд╣реА OS X Mavericks рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рдЦреБрд▓рд╛ рд╕рдорд╛рдзрд╛рди рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкреИрджрд╛ рдХреА, рдФрд░ рдЕрднреА рддрдХ рдЖрдЗрдХрди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдореБрдЭреЗ рдХреНрдпрд╛ рдорд┐рд▓рд╛ рд╣реИ - рдкреНрд░рд╛рд╡рдзрд╛рди ред
рдЖрдЗрдХрди рдФрд░ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерд┐рдд рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдХрд╛рд░:



рдХреИрдЯ рдХреЗ рддрд╣рдд, рдореИрдВ рддреНрд╡рд░рд┐рдд рд▓реБрдХ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдмрдирд╛рддреЗ рд╕рдордп рдореВрд▓ рдЪрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрдЕрдк


Xcode рдореЗрдВ, рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ: рдлрд╝рд╛рдЗрд▓> рдирдпрд╛> рдкреНрд░реЛрдЬреЗрдХреНрдЯ ... OS X> рд╕рд┐рд╕реНрдЯрдо рдкреНрд▓рдЧ-рдЗрди> рдХреНрд╡рд┐рдХ рд▓реБрдХ рдкреНрд▓рдЧ-рдЗрдиред рдмреБрдирд┐рдпрд╛рджреА рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ, рд╕реАрдзреЗ Info.plist рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд▓рддреЗ рд╣реИрдВ:

CFBundleDocumentTypes рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ рдФрд░ LSItemContentTypes рд╕рд░рдгреА рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝реЗрдВред рд╕реВрдЪрд┐рдпреЛрдВ рдФрд░ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдЖрдЗрдХрди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ QLThumbnailMinimumSize рдХреЛ 17 рд╕реЗ 16 рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ред QLPreviewHeight рдФрд░ QLPreviewWidth рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ - рдЗрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЬрдирд░реЗрдЯрд░ рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХрд░рддрд╛ рд╣реИред рдЖрдИрдкреАрдП рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рдЬрд┐рдк рдЖрд░реНрдХрд╛рдЗрд╡ рд╕реЗ рдХрдИ рдлрд╛рдЗрд▓реЗрдВ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЬреЛ рдХрд╛рдлреА рд▓рдВрдмрд╛ рд╕рдордп рд╣реИ (0.06 рд╕реЗ 0.12 рд╕реЗрдХреЗрдВрдб рддрдХ) - рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдкреНрд▓рд┐рд╕реНрдЯ рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХрд╛ рдЬрдирд░реЗрдЯрд░ рдЬрд▓реНрджреА рд╕реЗ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рджреЗрддрд╛ рд╣реИ, рддреЛ рд╕рд┐рд╕реНрдЯрдо рдЙрд╕ рдЫрд╡рд┐ рдпрд╛ HTML рд╕реЗ рд╡рд┐рдВрдбреЛ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓ рджреЗрдЧрд╛ рдЬреЛ рдЖрдк рджреЗрдВрдЧреЗред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк obj-c рдФрд░ Foundation рд╡рд░реНрдЧ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ GenerateThumbnailForURL.c GeneratePreviewForURL.c рдХреЛ GenerateThumbnailForURL.m GeneratePreviewForURL.m рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ GenerateThumbnailForURL.m GeneratePreviewForURL.m рдЕрдкрдиреЗ рд╣реЗрдбрд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
 #import <Foundation/Foundation.h> #import <Cocoa/Cocoa.h> 


рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рджреЛрдиреЛрдВ рдЖрдЗрдХрди (GenerateThumbnailForURL) рдФрд░ рдПрдХ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╡рд┐рдВрдбреЛ (GeneratePreviewForURL) рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдореИрдВрдиреЗ Shared.h / m рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╢рд╛рдорд┐рд▓ / рдЖрдпрд╛рдд рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ред рдореИрдВ рдЕрдкрдирд╛ Shared.h рд▓рд╛рддрд╛ рд╣реВрдВ:
 #include <CoreFoundation/CoreFoundation.h> #include <CoreServices/CoreServices.h> #include <QuickLook/QuickLook.h> #import <Foundation/Foundation.h> #import <Cocoa/Cocoa.h> #import <Security/Security.h> #import <NSBezierPath+IOS7RoundedRect.h> static NSString * const kPluginBundleId = @"com.FerretSyndicate.ProvisionQL"; static NSString * const kDataType_ipa = @"com.apple.itunes.ipa"; static NSString * const kDataType_app = @"com.apple.application-bundle"; static NSString * const kDataType_ios_provision = @"com.apple.mobileprovision"; static NSString * const kDataType_ios_provision_old = @"com.apple.iphone.mobileprovision"; static NSString * const kDataType_osx_provision = @"com.apple.provisionprofile"; #define SIGNED_CODE 0 NSImage *roundCorners(NSImage *image); NSImage *imageFromApp(NSURL *URL, NSString *dataType, NSString *fileName); NSString *mainIconNameForApp(NSDictionary *appPropertyList); int expirationStatus(NSDate *date, NSCalendar *calendar); 

рдкреНрд░реЛрд╡реЛрд╕рд┐рдВрдХрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдЕрдВрддрд┐рдо рд╕рдВрд░рдЪрдирд╛:


NSBezierPath + IOS7RoundedRect - рдПрдХ рд╡рд░реНрдЧ рд╕реЗ iOS7 рдЧреЛрд▓ рдЖрдЗрдХрди рдХрд╛рдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
Install.sh - рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп рдЬрдирд░реЗрдЯрд░ рдХреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ:
 #!/bin/sh PRODUCT="${PRODUCT_NAME}.qlgenerator" QL_PATH=~/Library/QuickLook/ rm -rf "$QL_PATH/$PRODUCT" test -d "$QL_PATH" || mkdir -p "$QL_PATH" && cp -R "$BUILT_PRODUCTS_DIR/$PRODUCT" "$QL_PATH" qlmanage -r echo "$PRODUCT installed in $QL_PATH" 

рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓рдХреНрд╖реНрдп рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдЬрд╛рдПрдВ, рд╕рдВрдкрд╛рджрдХ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ> рдирд┐рд░реНрдорд╛рдг рдЪрд░рдг рдЬреЛрдбрд╝реЗрдВ> рдореЗрдиреВ рд╕реЗ рд░рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрд┐рд▓реНрдб рдЪрд░рдг рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкрде рджрд░реНрдЬ рдХрд░реЗрдВ:


рдЖрдкрдХреЛ рдкреНрд▓рдЧрдЗрди рдХреЛ рдбреАрдмрдЧ рдХрд░рдирд╛ рднреА рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рд╣реИ - рдЖрдкрдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдпреЛрдЬрдирд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдпреЛрдЬрдирд╛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ ...> рд░рди> рдЬрд╛рдирдХрд╛рд░реА> рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп> рдЕрдиреНрдп> Cmd + Shft + G> / usr / bin /> Go> qlmanage рджрдмрд╛рдПрдВред


рдлрд┐рд░, рддрд░реНрдХ рдЯреИрдм рдореЗрдВ, рдЖрд░рдВрднрд┐рдХ рддрд░реНрдХреЛрдВ рдореЗрдВ -t рдЭрдВрдбрд╛ (рдбрд┐рдмрдЧрд┐рдВрдЧ рдЖрдЗрдХрди рдХреЗ рд▓рд┐рдП) рдпрд╛ -p (рдбрд┐рдмрдЧрд┐рдВрдЧ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреЗ рд▓рд┐рдП) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдкрде (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ .ipa рдкрд░ рдЖрдЗрдХрди рд░реЗрдВрдбрд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:


рдЖрдЗрдХрди рдЬрдирд░реЗрд╢рди


рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рдЖрдЗрдХрди ( defaultIcon.png ) рдХреЛ рдХреИрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП ред рдкреНрд░реЛрд╡рд┐рдПрдирд╕реАрдПрд▓ рдЖрдИрдкреАрдП рдлрд╛рдЗрд▓ рд╕реЗ рдЖрдЗрдХрди рдЪрдпрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЙрдкрдХрд░рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдкреНрд░рд╛рд╡рдзрд╛рди рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рд╕реНрдерд┐рддрд┐ (рд╕рдорд╛рдкреНрдд рдпрд╛ рдирд╣реАрдВ) рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рд╕рдорд╛рдкреНрдд GenerateThumbnailForURL.m :
 #import "Shared.h" OSStatus GenerateThumbnailForURL(void *thisInterface, QLThumbnailRequestRef thumbnail, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options, CGSize maxSize); void CancelThumbnailGeneration(void *thisInterface, QLThumbnailRequestRef thumbnail); /* ----------------------------------------------------------------------------- Generate a thumbnail for file This function's job is to create thumbnail for designated file as fast as possible ----------------------------------------------------------------------------- */ OSStatus GenerateThumbnailForURL(void *thisInterface, QLThumbnailRequestRef thumbnail, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options, CGSize maxSize) { @autoreleasepool { NSString *dataType = (__bridge NSString *)contentTypeUTI; NSImage *appIcon; if([dataType isEqualToString:kDataType_app] || [dataType isEqualToString:kDataType_ipa]) { NSURL *iconURL = [[NSBundle bundleWithIdentifier:kPluginBundleId] URLForResource:@"defaultIcon" withExtension:@"png"]; appIcon = [[NSImage alloc] initWithContentsOfURL:iconURL]; } else { return noErr; } if (QLThumbnailRequestIsCancelled(thumbnail)) { return noErr; } NSSize canvasSize = appIcon.size; NSRect renderRect = NSMakeRect(0.0, 0.0, appIcon.size.width, appIcon.size.height); CGContextRef _context = QLThumbnailRequestCreateContext(thumbnail, canvasSize, false, NULL); if (_context) { NSGraphicsContext* _graphicsContext = [NSGraphicsContext graphicsContextWithGraphicsPort:(void *)_context flipped:NO]; [NSGraphicsContext setCurrentContext:_graphicsContext]; [appIcon drawInRect:renderRect]; //draw anything you want here QLThumbnailRequestFlushContext(thumbnail, _context); CFRelease(_context); } } return noErr; } void CancelThumbnailGeneration(void *thisInterface, QLThumbnailRequestRef thumbnail) { // Implement only if supported } 

рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:


рдкреАрдврд╝реА рдХрд╛ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХрд░реЗрдВ


рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо HTML рдХреЛ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреЗ рд░реВрдк рдореЗрдВ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рджреЗрдЦреЗрдВрдЧреЗред
рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕рд╛рдБрдЪрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред (рд╡рд╣рд╛рдБ рдЖрдк рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП рд╢реИрд▓рд┐рдпрд╛рдБ рднреА рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ):
 <!DOCTYPE html> <html lang="en"> <body> <div> <h1>App info</h1> Name: <strong>__CFBundleDisplayName__</strong><br /> Version: __CFBundleShortVersionString__ (__CFBundleVersion__)<br /> BundleId: __CFBundleIdentifier__<br /> </div> </body> </html> 

рд╕рдм рдХреБрдЫ рдЬрд┐рд╕реЗ __KEY__ рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд╣ рдЬрдирд░реЗрдЯрд░ рд╕реЗ рднрд░рд╛ рдЬрд╛рдПрдЧрд╛ред

рдореИрдВ рдЕрдВрддрд┐рдо GeneratePreviewForURL.m рд▓рд╛рддрд╛ рд╣реВрдВ:
 #import "Shared.h" OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options); void CancelPreviewGeneration(void *thisInterface, QLPreviewRequestRef preview); /* ----------------------------------------------------------------------------- Generate a preview for file This function's job is to create preview for designated file ----------------------------------------------------------------------------- */ OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options) { @autoreleasepool { NSURL *URL = (__bridge NSURL *)url; NSString *dataType = (__bridge NSString *)contentTypeUTI; NSData *appPlist = nil; if([dataType isEqualToString:kDataType_app]) { // get the embedded plist for the iOS app appPlist = [NSData dataWithContentsOfURL:[URL URLByAppendingPathComponent:@"Info.plist"]]; } else if([dataType isEqualToString:kDataType_ipa]) { // get the embedded plist from an app archive using: unzip -p <URL> <files to unzip> (piped to standart output) NSTask *unzipTask = [NSTask new]; [unzipTask setLaunchPath:@"/usr/bin/unzip"]; [unzipTask setStandardOutput:[NSPipe pipe]]; [unzipTask setArguments:@[@"-p", [URL path], @"Payload/*.app/Info.plist"]]; [unzipTask launch]; [unzipTask waitUntilExit]; appPlist = [[[unzipTask standardOutput] fileHandleForReading] readDataToEndOfFile]; } else { return noErr; } if(QLPreviewRequestIsCancelled(preview)) { return noErr; } NSMutableDictionary *synthesizedInfo = [NSMutableDictionary dictionary]; NSURL *htmlURL = [[NSBundle bundleWithIdentifier:kPluginBundleId] URLForResource:@"template" withExtension:@"html"]; NSMutableString *html = [NSMutableString stringWithContentsOfURL:htmlURL encoding:NSUTF8StringEncoding error:NULL]; NSDictionary *appPropertyList = [NSPropertyListSerialization propertyListWithData:appPlist options:0 format:NULL error:NULL]; [synthesizedInfo setObject:[appPropertyList objectForKey:@"CFBundleDisplayName"] forKey:@"CFBundleDisplayName"]; [synthesizedInfo setObject:[appPropertyList objectForKey:@"CFBundleIdentifier"] forKey:@"CFBundleIdentifier"]; [synthesizedInfo setObject:[appPropertyList objectForKey:@"CFBundleShortVersionString"] forKey:@"CFBundleShortVersionString"]; [synthesizedInfo setObject:[appPropertyList objectForKey:@"CFBundleVersion"] forKey:@"CFBundleVersion"]; for (NSString *key in [synthesizedInfo allKeys]) { NSString *replacementValue = [synthesizedInfo objectForKey:key]; NSString *replacementToken = [NSString stringWithFormat:@"__%@__", key]; [html replaceOccurrencesOfString:replacementToken withString:replacementValue options:0 range:NSMakeRange(0, [html length])]; } NSDictionary *properties = @{ // properties for the HTML data (__bridge NSString *)kQLPreviewPropertyTextEncodingNameKey : @"UTF-8", (__bridge NSString *)kQLPreviewPropertyMIMETypeKey : @"text/html" }; QLPreviewRequestSetDataRepresentation(preview, (__bridge CFDataRef)[html dataUsingEncoding:NSUTF8StringEncoding], kUTTypeHTML, (__bridge CFDictionaryRef)properties); } return noErr; } void CancelPreviewGeneration(void *thisInterface, QLPreviewRequestRef preview) { // Implement only if supported } 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рд╣рдо Info.plist рдХреЛ рдЦреЛрд▓рддреЗ рд╣реИрдВ (рдпрд╛ рдЗрд╕реЗ рдЖрд░реНрдХрд╛рдЗрд╡ рд╕реЗ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ), рдлрд┐рд░ рд╣рдо рдЗрд╕рдореЗрдВ рд╕реЗ рдХреБрдЫ рдбреЗрдЯрд╛ рдХреЛ synthesizedInfo рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред synthesizedInfo рд╕реЗ рд╕рднреА рдХреБрдВрдЬреА рддрджрдиреБрд╕рд╛рд░ рд╕реЗрдЯ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЬреЛ template.html .html рд╕реЗ рднрд░реА рд▓рд╛рдЗрди рдореЗрдВ рд╣реЛрддреА template.html ред рдкрд░рд┐рдгрд╛рдореА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде qlmanage рдореЗрдВ рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ HTML рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕ рдЧрд╛рдЗрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЖрдк рдЕрдкрдиреЗ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП рдпрд╛ рдХрд┐рд╕реА рднреА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП рддреНрд╡рд░рд┐рдд рд░реВрдк рд╕реЗ рджреЗрдЦрдиреЗ рдФрд░ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧ-рдЗрди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдорд╛рдирдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИред

ProvisionQL рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдкреНрд▓рдЧрдЗрди рдХрд╛рд░реНрдп рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╕реБрдЭрд╛рд╡ рдФрд░ рдкреВрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдЦреБрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

Source: https://habr.com/ru/post/In208552/


All Articles