ぜん通。

<ぜんつう>ネトゲとかソシャゲとか、雑記。

   
カテゴリー「iPhoneアプリ開発備忘録」の記事一覧

iTunesのコードをQRコードで入力するつーる。


仕事中にプロモーションコード(※1)でアプリのテストを良くする。
ただ、プロモーションコードをiPhoneで入力するのはめんどくさい。
だって「X2KT8WTFV57H...」みたいな文字列だし。
って事でちゃちゃっと作ったつーる。


プロモコード入力用QRコード発行つーる。
http://zen.sdbx.jp/codeQR/

コードを入力するためのコードを発行とは混乱しそうですが、プロモコードをこのツールでQRコードにすることで、iPhoneのQRコードアプリで読み取ることでiPhone上でコードを打たなくて済むようになってます。



※1 プロモーションコードとは
Appleの審査が通ったアプリをリリースをする直前に最終確認として、完全に本番と同じ状態のアプリをDLできるコード。
一つのアプリのリリースに100個までプロモーションコードを発行できる。

拍手[1回]

iOS8でのLocal通知。

iOS8から通知系がボタンやアクションの拡張がされているので、そのままの状態だとLocalNotificationが使えなくなるようです。

んで、iOS8から追加された通知用のカテゴリを実装して対応する必要があります。


//OSVer判定マクロ

#define SYSVER_OVER(x)     ([[[UIDevice currentDevice] systemVersion] compare:x options:NSNumericSearch] != NSOrderedAscending)



//アプリ起動時に通知タイプとカテゴリを作っておく

//毎回登録する必要なし

if (SYSVER_OVER(@"8.0")) {

// 通知のユーザー設定を登録

       UIUserNotificationType types = UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound;

       UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];

       [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];

       

// アクションの設定

       UIMutableUserNotificationAction *acceptAction = [[UIMutableUserNotificationAction alloc] init];

       acceptAction.identifier = @"COLTTO_LOCAL_NOTIFICATION"; //アクション設定の識別子:受信時の判定に使用

       acceptAction.title = @"Accept"; //ボタンタイトル。一つのアクションだけだと表示されない

       acceptAction.activationMode = UIUserNotificationActivationModeBackground; //アクション動作設定()

       acceptAction.destructive = NO; //強調設定

       acceptAction.authenticationRequired = NO; //ロック中に出すか?(beta6ではYES/NOどちらもまだ変わらないらしい)

       

// カテゴリ作成

       UIMutableUserNotificationCategory *inviteCategory = [[UIMutableUserNotificationCategory alloc] init];

       inviteCategory.identifier = @"INVITE_CATEGORY";

       [inviteCategory setActions:@[acceptAction] forContext:UIUserNotificationActionContextDefault];

   }

//通知を登録する際にiOS8以上ならカテゴリを指定する。

 UILocalNotification *localNotification = [[UILocalNotification alloc] init];

   [localNotification setFireDate:date];                                 // 日付

   [localNotification setTimeZone:[NSTimeZone defaultTimeZone]];         // タイムゾーン

   [localNotification setSoundName:UILocalNotificationDefaultSoundName]; // 音

   [localNotification setAlertAction:@"test"];

   [localNotification setAlertBody:text];


   if (SYSVER_OVER(@"8.0")) {

       localNotification.category = @"INVITE_CATEGORY"; //カテゴリ名を指定して設定

   }

   

   [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];




拍手[0回]

【iOS備忘録】デバイストークンの更新について

iOS7からデバイストークンが変わるって事で、iOS6の時点でPush登録してそのままのアプリだとiOS7にアップデートしてPush通知が届かないなんてことが起こるそうです。
なのである程度定期的にデバイストークンを再取得してあげて、古いデバイストークンと比較して必要によってはPushサーバへ再送信する必要がある。


AppDelegateの[didRegisterForRemoteNotificationsWithDeviceToken]で引数として最新のデバイストークンが取得できるので、
[didRegisterForRemoteNotificationsWithDeviceToken]を呼ぶために[registerForRemoteNotificationTypes]を呼んであげる必要がある。
※[registerForRemoteNotificationTypes]を呼んでも毎回[didRegisterForRemoteNotificationsWithDeviceToken]が呼ばれるわけではない。
 Appleのサーバへ要求を投げるのでサーバ側の負荷軽減の為1日ほど間隔を開けないと[didRegisterForRemoteNotificationsWithDeviceToken]は呼ばれない。


理想としてはアプリ起動時に呼ばれるAppDelegateの[didFinishLaunchingWithOptions]で[registerForRemoteNotificationTypes]を呼ぶ。
取得が成功して[didRegisterForRemoteNotificationsWithDeviceToken]が呼ばれたら、取得できたデバイストークンと保存してあるデバイストークンを比較する。
デバイストークンが変わっていればpush通知登録を行うって流れかな。

拍手[2回]

[iPhoneアプリ開発] OS差分処理

iOS7が出てからOS差分処理が増えたのでメモ。
やってることは [[[UIDevice currentDevice] systemVersion] floatValue] でOSバージョン取得して分岐させるだけの処理をマクロで書いておこうってだけのこと。
Prefix.pchに記載しておけば便利。

