月別アーカイブ: 2016年6月

【iTunes】のデバイスのバックアップ先を変更。

最近のiPhoneの容量増大は著しい。
古いMacや割高なSSDを使っているとmac本体の内臓HDDにはバックアップしきれない。
そこで、外付けHDDにバックアップされるようにする。

参考サイト
Mac OS X iPhoneのバックアップファイルの保存場所を変更する | The Days of My Life
iPhone/iPadのバックアップの保存先を外付けHDDに変える方法【Mac OS:Mountain lion】

上記サイトを見ながらやってみたのだがターミナルのそうだがビミョーんに違ったので記録しておく。

まず、標準でiTunesからのバックアップはライブラリの中の、Application Supportフォルダの中の、MobileSyncフォルダの中のBackupという名前のフォルダに作られる。

ライブラリ/Application Support/MobileSync/Backup

このBackupという名前のフォルダをシンボリックリンクで外に作るのが目的。
ちなみに最近のMacOSではFinderでoptionを押しながらメニューの移動を選択しないとアクセス出来ないので注意!。

んで、外付けHDDにリンク先となるBackupフォルダを作っておく。名前が違うとバックアップされないようだ。
すでにitunesをしばらく使っていて中になんやかんや入っている場合はそのまま外付けHDDにコピーする。
【追記】シンボリックリンクのフォルダが作られるMobileSyncフォルダの中のBackupというフォルダはこの時点で削除するか別の場所に避難させておく。
MobileSyncフォルダの中にBackupというシンボリックリンクのフォルダを作成するため、古い同名のフォルダが有るとエラーで作成できない。

ターミナルを起動し、ln -sでシンボリックリンクを作る。

ln -s(スペース)リンク先のフォルダ(スペース)リンク元のフォルダがはいるフォルダ
となる。

ややこしいな。ww

実際にはターミナルでのコマンドは
$ ln -s /Volumes/SAMSUNG\ 1TB/ios_buckup/Backup /Users/(ユーザ名)/Library/Application\ Support/MobileSync

とゆーかんじ。

これで内臓HDDのMobileSyncフォルダに外付けHDDのBackupフォルダへのシンボリックリンクができるはず。

自分用の備忘録でした。

共有フォルダなどに新しいフォルダ(ディレクトリ)を作る。

参考サイト

[XCODE] NSFileManagerを用いてディレクトリを作成する、ファイルを保存する – YoheiM .NET

NSFileManagerの「createDirectoryAtPath:withIntermediateDireotries:attributes:error:」を用いることで、 ディレクトリを作成できます。だそうです。

参考サイトではcashフォルダに新規フォルダを作ってますがここではDocumentsフォルダに新規フォルダを作って画像ファイルを保存します。

-(void)sharedFileSave:(UIImage *)sender
{
    NSLog(@"しぇあどふぁいるせーぶ");
    //保存する画像をPNGでnsdataに変換?
    UIImage *image = sender;
    NSData *data = UIImagePNGRepresentation(image);
    
    //ドキュメントフォルダ(共有フォルダ)のパスの取得
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *DocumentsDirPath = [paths lastObject];//これがドキュメントフォルダ(共有フォルダ)のパスになるらしい。
    
    // 続いて、新規で作るディレクトリの絶対パスを作成します。
    NSString *newDocumentsDirPath = [DocumentsDirPath stringByAppendingPathComponent:@"sampleDirectory"];
    
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error = nil;
    BOOL created = [fileManager createDirectoryAtPath:newDocumentsDirPath
                          withIntermediateDirectories:YES
                                           attributes:nil
                                                error:&error];
    // 作成に失敗した場合は、原因をログに出します。
    if (!created) {
        NSLog(@"failed to create directory. reason is %@ - %@", error, error.userInfo);
    }
    
    //保存する名前を決める。
    NSString *exportFilename = @"sample2.png";
    
    //保存先のパスと名前を合体させたパスを作成。
    NSString *exportFilePath = [newDocumentsDirPath stringByAppendingPathComponent:exportFilename];
    
    ;
    if ([data writeToFile: exportFilePath atomically:YES]) {
        NSLog(@"ほぞんOK");
    } else {
        NSLog(@"ほぞんError");
    }
}

これを実行してiTunesでアプリの共有フォルダを見るとsampleDirectoryフォルダが出来ており、中にsample2.pngファイルが入っています。

UIImageをPNGで共有フォルダに保存する。

