プログラマメモ2 - programmer no memo2

目次

ios import でモジュールの補完がでてこない場合は、実機が必要かもよというはなし 2024/07/28

暑いですね。みなさまいかがおすごしのことでしょうか。フジロックとかにいってたりするのでしょうか。 さて、17.2から使えるようになったジャーナルの提案機能を調査しているところです。 それで、xocdeのバージョンをあげて、さあコードでしらべようとしているて、 import JournalingSuggestions でそんなのないよ(No such module)とエラーに... そんな場合は、実機をmacにつなげましょうという話

iOS上のでバックグラウンド処理については、このQAを読むべし 2024/05/11
2024/05/12

iOS上のでバックグラウンド処理について

常駐のプロセスとして能動的に動くのは無理っぽいというお話。 3秒ごとに自分で動いて処理をするようなこととか。

なにかのタスクを実行するためには、OKなようで、それは例えばダウンロード、ストリーミングとか、あとは位置情報の更新イベントを受けるとか。

このQAを読むべしなのだろう。

iOS Background Execution Limits - https://developer.apple.com/forums/thread/685525

UIApplication Background Task Notes - https://developer.apple.com/forums/thread/85066

ファグランドとバックグラウンド

調べていて、いろいろ混乱してしまいました。 まず、フォアグラウンド状態で、背後で動かすということと、アプリがバックグラウンド状態で動かすということをいりまじっているような気がしました。 むずかしいですよね....

[iOS]SecPKCS12Import errorCode=-25293、p12するときにopensslコマンドのlegacyを使えばうまくいくかも 2024/05/06
2024/05/12

経緯

AWSIoTを使ってMQTT通信のお試しをしてみようと考えたわけなのですが、クライアント認証にp12形式を使うようだというところまで来たのでした。
MQTT通信するためのライブラリは他にもありそうだったのですが、どうせAWSのIotCoreを使うのでここはAWSのSDKを使うといいかなという感じでした。
まずはそこから、AWSIoTManager.importIdentityを使うのだろうということで、opensslコマンド使ってp12作成して読ませると結果がfalse...

そこで悩むのでした。

環境

xcode(Version 15.3),swift,cocoapod

AWSIoTのバージョン 2.36.0

opensslのバージョン

% openssl -version
OpenSSL 3.3.0 9 Apr 2024 (Library: OpenSSL 3.3.0 9 Apr 2024)

# 証明書を作成
aws iot create-keys-and-certificate --set-as-active \
--certificate-pem-outfile "certificate.pem" \
--public-key-outfile "publicKey.pem" \
--private-key-outfile "privateKey.pem"


# ダウンロードしておきます。
AmazonRootCA1.pem はダウンロードしておきます。


AWSIoTManager.importIdentityは内部でSecPKCS12Importを使っていた

AWSIoTManager.importIdentityは、true.falseしか返さない..デバッグ(AWSDDLogError)の出力の仕方がすぐにわからずxcodeのデバッガでみていきました。
cocoapodsで環境を作っていたので、フレームワーク(ライブラリ)のソースコードがぱっとみれたのはよかった。

すると、SecPKCS12Importが返すstatusがerrSecAuthFailed=-25293というのがわかりました。そしてここで悩む。

いろいろ調べていくとKeychainが扱える暗号方式が、opensslのバージョンがかわって互換性の問題がありそうだということのようでした。 そしてlegacyのオプションでうまくいくというところまでいったのでした。


legacyつけないほう、clientA.p12
openssl pkcs12 -export -in certificate.pem -inkey privateKey.pem -certfile AmazonRootCA1.pem -out clientA.p12

legacyをつけた、clientB.p12
openssl pkcs12 -legacy -export -in certificate.pem -inkey privateKey.pem -certfile AmazonRootCA1.pem -out clientB.p12


教訓、自分向け

教訓というほどのことではないのですが、検索エンジンを使う際、自分が同じ検索結果を次にだせる保証はないので、キーワードはメモしておいたほうがよい。

あと、こういうのってみなさんどうやって解決していくのだろう...

p12ファイルを保持したアプリをつくったとして、いろいろ時間がたって、突然、SecPKCS12Importしたら動かないということはないよね....

参考

SecPKCS12Import is failing to import P12 certificate.
Amazon ルート CA 証明書をダウンロードする
OpenSSL 3系で発行された p12 形式の証明書が macOS にインポートできない

