一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して13日目です。クリックしてイベントの詳細をご覧ください。
前書き
-
iOSが写真をアルバムに保存するための要件:WeChat認証QRコードインターフェイスで、[アルバムに保存]ボタンを追加し、[完了]をクリックしてコアビューレターをアルバムに保存します。
-
NSFileManagerクラスのファイルの操作要件背景:WeChatロボットを切り替えるときは、iOSWeChatアプリのサンドボックスファイルとディレクトリをバックアップします
写真を保存します
//参数1:图片对象
//参数2:成功方法绑定的target
//参数3:成功后调用方法
//参数4:需要传递信息(成功后调用方法的参数) 一般写nil
UIImageWriteToSavedPhotosAlbum(self.imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
复制代码
要件:コードカード機器(電子スタンディングカード、静的コードカード、コードカードスピーカーオールインワンマシンを含む)は、支払いのためにQRコードを表示およびダウンロードする機能を向上させます
1.1画像オブジェクトを直接保存する
- 例1
- (IBAction)saveClick:(UIButton *)sender {
//参数1:图片对象
//参数2:成功方法绑定的target
//参数3:成功后调用方法
//参数4:需要传递信息(成功后调用方法的参数) 一般写nil
UIImageWriteToSavedPhotosAlbum(self.imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
/* 1.先保存图片到【相机胶卷】(不能直接保存到自定义相册中)
1> C语言函数
2> AssetsLibrary框架 (iOS4支持,iOS9.0被废弃)
3> Photos框架 (iOS 8.0支持 推荐使用)
2.拥有一个【自定义相册】
1> AssetsLibrary框架
2> Photos框架
3.将刚才保存到【相机胶卷】里面的图片引用到【自定义相册】
1> AssetsLibrary框架
2> Photos框架
*/
}
#pragma mark -- <保存到相册>
-(void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
NSString *msg = nil ;
if(error){
msg = @"保存图片失败" ;
}else{
msg = @"保存图片成功" ;
}
}
复制代码
1.2アルバムを表示し続ける
- 例2:アルバムを表示し続ける
マーチャント名とWeChatマーチャントアカウント情報を保持します
//保存图片
- (void)saveImageToPicture {
UIGraphicsBeginImageContextWithOptions(self.penView.canvasView.bounds.size, NO, 0.0);
CGContextRef ctx = UIGraphicsGetCurrentContext();
[self.penView.canvasView.layer renderInContext:ctx];
self.saveImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//保存到相册
UIImageWriteToSavedPhotosAlbum(self.saveImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
return;
}
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
NSString *msg = @"保存成功";
if (error != nil) {
msg = @"保存失败!";
}
UIAlertController *alertVc = [UIAlertController alertControllerWithTitle:@"" message:msg preferredStyle:UIAlertControllerStyleAlert];
[alertVc addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
}]];
[self presentViewController:alertVc animated:YES completion:nil];
}
复制代码
効果:
II。関連する補助ツール
2.1許可の検証を行う
- 利用方法
// 检测摄像头
if(![QCTLocationServiceUtil isHasCameraAuthorityWithisShowAlert:YES]){
return ;
}
// 做相册权限校验
if(![QCTLocationServiceUtil isHasPhotoLibraryAuthorityWithisShowAlert:YES]){
return ;
}
复制代码
- アルバムの許可チェックを行う
+(BOOL)isHasPhotoLibraryAuthorityWithisShowAlert:(BOOL)showAlert
{
ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];
if (status == ALAuthorizationStatusRestricted || status == ALAuthorizationStatusDenied) {
NSLog(@"LBLog 没有访问图库的权限==============");
if (showAlert) {
[LBAlertController showAlertTitle:@"无法使用相册" content:@"请在iPhone的\"设置-隐私-照片\"中允许访问照片。" cancelString:@"取消" cancleBlock:nil sureString:@"去设置" sureBlock:^{
// 需要在info.plist中添加 URL types 并设置一项URL Schemes为prefs IOS10 以后不起作用 else的方法
if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]){
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
} currentController:[DY_Common getCurrentVC]];
}
return NO;
}else if(status == ALAuthorizationStatusNotDetermined){
}
return YES;
}
复制代码
- カメラの許可の確認を行う
/**
去设置相机权限的的时候系统会kill 当前app进程 Message from debugger: Terminated due to signal 9
@param showAlert <#showAlert description#>
@return <#return value description#>
*/
+(BOOL)isHasCameraAuthorityWithisShowAlert:(BOOL)showAlert
{
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (status == AVAuthorizationStatusRestricted || status == AVAuthorizationStatusDenied) {
NSLog(@"LBLog 没有访问相机的权限");
if (showAlert) {
[LBAlertController showAlertTitle:@"无法使用相机" content:@"请在iPhone的\"设置-隐私-相机\"中允许访问相机。" cancelString:@"取消" cancleBlock:nil sureString:@"去设置" sureBlock:^{
// 需要在info.plist中添加 URL types 并设置一项URL Schemes为prefs IOS10 以后不起作用
if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]){
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
} currentController:[DY_Common getCurrentVC]];
return NO;
}else if (status == AVAuthorizationStatusNotDetermined){
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
if (granted) {
NSLog(@"LBLog 获取相机权限正常==============");
}else{
NSLog(@"LBLog 获取相机权限不正常==============");
}
}];
}
}
NSLog(@"LBLog 有访问相机的权限 =============");
return YES;
}
复制代码
2.2Base64からUIImageへ
- Base64からUIImageへ
+ (UIImage *)stringToImage:(NSString *)str {
NSData * imageData =[[NSData alloc] initWithBase64EncodedString:str options:NSDataBase64DecodingIgnoreUnknownCharacters];
UIImage *photo = [UIImage imageWithData:imageData ];
return photo;
}
复制代码
2.3現在のVCインターフェースを別のVCの背景画像として使用する
システム独自のモーダルスタイルを使用します:UIModalPresentationOverCurrentContext
- コンテンツが別のViewControllerのコンテンツの上に表示されるプレゼンテーションスタイル)
———————————————著作権ステートメント:この記事は、CSDNブロガー「iOSReverse」の元の記事です。CC4.0> BY-SAの著作権契約に従い、元のソースリンクを添付してくださいそしてこの声明。元のリンク:blog.csdn.net/z929118967/…
III参照:ビデオのダウンロードとアルバムへの保存
1. dataWithContentsOfURLを使用してビデオをダウンロードし、アルバムに保存します
2.サンドボックスから情報を取得します。NSFileManagerクラスは主にファイルを操作します(削除、変更、移動、コピーなど)。NSFileHandleクラスは主にファイルの内容を読み書きします。
————————————————
著作権に関する声明:この記事は、CSDNブロガー「#publicaccount:iOSReverse」によるオリジナルの記事であり、CC 4.0 BY-SAの著作権契約に準拠しています。転載するには、元のソースリンクとこの声明を添付してください。元のリンク:blog.csdn.net/z929118967/…
3.1ビデオのダウンロードとアルバムへの保存
- dataWithContentsOfURLを使用してビデオをダウンロードし、アルバムに保存します
NSFileManager *fileManage = [NSFileManager defaultManager];
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:videoUrl]];
if (data == nil)
{
NSLog(@"网络出错,请稍后再试");
}
else
{
//用单例类 NSFileManager的对象,将文件写入本地
BOOL isSuccess = [fileManage createFileAtPath:path contents:data attributes:nil];
if (isSuccess)
{
NSLog(@"视频下载成功");
// 保存视频到相册
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeVideoAtPathToSavedPhotosAlbum:[NSURL fileURLWithPath:path]
completionBlock:^(NSURL *assetURL, NSError *error) {
if (error) {
NSLog(@"Save video fail:%@",error);
} else {
//2018-09-13 20:03:33.870 WeChat[6484:1077151] [MMVideoCompressHelper getCacheFilePathFrom:file:///var/mobile/Media/DCIM/100APPLE/IMG_0041.mp4 ]
NSLog(@"Save video succeed.:%@",assetURL);//assets-library://asset/asset.mp4?id=45C3D675-C625-4C52-B133-66D0A709AC57&ext=mp4
// 获取相册的最新一条视频的path,进行SightDraft的创建
}
}];
}
else
{
NSLog(@"视频下载失败");
}
复制代码
3.2ファイルに対するNSFileManagerクラスの操作:削除、変更、移動、コピー
- [sbtweakで特定のアプリのサンドボックスパスに特定のファイルをコピーします]
<script src="https://gist.github.com/zhangkn/74ce4737a33221228244b9b18f8e545a.js"></script>
%new
- (void)setupkeyword{// /var/mobile/Media/keyword.txt -> sanboxpath/Documents/keyword.txt
SBApplicationController *sbApplicationCtrl=[%c(SBApplicationController) sharedInstance];
id app = [sbApplicationCtrl applicationWithBundleIdentifier:@"com.tencent.xin"];
NSString *contentUserIDURL = [app sandboxPath];
//Library
//Documents
//tmp keyword.txt
NSString *realFile = [[contentUserIDURL stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"keyword.txt"];
//拷贝文件到这个地方,即可
//从某个路径读取文件内容 最好放在 /var/mobile/Media/keyword.txt -> realFile
NSLog(@"knrealFile %@",realFile);
NSString *tmpfile = @"/var/mobile/Media/keyword.txt";
NSString *content = [NSString stringWithContentsOfFile:tmpfile encoding:NSUTF8StringEncoding error:nil];
NSData *data = [content dataUsingEncoding: NSUTF8StringEncoding];
//写到目标文件
[data writeToFile:realFile atomically:YES];//覆盖
}
复制代码
- enumeratorAtPathを使用して、NSDirectoryEnumeratorディクショナリをトラバースします
- contentsOfDirectoryAtPathを使用して、ファイル配列をトラバースします
#import "KNdelateDirTool.h"
@implementation KNdelateDirTool
//利用enumeratorAtPath,便利NSDirectoryEnumerator 字典
static id setupdeletedir(NSString* path) {
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError* err = nil;
NSDirectoryEnumerator *dirEnum = [fileManager enumeratorAtPath:path];//获取NSDictionary
NSString *file;
while ((file = [dirEnum nextObject]))//遍历NSDictionary
// if ([file hasSuffix:@"/Documents"] || [file hasSuffix:@"/Library"] || [file hasSuffix:@"/tmp"] || [file hasSuffix:@"/StoreKit"]) 过滤条件
{
[fileManager removeItemAtPath:[path stringByAppendingPathComponent:file] error:&err];
// [fileManager createDirectoryAtPath:[path stringByAppendingPathComponent:file] withIntermediateDirectories:NO attributes:[NSDictionary dictionaryWithObjectsAndKeys:@"mobile", NSFileOwnerAccountName, @"mobile", NSFileGroupOwnerAccountName, nil] error:nil];
if (err) {
NSLog(@"setupdeletedir err:%@", err);
return @[@(NO), err];// 失败和错误信息
}
}
return @[@(YES)];// 成功
}
//利用contentsOfDirectoryAtPath,遍历files数组
static id kncleanDir(NSString* path, NSString* reg) {
NSFileManager *fm = [NSFileManager defaultManager];
NSArray *files = [fm contentsOfDirectoryAtPath:path error:NULL];
for (NSString* file in files) {
if (knmathFile(file, reg)) {// 正则表达式进行过滤,利用NSPredicate 实现,更多信息请看这里:谓词NSPredicate技术的应用。https://blog.csdn.net/z929118967/article/details/74066170
NSString* fullpath = [path stringByAppendingPathComponent:file];//路径的拼接
NSError* err = nil;
[fm removeItemAtPath:fullpath error:&err];//移除
if (err) {
NSLog(@"kncleanDir err:%@", err);
return @[@(NO), err];
}
}
}
return @[@(YES)];
}
//谓词技术的使用 evaluateWithObject
static BOOL knmathFile(NSString* file, NSString* reg) {
if (!reg)
return YES;
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",reg];
return [predicate evaluateWithObject:file];
}
@end
复制代码
- 他のコードスニペット
コード:KNiosreTool存储一些逆向分析的工具代码片段: 清理文件、自动登录Wi-Fi
github.com/kunnan/KNio…リソースを入手するには、公式アカウントをフォローしてください:iOS Reverse