参考サイト
[XCODE] iPhoneで画像をアプリケーション内に保存するには – YoheiM .NET
UIImage document保存, 取得 – Ryusuke Fuda’s Tech Blog
UIImageの画像データをPNGファイルに保存する方法 – 強火で進め

UIImagePNGRepresentationと、
writeToFile: atomically: ってとこがキモかな。

-(void)sharedFileSave:(UIImage *)sender
{
    NSLog(@"しぇあどふぁいるせーぶ");
    //保存する画像をPNGでnsdataに変換?
    UIImage *image = sender;
    NSData *data = UIImagePNGRepresentation(image);
    
    //ドキュメントフォルダ(共有フォルダ)のパスの取得
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *DocumentsDirPath = [paths lastObject];//これがパスになるらしい。
    
    //保存する名前を決める。
    NSString *exportFilename = @"sample2.png";
    
    //保存先のパスと名前を合体させたパスを作成。
    NSString *exportFilePath = [DocumentsDirPath stringByAppendingPathComponent:exportFilename];
    
    ;
    if ([data writeToFile: exportFilePath atomically:YES]) {
        NSLog(@"ほぞんOK");
    } else {
        NSLog(@"ほぞんError");
    }
}

UIImageをカメラロールに保存する。

参考サイト
Objective-Cと戦うブログ: UIImageをフォトライブラリに保存する
iPhone:画像をライブラリに保存するメソッドUIImageWriteToSavedPhotosAlbumの注意事項 | mthr Blog+
UIImageをカメラロールに保存(iOS, Objective-C) – nktmemo

コードとしては
UIImageWriteToSavedPhotosAlbum(イメージ, self, @selector(完了時に呼ばれるメソッド), nil);
って感じ。
カメラロールに保存される場合はファイル名を指定できないぽい。

//画像を保存する
-(void)saveImage
{
    //保存したい画像
    UIImage *_saveImage = [UIImage imageNamed:@"image.png"];

    UIImageWriteToSavedPhotosAlbum(_saveImage, self, @selector(savingImageIsFinished:didFinishSavingWithError:contextInfo:), nil);
}

// 完了を知らせる
- (void) savingImageIsFinished:(UIImage *)_image didFinishSavingWithError:(NSError *)_error contextInfo:(void *)_contextInfo
{
    if(_error){//エラーのとき
        // コントローラを生成
        UIAlertController * ac =
        [UIAlertController alertControllerWithTitle:@"Error"
                                            message:@"Save failed ."
                                     preferredStyle:UIAlertControllerStyleAlert];
        
        
        // OK用のアクションを生成
        UIAlertAction * okAction =
        [UIAlertAction actionWithTitle:@"OK"
                                 style:UIAlertActionStyleDefault
                               handler:^(UIAlertAction * action) {
                                   // ボタンタップ時の処理
                                   NSLog(@"OK button tapped.");
                               }];
        
        // コントローラにアクションを追加
        [ac addAction:okAction];
        
        // アラート表示処理
        [self presentViewController:ac animated:YES completion:nil];
    }else{//保存できたとき
        return;
    }
}

iTunesとのファイル共有。アプリ側からファイルを呼び出す。

iPhoneアプリはiTunesからファイルを入れたり出したり共有ができる。
そのやり方を調べてみた。

参考サイト
iTunesを使ったファイル共有方法 – Qiita
アプリケーションからファイル共有のフォルダにアクセスするには? – Debian GNU/Linux 3.1 on PowerMac G4

何はともあれまずはInfo.Plistを開いて+ボタンで項目を増やし、”Application supports iTunes file shareing” を追加して、YESにする。

スクリーンショット 2016-06-17 16.20.59

これでiTunes側からファイルの共有が出来るようになる。
一度実機で起動すれば、iTunesでアクセスできるようになっているのがわかります。
とりあえず幾つか画像ファイルを入れてみた。

さて、まずはアプリ側から共有フォルダにあるこれらのファイルを呼び出したい。
いろいろなサイトを見てみたが理解力が足らんのかいまいちよくわからんかった。(^_^;)

わからんかったなりに並べて書いたのがこれ。

-(void) fileOpen
{
    //ドキュメントフォルダ(共有フォルダ)のパスの取得
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *DocumentsDirPath = [paths lastObject];//これがパスになるらしい。
    
    // ドキュメントディレクトリにあるファイルリストにする。
    NSError *error = nil;//?エラー?
    NSFileManager *fileManager = [NSFileManager defaultManager];//?ファイルマネージャ?
    //パスのディレクトリに有るファイル名をエラーが出るまで配列に入れてる?
    NSArray *files = [fileManager contentsOfDirectoryAtPath:DocumentsDirPath error:&error];
    
    //配列に入っている名前をあるだけログに書きだしてみる。
    for (NSString *file in files) {
        NSLog(@"file = %@", file);
    }
}