cocoapodをbrewでinstallしてうまくいかなかったので、普通にインストールしました。 2024/05/04
2024/05/05

開発ってままならないもの

開発ってままならないものですね。僕の実力だと自力で問題を解決できないことばかり...
spm(The Swift Package Manager (SwiftPM) )の時代ということで試そうとしていたのですが、ここはいったんpodでと考え直して環境を作ろうとしていたのですが、やはり、brewでインストールと思って作業進めていたのですが、pod setup, pod installが思い通りにいかず。
調べる気力がわかず、ここは、 "sudo gem install cocoapods"。
実は、すんなりいかず、いろいろそのまえにごにょごにょと。あきらめるのも大事ですね。
あきらめてばかりの人生です。

参考
CocoaPodsを廃止した

コンテナビューにおいたビューをとりたいんだ 2015/08/23


Container Viewです。

ぼくのコンテナビューの使い道って、ビューをコントロールする部分をわけたいからかなーってのがあるんだけど、はりつけられたビューのほうから、コンテナビューのビューを取得した場合があって、ふとどうしたものだろうと思ったわけです。

※他にいい方法があるだろうけど。

まずアウトレット
 これコンテナビュー
@IBOutlet var container: UIView!

取得するコードはきっとこんな感じ

container.subviews[0]

サブビューの一番目ということ。

たいしたことではないけど....

 

[セグエ]ストーリーボード上に配置したボタンをcontrolキーを押しながら、次のViewControllerにつなげる 2015/05/06

いつも忘れてしまうので、
ストーリーボード上に配置したボタンをcontrolキーを押しながら、次のViewControllerにつなげる
このやり方いつも忘れる。

参考
Swiftでセグエを利用した画面遷移 - Qiita


カウントアップのサンプル 2014/11/24

この数日、やったことのまとめ
SpriteKit,Swiftをいじってました。


一秒ごとにカウントアップしていく画面です。

これだけ実現するのにいろいろ調べた。
Orz...

以下コード