①#define SYSVER_OVER(x)     ([[[UIDevice currentDevice] systemVersion] compare:x options:NSNumericSearch] != NSOrderedAscending)
②#define SYSVER_LESS(x)     ([[[UIDevice currentDevice] systemVersion] compare:x options:NSNumericSearch] == NSOrderedAscending) 

あとは処理中に以下のように使用するだけ。
if(SYSVER_OVER(@"7.0")){
   //iOS7以降でのみ処理を行う
}

----------------------------------------

マクロを使わない場合は単純に以下のように記載すればいい。
float deviceVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (deviceVersion >= 7.0) {
   //iOS7以降でのみ処理を行う
}

拍手[0回]

Objecitev-Cでの遅延実行

①performSelectorによる遅延実行
 
[self performSelector:@selector(hoge)  withObject:nil afterDelay:5.0];
 
- (void) hoge {
 //遅延実行したい処理
}

 
②NSTimerによる遅延実行
 
[NSTimer scheduledTimerWithTimeInterval:5.0f
 target:self
 selector:@selector(hoge)
 userInfo:nil
 repeats:NO
];
 
- (void) hoge {
 //遅延実行したい処理
}
 
③Block構文による遅延実行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 5.0f * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    // 遅延実行したい処理
});


 

拍手[1回]

縦横のUIscrollViewを重ねた時の設定


L字型のように縦に長いスクロールビューと横に長いスクロールビューを重ねた時、
タッチ時の僅かな横移動でうまく縦に移動できないことがある。

UIScrollViewのDelegateメソッドでタッチの始動座標と数秒後の移動位置を見て縦か横かを判断し、縦なら横へのスライド値を0にするなどの処理を入れることで問題は解決する。

が、もっと簡単な設定で済んだ。

    UIScrollView *_scrollview1 = [[[UIScrollView alloc] init] autorelease];
    _scrollview1.bounces = NO;
    _scrollview1.bouncesZoom = NO;
    [self addSubView:_scrollview1];
 
    UIScrollView *_scrollview2 = [[[UIScrollView alloc] init] autorelease];
    _scrollview2.bounces = NO;
    _scrollview2.bouncesZoom = NO;
    [_scrollview1 addSubView:_scrollview2];

要はbouncesとbouncesZoomをNOにするだけでよい

拍手[0回]

シミュレーターで好きな現在地を使う


シミュレーターの[メニュー]→[デバッグ]→[位置情報をカスタマイズ]→緯度経度を入力
経度緯度はGoogleMAPで検索でもすればよし。
上記手順で好きなGPSにできる。

拍手[0回]

XCode4のショートカット

今作ってるiPhoneアプリの制作も一段落ついたためにiOS5の対応に着手することになりまして
XCode4を入れることになりました。

ただ、そのままじゃBuildが通らなかったためビルドオプションを変更。
 Apple LLVM compiler 3.0 → GCC 4.2

とりあえずBuildは通った。
あとは普通にコードを書いていけばいいだけなんだけど〜。

なんとXCode3とXCode4ではショートカットが変わってる!
何よりも使っていた「メソッドをたたむ」ショートカットがヘッダファイルとボディファイルの切り替え機能に変わってるやんけ!

Googleで検索してもメソッドをたたむショートカットがでてこん!
で、適当にMacでよく有りそうなショートカットを押しまくってたらあった!w
「command + option + Shift  +  ↑」だ!!!

コレさえあれば俺はまだ戦える・・・。

拍手[2回]

NSData内のバイナリ(16進数)を10進数の数値に変換する

通信周りでSocketをバイナリ単位で制御するとこの辺よく使うからメモ。
NSData内のバイナリ(16進数)を10進数の数値に変換する。(64bit長)
NSData *data
NSMutableString *t = [[NSMutableString alloc] initWithString:[NSString stringWithFormat:@"%@",data]];
[t deleteCharactersInRange:NSMakeRange(0,1)];
[t deleteCharactersInRange:NSMakeRange(8,1)];
[t deleteCharactersInRange:NSMakeRange(16,1)];
 
unsigned long long value;
if ([ [ NSScanner scannerWithString:t ] scanHexLongLong:&value ] ) { 
   NSLog(@"value = %llu", value);
}

すごい強引なやり方ですが・・・
NSData内のバイナリを%@で出力してそれを文字列として保存。
その文字列から「<>」と半角スペースを削除する。
完全な16進数の文字列だけにしてから scanHexLongLongで16進数をLongLong型の整数に。
たぶんバイナリから直接整数値にする方法なんていくらでもあるんだろうけど、今回は諸事情でこの書き方で。

基本はMessagePackを使えば整数値をそのままエンディアン気にせず送れるんですけどねー

拍手[2回]

カウンター

マジモン窓

プロフィール

HN:
Zenchuu
性別:
男性
職業:
えんじにあ
自己紹介:
いわゆるオタク系。
HNのzenchuuは子供のころからのあだ名。
iPhoneアプリの制作〜運用を仕事にしてます。
人間強度は最高レベルだと自負。
友達?要らねーよヽ(´ー`)ノ

Twitter

いろいろ

Copyright ©  -- ぜん通。 --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS /  /