これでとりあえず共有フォルダに入っているファイルの名前の配列だけでも取り出せたかな。

【自作アプリ】iPhoneアプリ化!!アイビー・リーの25000ドルのアイデア-最もシンプルにして最もパワフルなタイムマネジメント術

2019年4月10日追記〜〜〜〜〜〜〜
別のアプリとして新しく作り直しました。
アイビー・リーの25000$のアイデア2 | iPhoneアプリ備忘録
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

あなたは、アイビー・リーの25000ドルのアイデアを知っていますか?

 
2016年7月16日追記。
Appleからのお達しによりアイコンが変わりました。/(^o^)\

今からおよそ100年前、ベスレヘム鉄鋼会社の社長チャールズ・シュワッブ氏に、パブリック・リレーションズの創始者と言われる経営コンサルタントのアイビー・リー氏が伝えたタイムマネジメント術。

アイビー・リー氏に3ヶ月試してから、ふさわしいと思われる額を支払ってくださいと言われ、3ヶ月後にチャールズ・シュワッブ氏が支払った額は、なんと25,000ドル。

100年前の25,000ドルは今の価値に直すとおおよそ5000万円。

そんな、「アイビー・リーの25,000ドルのアイデア」とか「アイビー・リー メソッド」と言われるタイムマネジメント術をアプリ化しました。

使い方は簡単です。

1、一日の仕事の終りか夜寝る前に、明日やるべき事を6つ書き留めて下さい。
IMG_6281
2、書き留めた事を優先順位の高い順に並べ替えます。
IMG_6290
3、翌日、仕事を始めたら1番目の事に集中して下さい。1番目が終われば2番目3番目と一日の時間がなくなるまで続けて下さい。Widgetからいつでも確認できます。
IMG_6283
4、全部出来そうに無くても今やっている仕事以外は気にしなくて大丈夫です。なぜなら重要度の高い仕事から順にやっているのですから。

5、1日が終わったら終了した仕事を削除し、また明日やるべき事を書き出しましょう。

これを繰り返して下さい。

シンプルだから続けられる。
シンプルだからパワフル。

やることが多くてパニックになってしまうという方にお勧めです。

CollectionViewControllerではなくてCollectionViewを使ってみる。

意外と情報が少なかったんで自分なりに試行錯誤した記録。
自分用のメモなので間違ってたらスマン。

参考にしたサイト。
でんきゾウの備忘録 • UICollectionViewを使ってみる

Single View Applicationでプロジェクト作成。

スクリーンショット 2016-06-14 10.20.20

ボタンとCollection Viewを設置。

スクリーンショット 2016-06-14 10.24.20

セルの中にimage Viewを設置。

スクリーンショット 2016-06-14 10.27.33

参考サイトにならい、UICollectionViewCellを継承してCollectionCellというクラスを作る。
スクリーンショット 2015-11-22 17.56.34
スクリーンショット 2015-11-22 17.56.42
スクリーンショット 2015-11-22 17.57.30
スクリーンショット 2015-11-22 17.58.43

CollectionCell.h
ヘッダファイルは、

#import <UIKit/UIKit.h>

@interface CollectionCell : UICollectionViewCell
{
    IBOutlet UIImageView *imageView;
}
- (void)setImage:(UIImage *)image;
@end

メソッドファイルは、

#import "CollectionCell.h"

@implementation CollectionCell
-(id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

-(void)setImage:(UIImage *)image
{
    imageView.image = image;
}
@end

と記述。

ボタンとコレクションビューのプロパティを作成
写真を入れる配列も作成。

#import "ShotViewController.h"
#import "CollectionCell.h"

NSMutableArray *objects;

@interface ShotViewController ()
@property (weak, nonatomic) IBOutlet UIButton *selectButton;
@property (weak, nonatomic) IBOutlet UICollectionView *photoCollectionView;

@end

続いてコレクションビューの主要部分

#pragma mark <UICollectionViewDataSource>

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    //#warning Incomplete method implementation -- Return the number of sections
    //セクションの数。
    return 1;
}


- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    //#warning Incomplete method implementation -- Return the number of items in the section
    //セルの数
    return objects.count;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    
    // Configure the cell
    CollectionCell *cell = (CollectionCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"Cell"forIndexPath:indexPath];
    
    UIImageView *imageView = cell.contentView.subviews[0];
    [imageView setImage:[objects objectAtIndex:indexPath.item]];
    
    return cell;
}