import SpriteKit import Foundation class GameScene: SKScene { override func didMoveToView(view: SKView) { /* Setup your scene here */ let myLabel = SKLabelNode(fontNamed:"Chalkduster") myLabel.name = "name" myLabel.text = "timer"; myLabel.fontSize = 65; myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame)); self.addChild(myLabel) } override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { // } let startTime = CFAbsoluteTimeGetCurrent() override func update(currentTime: CFTimeInterval) { let now = CFAbsoluteTimeGetCurrent() changeLabel("\(Int(now - startTime))") } func changeLabel(text:String) { for child in self.children { let label = child as? SKLabelNode if label?.name == "name" { println("exist!") label?.text = text } } } }

あるシーンにaddされたnodeの中で、特定の名前(name)で、特定のクラスであるものをみつけるためのループ処理です。 2014/11/22

spritekitです。そしてswiftです。
あるシーンにaddされたnodeの中で、特定の名前(name)で、特定のクラスであるものをみつけるためのループ処理です。

コード

for child in self.children { if (child as? SKLabelNode)?.name == "label" { println("exist!") } }


SSceneのスーパークラスは、SKNodeなので、メンバーとしてchildrenがいるので、それを廻してみつけます。その際に、swiftのas?を使い特定のクラスのインスタンスをみつけて、キャストして、nameが合致するのをみつけています。

結構この書き方好きかも、廻すさずできたらなおいいですけど。。。

次に合致したら何かしたい場合のコード

for child in self.children { let label = child as? SKLabelNode if label?.name == "name" { println("exist!") label?.text = "書き換え" } }


単純なautolayoutの使い方から、container viewにembedした画面のautolayoutまで - autolayoutを使う練習 その1 2014/11/15

xcode6.1を使ってます。
数年のあいだにxcode,ios,APIいろいろ変化しましたね(遠い目)。
iphone6でまた画面のバリエーションが増えてしまいましたね。

今年のトピックで最大なのは、僕的には、swiftですかね。こんなに衝撃だとは思わなかった。と、いうほど、さわってませんが。

autolayoutは必須かなという今日この頃

まず目標はこの画面です。
単純に真ん中にラベルを置いただけのものです。
 





 constraintはつけていないとこんな感じのレイアウト


 xcode上での操作

 ラベルを選んで、
最後に、「Add 2 Constraints」ボタンでつける。
結果は、

次は、応用というか、本題。
これがなかなかできず悩んだ。
まずContainer Viewを用意してそこにembedで、別のview。
同じようにconstraintsをつけてみたけど、同じようになりませんでした。


 ずれてしまってる。
 それで、かなりうんうん悩みました。
実は、constraintsをつける相手をcontainer viewにつければ、世界の中心で愛を叫べました。





以上の例は真ん中に置くだけなので、まったく難しくない。

なので、その2に続きます。


アニメーションは止まらない(というか止めたくない) 2013/11/19

core animationです。
アニメーションを繰り返しにしているのですが、画面を切り替えたとき(tab)に停止していました。
それを防ぐのは removedOnCompletionをNOにすればよいようです。
はじめ、viewWillAppearで、もう一度アニメーションをつけてやらないといけないのかなーと思ってたのですが、このフラグでよいようです。



      CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
      anim.repeatCount = HUGE_VALF;
      // [anim setAutoreverses:NO];
      anim.duration = 0.8;
      anim.fromValue = (id)[UIColor whiteColor].CGColor;
      anim.toValue = (id)[UIColor greenColor].CGColor;
      anim.removedOnCompletion = NO;
      [[self.labelBeaconState layer] addAnimation:anim forKey:@"flash"];


参考

couchbase liteを使った単純なmaster-detailのプログラム 2013/11/06

xcodeのプロジェクトまるごとあげれるので、githubを使ってみました。
 couchbase liteを使った単純なmaster-detailのプログラムです。

couchbase liteをわざわざ使うほどのものではないかもしれないけど。
どういう使い方がいいんだろか?
 dbを同期させるとか、どの辺の分野のアプリケーションだと活かせるのかな。



プログラム自体まずいところは、セルのレンダリングで毎回、全件とってきてその中から、1個えらんで情報取得というふうにやっているので、よくないんだろうなーとは思いつつ。


どこからでもAppDelegateを取得したい 2013/11/05

どこからでもAppDelegateを取得したい

dbとか設定情報とか取得したいときのショートカットみたいなもんですね。

AppDelegate* appDelegate = [[UIApplication sharedApplication] delegate];

Couchbase lite をさわりはじめたところです。 2013/11/05

Couchbase lite をさわりはじめたところです。


ドキュメントの通りやっていけばよさそうです。
ちょっと自分がはまったところはlinker flagsに-ObjCをつけなかったところ。


スワイプのジェスチャーを止めたい。 2013/11/05

ipad向けのアプリをためしていて、ジェスチャーでbackが有効になっているのに気がつきました。ただ、これ、ナビゲーションコントローラーののbackを使わないようにしているのにジェスチャーで戻ってしまう動きになってしまっては不都合です。

それで、どうやってこの動きを止められるのか。


viewDidLoadに以下のコードを仕込む。

if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
    self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}

アプリにhtml含めて、jsも読み込ませたい - ios 2013/11/04

iosアプリにhtml5、javascript,cssを含めてみたいというわけで、html,cssはうまくいったのですが、javascriptがうまくいかない。

UIWebView を使ってリソースバンドル内の HTML ファイルで、外部 JavaScript や CSS を読み込む - 24/7 twenty-four seven

たしかにビルド対象になっていたので、リソースファイルに移動させてうまくいきました。


'Missing recommended icon file - The bundle does not contain an app icon for iPhone / iPod Touch of exactly '120x120' pixels, in .png format' - 悪夢 2013/10/24

アプリbullcounterのバージョンアップを申請する際にはまったことです。

ios7がでて、いろいろ必要なアイコンがかわったみたいですね。

Organizerでワーニングがでて、ファイルを用意すればいいのかと思い用意するだけではだめで、xxx-Info.plistに追加する必要があったのが今回はまった点です。






参考

手でセグエ(セグーと僕は呼ぶ) 2013/10/21

またよくわからないタイトルですが、「手でセグエ(セグーと僕は呼ぶ) 」
xcodeでの実装メモです。

ストーリーボードでテーブルから次の詳細画面にいくさいに途中で、問い合わせダイアログみたいのをだしたいというわけです。その処理をどこで入れるのかというわけで、行選択時に表示したいわけですが、セグエが設定されている場合はそれを解除します。

デフォルトでできる動作だと行を選択で次の詳細画面にいってしまうので、それをストーリーボードでいったん切りにして、 代わりにmanualでpushできるようにします。そのときにstoryboard segueでidentifierを設定してあげます。
コード上で、そのidentifierを使ってperformしてあげるという流れになります。

