iPhone マルチスレッドを1つだけにする

最近iPhoneの記事が多いですが・・・。

iPhoneアプリが起動時にサブプロセスを起動させて、何かと重たい処理はそっちにお願いみたいなことはよくやりたいと思いますが、単純に起動時にサブプロセスを作っていると、アクティブ、非アクティブと変更しているといつの間にか複数プロセスがごろごろ。

原因は生成するタイミングにあった訳ですが。
・アクティブ時にログイン認証を行う
・ログイン認証が終わったタイミングで生成

要するにアクティブになったタイミングで次々とプロセスを生成していました。

そこで生成する箇所で既に生成済みの場合はプロセスを生成しないようにしました。
念のため、同期処理の宣言を入れてます。


@synchronized(self) {
        if (!_existsDaemon) {
            _existsDaemon = YES;
            // サブスレッドを作成する
            [NSThread detachNewThreadSelector:@selector(_startDaemon) toTarget:self withObject:nil];
        }
    }

iPhone ツールバーを均等に配置する

ツールバーにボタンなどを単純に追加すると、左寄せになってしまう。





UIToolbar* toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 480-44, 320, 44)];
 UIBarButtonItem* prevButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRewind target:self action:@selector(clickPrev)];
    UIBarButtonItem* nextButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFastForward target:self action:@selector(clickNext)];
    UIBarButtonItem* space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    [toolBar setItems:[NSArray arrayWithObjects:space, prevButton, space, nextButton, space, nil]];



それを均等にする方法




間にUIBarButtonSystemItemFlexibleSpaceを入れるだけ。


UIToolbar* toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 480-44, 320, 44)];
    UIBarButtonItem* prevButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRewind target:self action:@selector(clickPrev)];
    UIBarButtonItem* nextButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFastForward target:self action:@selector(clickNext)];
    UIBarButtonItem* space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    [toolBar setItems:[NSArray arrayWithObjects:space, prevButton, space, nextButton, space, nil]];

iPhone 複数画像スライド、拡大縮小させる

完成系のイメージはiPhoneのアルバム。

複数画像がある状態で、
1.フリック動作で次の画像、前の画像がみれる
2.2本の指で拡大縮小ができる
3.(できれば)ステータスバーやツールバーが自動的に消える

を作りたいなーと思い、いろいろ調べながら試行錯誤した内容を書きます。

1.フリック動作で次の画像、前の画像がみれる

これはUIScrollViewのプロパティーを設定する。
pagingEnabled ページング
showsHorizontalScrollIndicator 横スクロールバー
showsVerticalScrollIndicator 縦スクロールバー
scrollsToTop ステータスバーをタップしたときにTOPに戻る(今回は横ページ遷移のため特にいらない)

各ページのx座標をずらしてaddSubviewすればOK
1ページ目 CGRextMake(0, 0, 320, 480);
2ページ目 CGRextMake(320, 0, 320, 480);
3ページ目 CGRextMake(640, 0, 320, 480);
のような感じで。


UIScrollView* scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
    scrollView.pagingEnabled = YES;
    scrollView.showsHorizontalScrollIndicator = NO;// 横スクロールバー非表示
    scrollView.showsVerticalScrollIndicator = NO; // 縦スクロールバー非表示
    scrollView.scrollsToTop = NO; // ステータスバーのタップによるトップ移動禁止

    NSArray* imageNames = [NSArray arrayWithObjects:@"image2.jpeg", @"image1.jpeg", @"image3.jpeg", nil];
    int imageNum = [imageNames count];
    for (int i=0; i < imageNum; i++) {
        UIImage* image = [UIImage imageNamed:[imageNames objectAtIndex:i]];
        UIImageView* imageView = [[[UIImageView alloc] initWithImage:image] autorelease];
        CGSize size = CGSizeMake(MIN(image.size.width, 320), MIN(image.size.height, 480));
        imageView.frame = CGRectMake(320*i + (320 - size.width) / 2, 0 + (480 - size.height) / 2, size.width, size.height);
        [scrollView addSubview:imageView];
    }
    [scrollView setContentSize:CGSizeMake(320*imageNum, 480)];
    [self.view addSubview:scrollView];

iPhone SHA1、SHA256の生成

iPhoneでSHA1、SHA256の生成方法。
調べてもあまり出てこないので、ちょっとあっているのか不安ですが、簡単な文字列の比較では問題ない感じでした。


+(NSString*) sha1ForStr:(NSString *)str {
 const char *c = [str UTF8String];
    unsigned char result[CC_SHA1_DIGEST_LENGTH];
    CC_SHA1(c, strlen(c), result);
    NSMutableString* strs = [NSMutableString string];
    for (int i=0; i < CC_SHA1_DIGEST_LENGTH; i++) {
        [strs appendFormat:@"%02x", result[i]];
    }
    return strs;
}

+(NSString*) sha256ForStr:(NSString *)str {
 const char *c = [str UTF8String];
    unsigned char result[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(c, strlen(c), result);
    NSMutableString* strs = [NSMutableString string];
    for (int i=0; i < CC_SHA256_DIGEST_LENGTH; i++) {
        [strs appendFormat:@"%02x", result[i]];
    }
    return strs;
}

ちなみにperlでは
perl -MDigest::SHA -e 'print Digest::SHA::sha1_hex("aaa"), "\n"'
perl -MDigest::SHA -e 'print Digest::SHA::sha256_hex("aaa"), "\n"'
です。

ReactNativeでAndroid対応する話

前提 ReactNativeでiOS版のアプリをリリースしていて、Android版をリリースする話 トラブルシューティング Build.VERSION_CODES.Q が存在しないエラー compileSdkVersionを29以上にすると解決 メモリー足りないエラー Execu...