この辺はテーブルビューと似てますね。

上記のメソッドを入力したらdetaSourceとdelegateを接続。

スクリーンショット 2016-06-14 11.37.24

スクリーンショット 2016-06-14 11.37.29

セルのidentifierも設定する。

スクリーンショット 2016-06-14 11.36.33

続いて写真を選ぶ行程。
ボタンをアクション接続してそこからカメラロールへ写真を取りに行く。
戻ったら配列に入れてコレクションビューをリロードする。
ピッカーのためのdelegateセット。

#import "ShotViewController.h"
#import "CollectionCell.h"

NSMutableArray *objects;

@interface ShotViewController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate>
@property (weak, nonatomic) IBOutlet UIButton *selectButton;
@property (weak, nonatomic) IBOutlet UICollectionView *photoCollectionView;

@end

メソッド

#pragma mark 写真を選ぶ
- (IBAction)selectShot:(UIButton *)sender {
    
    [self cameraRollImagePicker];
}

- (void)cameraRollImagePicker
{
    //UIImagePickerのソースの選択。今回はカメラロールから。
    UIImagePickerControllerSourceType sourseType = UIImagePickerControllerSourceTypePhotoLibrary;
    
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.sourceType = sourseType;
    picker.delegate = self;
    [self presentViewController:picker animated:YES completion:NULL];
    
}

-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    //infoに選んだ写真が入っているので取得
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
    //配列の保存
    [objects addObject:image];
    //戻る処理。
    [self dismissViewControllerAnimated:YES completion:nil];
    //コレクションビューをリロード
    [_photoCollectionView reloadData];
}

これでボタンからカメラロールに行って写真を選んで戻ってコレクションビューに入れると言うのが出来た。

全体的なソースはこんな感じ。

#import "ShotViewController.h"
#import "CollectionCell.h"

NSMutableArray *objects;

@interface ShotViewController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate>
@property (weak, nonatomic) IBOutlet UIButton *selectButton;
@property (weak, nonatomic) IBOutlet UICollectionView *photoCollectionView;

@end

@implementation ShotViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    objects = [NSMutableArray array];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark <UICollectionViewDataSource>

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    //#warning Incomplete method implementation -- Return the number of sections
    //セクションの数。
    return 1;
}


- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    //#warning Incomplete method implementation -- Return the number of items in the section
    //セルの数
    return objects.count;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    //    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
    
    // Configure the cell
    CollectionCell *cell = (CollectionCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"Cell"forIndexPath:indexPath];
    
    UIImageView *imageView = cell.contentView.subviews[0];
    [imageView setImage:[objects objectAtIndex:indexPath.item]];
    
    return cell;
}

#pragma mark 写真を選ぶ
- (IBAction)selectShot:(UIButton *)sender {
    
    [self cameraRollImagePicker];
}

- (void)cameraRollImagePicker
{
    //UIImagePickerのソースの選択。今回はカメラロールから。
    UIImagePickerControllerSourceType sourseType = UIImagePickerControllerSourceTypePhotoLibrary;
    
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.sourceType = sourseType;
    picker.delegate = self;
    [self presentViewController:picker animated:YES completion:NULL];
    
}

-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    //infoに選んだ写真が入っているので取得
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
    //配列の保存
    [objects addObject:image];
    //戻る処理。
    [self dismissViewControllerAnimated:YES completion:nil];
    //コレクションビューをリロード
    [_photoCollectionView reloadData];
}


@end

【ツール】app store用のスクリーンショットをリサイズ。

appStore用のScreenshotをリサイズするのってめっちゃめんどくさいよね~。
ちょっとでも簡単に出来んかと。

参考サイト
[iOS][Mac]iOSアプリ申請時に必要なスクリーンショット画像のサイズとリサイズについて | Coffee Breakにプログラミング備忘録

imagetoolsってのが使いよかったです。
リサイズする写真を読み込んでリサイズを選び名前も指定できる。

スクリーンショット 2016-06-12 18.11.46

中々に良いです。

【ツール】app store用スクリーンショットをちょっとでも綺麗に。

app store用スクリーンショットで結構見栄えが変わる。
ダウンロード数も変わるかもしれない。
下記サイトは普通のスクリーンショットにiPhone本体の枠とコメントをつけた画像を作ることが出来る。

細かい機能を使うには有料だが、オーソドックスな使い方なら無料で使える。

Screenshot Builder – Create gorgeous images for the App Store or Google Play. | LaunchKit