UITableViewControllerに行を選択時の処理を実装していない場合は、 didSelectRowAtIndexPathを実装します。次の画面へいきたい場合は、

 [self performSegueWithIdentifier:@"showDetail" sender:self];
 してあげます。※ここでは、identifierをshowDetailとしています。





参考

バージョンの確認はしっかりと... - ios app 2013/09/07
2013/09/07


先月リリースした「ブルカウンター」ですが、有料でだしたのですが、作った人としては、残念なことに、一本もダウンロードされず、仕方がないので、無料にしたら、スポーツの無料で50位内に瞬間はいったのでした。

こんなアプリです。


で、ダウンロードされて、一件だけついたコメントが、落ちるということでした。


たしかにxcodeの設定ではターゲットが5.1なのですが、テストした環境の実機はios6でして、シュミレータもios6でしかやってませんでした。

というわけで、申し訳ございませんでした。

早速、シュミレータに5のバーションをインストール。
参考にした記事は以下

iosシミュレータのバージョンが6.0しかないときに前のバージョンを使いたくなったら | 日記の間 | あかつきのお宿


つぎに、シュミレーターで、動かしてみました。動かすと、ものの見事におちました。
おちた原因は2つ。

1つは、ios6から入っている、UITableのregisterClassを使っていた箇所でおちました。
ここは、

この部分は、下記のような感じで対応

#define IOS_VERSION [[[UIDevice currentDevice] systemVersion] floatValue]
- (void)viewDidLoad
{
    [super viewDidLoad];
    if (IOS_VERSION >= 6.0) {
        [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
    }
}
とりあえず。

で、つぎの落ちた箇所の、エラーが下記。

'NSInternalInconsistencyException', reason: 'The NIB data is invalid.'
このエラーをみたとき、調査するの大変かもとびびりましたが、下記の記事にヒットして、すぐに解決できました。

EZ-NET: Autorayout のセルを iOS 5 で読み込むとエラーになる


ios6の目玉機能、autolayoutを使うという設定をしてたからでした。
※アプリでは、この機能使ってないんですが。。。

いろいろありましたが、落ちる部分だけ、さきに直して、申請しようと思います。
レビューのコメントに感謝です。





UIWebView バウンスさせない スクロールバーださない 2013/08/21

iosです。 UIWebViewです。
ちょっこと自社アプリのリストみたいの表示させたいなーと思い、320x44のUIWebViewにHTMLを読み込ませるという方法をとってみました。そのときに、バウンスさせたくないというのと、スクロールバーなくてもいいかなということで、下記のようなコード



             { // バウンスさせない,スクロールバー非表示
                id subview = [[webView subviews] objectAtIndex:0];
                if([[subview class] isSubclassOfClass:[UIScrollView class]]){
                    UIScrollView *scrollView = ((UIScrollView *)subview);
                    scrollView.bounces = NO;
                    scrollView.showsVerticalScrollIndicator = NO;
                    scrollView.showsHorizontalScrollIndicator = NO;
                }
            }

[宣伝][app] ブルカウンター 2013/08/17

ios アプリをリリースしました。「ブルカウンター」といいます。


ブルカウンター for iPhone 3GS, iPhone 4, iPhone 4S, iPhone 5, iPod touch (3rd generation), iPod touch (4th generation), iPod touch (5th generation) and iPad on the iTunes App Store

 とくに開発に苦労したことはなかったけど、実はこのアプリの前に「RedbullCounter」というのをつくっていて、レッドブルを飲んだらカウントするというもので、かなりグラフィックは僕なりがんばったけど、reviewで、「おもしろみがわからない」とrejectとなりました。

あと困ったのは、coredataを使ってるけど、その辺ではまって、1週間ぐらい、作るのストップしたことぐらいかな。

ダーツが好きなのと自宅練習はよくやっていたので、練習とレーティングを結びつける方法がないかなと思い開発したのであった。

app storeに載せるための、キャプチャは、工夫しました。
Photoshopでの加工は、

GraphicBurger » Isometric Perspective MockUp

を利用させていただきました。

 で、この方法を使うと一枚の画で、いろいろアプリの雰囲気とか、紹介できるからいいなと思い採用してみました。

 というわけで、興味がある方ぜひ使ってみてくださいな。