【iOS Swift入門 #215】開発用デバイスで強制的に電源再起動が行われる

【iOS Swift入門 #215】開発用デバイスで強制的に電源再起動が行われる
■はじめに

iPhoneやiPadなどを開発でのデバッグ用に
使用しているデバイスが、ある日から突然、
20分くらいごとに強制的に電源再起動されるようになった。

突然、リンゴマークがでるのだ。

 

以前も同じような状況になり、
そのときは工場出荷時状態にリセットしたら、
問題は発生しなくなった。

 

今回も工場出荷時状態にリセットしなきゃいけないのかなあと思いながら、
いろいろ試していたら、直すことができたのでメモしておく。

 

■推測できる原因

問題はSpotlight検索にあったようだ。

ホーム画面で下にスワイプすると表示されるこの画面です。
swift215_001

 

おそらく、Spotlight検索は素早く検索できるように、
インデックスを作成している!?

 

デバイスを開発で使っているとこのインデックスがおかしくなり、
電源が落とされると思われる。

 

■対応方法

1.設定アプリを起動

swift215_002

 

2.メニュー「一般」を選択
swift215_003

 

3.メニュー「Splotlight検索」を選択
swift215_003

 

4.チェックをすべて外す
swift215_004

 

5.電源再起動する

 

6.「4.チェックをすべて外す」ではずしたチェックを全てチェックする

 

【参考情報】

①iOSアプリ開発未経験の人向け
・iOSアプリ開発をはじめたとき最初に買った書籍
【アプリ作成未経験の人向け】
Storyboardを使って画面を作成していく。
手順にしたがって操作していくと、ボタンの作成やWebViewの作成などができる。
アプリって、こんな感じで作るんだというのを体験できる。

Swiftではじめる iPhoneアプリ開発の教科書 【iOS 8&Xcode 6対応】 教科書シリーズ

・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。


iPhoneアプリ開発塾

③中級者、上級者向け
詳解 Swift

【楽天ブックス】で見る方は
こちら

③その他
その他もろもろ

【iOS Swift入門 #206】2点間の距離を計算する

【iOS Swift入門 #206】2点間の距離を計算する

CLLocationクラスの

– distanceFromLocation:

を使うと2点間の距離を計算し、メートルで返してくれる。

Swiftでは

func distanceFromLocation(_ location: CLLocation!) -> CLLocationDistance

と定義されている。

 

Objective-Cでは

– (CLLocationDistance)distanceFromLocation:(const CLLocation *)location

と定義されている。

 

ここでは羽田空港から香港ビクトリアピークまでの距離を計算する。

香港ビクトリアピークは百万ドルの夜景を見れるところです。

 

・羽田空港の緯度・経度
緯度:35.549393
経度:139.779839

・香港ビクトリアピークの緯度・経度
緯度:22.2760448
経度:114.1455266

 

やることは2つ。

・CoreLocationをimportする

・距離を計算する処理を追記

※例えば、下記の通り

// 羽田空港のCLLocation
let hanedaLocation = CLLocation(latitude: 35.549393, longitude: 139.779839)

// 香港ビクトリアピークのCLLocation
let peakLocation = CLLocation(latitude: 22.2760448, longitude: 114.1455266)

// 羽田空港から香港ビクトリアピークまでの距離
let distance = hanedaLocation.distanceFromLocation(peakLocation)

 

■サンプル

こちら(github)でダウンロード
swift206_001

おわり。

【iOS Swift入門 #199】3Dアニメーションでサイドメニューを表示する

【iOS Swift入門 #199】3Dアニメーションでサイドメニューを表示する

■はじめに

画面をドラッグするとサイドメニューを表示する。 これを3Dのアニメーションで表示するのがかっこいい。 書籍やネットの情報を参考に作った。 完成形は↓です。 サンプルソースはGithubにアップしています。

■実装手順

1. プロジェクトを新規作成

※SideMenu3Dと名づけました。

2. 画面を構成するViewControllerのサブクラスを3ファイル作成する。

それぞれ下記の通り名前をつけました。 swift199_001 ・センター画面 CenterViewControllerというクラス名で作成。 ・サイドメニュー画面 SideMenuViewControllerというクラス名で作成。 ・コンテナ画面 ContainerViewControllerというクラス名で作成。

3. センター画面をStoryboardで編集

①Storyboard上にViewControllerを配置する。

swift199_002

②背景色を変更する

※サイドメニューと区別できるようにするため swift199_003

③Class名とStoryboard IDを設定する

Class名はCenterViewControllerを設定する。 Storyboard IDもCenterViewControllerで設定しました。 swift199_004

4. サイドメニュー画面をStoryboardで編集

①Storyboard上にViewControllerを配置する。

swift199_005

②背景色を変更する

※センター画面と区別できるようにするため swift199_006

③Simulated Sizeを変更する

※Storyboard上の表示を変更するだけです。 後ほど、サイドメニューの横幅はソース内で設定します。 swift199_007 swift199_008

④Class名とStoryboard IDを設定する

Class名はSideMenuViewControllerを設定する。 Storyboard IDもSideMenuViewControllerで設定しました。 swift199_009

5. まずは画面を表示できるところまでソースを書く

①ContainerViewController.swift

 

②AppDelegate.swift

 

③アプリ起動時の画面作成はStoryboardではなく、ソースから行うようにする。

swift199_010

④画面が表示されるか確認

※サイドメニュー画面が表示されるはず swift199_011

6. ドラッグでサイドメニュー画面が3Dアニメーションで表示されるようにする

①ContainerViewController.swiftを下記のようにする

 

7.実行

記事のはじめに載せている動画と同じようになると思います。   もしうまく動かない場合、サンプルソースをGithubにアップしていますので、 こちらを確認ください。

■Macのハードディスク容量が少ない

ハードディスク容量が少ないのをmicro SDカードで補う。 ↓のアダプタに挿す。 小さいので私のパソコンケースでは問題なく入ってます。 iBUFFALO カードリーダー/ライター microSD対応 超コンパクト ブラック 【PlayStation4,PS4 動作確認済】BSCRMSDCBK

■参考書籍

アニメーションの専門書籍。 【Kindle版】iOSアニメーション専門書籍 Programming iOS 8: Dive Deep into Views, View Controllers, and Frameworks

【iOS Swift入門 #198】Gitでproject.pbxprojのコンフリクトするのをなくす

■はじめに

今まで一人でアプリ開発を担当していたのですが、
2人で開発することになりました。

ソースはGitで管理していて、
機能追加や修正が終わるとマージしています。

プロジェクトにファイルを追加したり、
プロジェクト内でのグループの階層構造を変更すると、
project.pbxprojが変更されます。

project.pbxprojが高い確率でコンフリクトします。
コンフリクトを解消しようとファイルを見てもわからないし、
いじって間違えるとプロジェクトを開けなくなるくせものです。

そこでどうすればいいか調べてみたところ、

mergepbx

という自動でproject.pbxprojをマージするツールをみなさん使われているようです。
私も導入してみました。

 

■設定

1.mergepbxを入手する

①https://github.com/simonwagner/mergepbxをcloneする。

git clone https://github.com/simonwagner/mergepbx.git 【cloneするフォルダパス】
※【cloneするフォルダパス】は任意

 

2.mergepbxをビルドする

①cloneしたディレクトリに移動する

cd 【cloneするフォルダパス】

②build.pyを実行する
./build.py

 

3.mergepbxをcopy/move

①mergepbxをコピー

cp mergepbx 【コピー先フォルダパス】
※【コピー先フォルダパス】は任意

 

4. ~/.gitconfigにmergepbx設定を追加する

①~/.gitconfigにmergepbx設定を追加する

git config –global merge.mergepbx.name “Xcode project files merger”
git config –global merge.mergepbx.driver “【コピー先フォルダ】/mergepbx %O %A %B”

※【コピー先フォルダパス】は手順3「3.mergepbxをcopy/move」で指定したフォルダパス

.gitconfigに下記が追記される。

[merge “mergepbx”]
name = Xcode project files merger
driver = 【コピー先フォルダ】/mergepbx %O %A %B

 

5..gitattributesにmergeの設定を追加する

①プロジェクトのリポジトリ直下(.gitファイルがある場所)に.gitattributesファイルを追加
②viなどのエディタで.gitattributesファイルを開き、下記追記する。

*.pbxproj merge=mergepbx

これで設定終了。
ファイル追加で、project.pbxprojがコンフリクトしないようになったか確認してみてください。

 

■おわりに

MacBook Proを購入して1ヶ月ほど。
買ったばかりなのに、もし、キーボードに飲み物とかこぼしたら
どうしようかと不安になり、キーボードカバーを探した。

実際、以前使用していたMacBook Airはカフェオレをこぼし、
一部のキーで、押すとぐにょという感触になってしまったし、
安いキーボードカバーがあれば、購入しておいたほうがいいと思った。

で、amazonで↓を発見。
980円で、評価も高いので、コスパが高そうなので購入しました。


MacBook Air/Pro 日本語 キーボードカバー (JIS配列) 〈 MacBook Air 13/Pro Retina 13,15インチ用〉マックブック ブラック (黒) 【MagicMoshroom】

 

■参考書籍

アニメーションの専門書籍。

【Kindle版】iOSアニメーション専門書籍


Programming iOS 8: Dive Deep into Views, View Controllers, and Frameworks



【参考情報】
①iPhoneアプリ開発が初めての人。XcodeとSwift入門ならここ
絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

②中級者、上級者向け
詳解 Swift

【楽天ブックス】で見る方は
こちら

③その他
その他もろもろ

【iOS Swift入門 #197】UIAlertViewのボタンタップの処理をクロージャ(blocks,handler)で書く

【iOS Swift入門 #197】UIAlertViewのボタンタップの処理をクロージャ(blocks,handler)で書く

■はじめに
UIAlertViewはiOS8からdeprecated(非推奨)となり、
UIAlertControllerの利用が推奨されています。

でも、iOS7を対応OSと含めているため、
UIAlertViewを使っている人が多いですね。

で、このUIAlertViewでボタンをタップした時の処理は
delegateメソッドで書きますが、
これを使うとソースが読みにくくなります。

なのでクロージャを使い、↓のようにして、
AlertViewの初期化時にボタンタップ時の処理も合わせて、
書けるようにしました。

[[UIAlertView alloc]initWithTitle:@”たいとる” message:@”メッセージ” cancelButtonTitle:@”キャンセル” okButtonTitles:@”OK” cancelHandler:^{
// キャンセルボタンを押したときの処理
} okHandler:^{
// OKボタンを御した時の処理
}];

■実装
①UIAlertViewのサブクラスを作成
※CustomAlertViewという名前にしました

・CustomAlertView.h

・CustomAlertView.m

②作成したCustomAlertViewを使う
 ※Storyboardにボタンを配置してます。

・UIViewController.h

・UIViewController.m

■実行
1.アプリ起動
swift197_001

2.ボタンタップ
swift197_002

3.OKタップ
→コンソールに出力
swift197_003

4.キャンセルタップ
→コンソールに出力
swift197_004

■Apple Watchのベルト

Apple Watch 38mm 用 時計バンド 交換ベルト 腕時計 本革 時計ベルト高級レザーベルト ブラック

■参考書籍
アニメーションの専門書籍。


Programming iOS 8: Dive Deep into Views, View Controllers, and Frameworks

【参考情報】
①iPhoneアプリ開発が初めての人。XcodeとSwift入門ならここ
絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

②中級者、上級者向け
詳解 Swift

【楽天ブックス】で見る方は
こちら

③その他
その他もろもろ

【iOSアプリのローカライズ】なぜか日本語が表示されてしまう

【iOSアプリのローカライズ】なぜか日本語が表示されてしまう

アプリをローカライズ対応しようとした。
日本語以外を使用している場合、英語表示にするようにした。

Xcodeでの設定等はカヤックさんのコラムを参考に実施した。
https://conyac.cc/ja/business/columns/localization_guide_ios

設定完了後、試してみた。
だが、日本語以外に切り替えた時に日本語が表示されてしまう事象が発生。

・うまくいくケース
iPhoneの言語設定を日本語から英語に変更
⇒ アプリでの表示 期待値:英語 実際:英語

・うまくいかないケース
iPhoneの言語設定を日本語から中国語(簡体字)に変更
⇒ アプリでの表示 期待値:英語 実際:日本語

【設定変更前】
・設定
Screen Shot 2014-10-19 at 15.33.54

・アプリでの表示
Screen Shot 2014-10-19 at 15.34.16

【設定変更後】
・設定
Screen Shot 2014-10-19 at 15.37.43

・アプリでの表示
Screen Shot 2014-10-19 at 15.37.55

⇒ボタンの表記が日本語になってしまっている

なぜか?
Xcodeの設定やiPhoneの設定をいじって、やっとわかった。
アプリで、日本語で表示するか、英語で表示するかは
単純にiPhoneの使用言語だけで決まっていなかったのだ。

iPhoneの言語設定で「使用する言語の優先順位」というのがある。
私の場合、「日本語」と「中国語(簡体字)」「English」の3つがある。
アプリ内のローカライズ対応された言語以外がiPhoneの使用言語で設定されている場合、
優先順位が高い言語で表示しようとするのだ。
使用する言語の優先順位にローカライズ対応した言語がなければ、
Xcodeの設定のBaseで表示する。

この使用する言語の優先順位は使用言語を切り替えると変更される。
変更前 日本語→English→中国語
使用言語を日本語から中国語に切り替えると、
 変更後 中国語→日本語→English
となる。

この場合、アプリは中国語のローカライズされてないから、
次は日本語のローカライズがないか確認する。

日本語のローカライズがあったのえ、アプリは日本語表示しようということになる。

実際に中国語から英語、その後中国語に変更したら、アプリで英語表示されるようになった。

Screen Shot 2014-10-19 at 15.41.30

Screen Shot 2014-10-19 at 15.41.40

【iOSプログラミング初心者向け】StoryboardでTableViewにRefreshControlを追加【Swift Objective-C】

【iOSプログラミング初心者向け】StoryboardでTableViewにRefreshControlを追加【Swift Objective-C】

iOSプログラミングを勉強し始めたときには、Storyboardが存在し、
入門書ではStoryboardを使ったアプリ作成方法を学んだため、
私はStoryboardで画面作る派です。

しかし、Storyboardでどうやるか少し調べても分からない時には、
ソースを書いて画面を作ってしまいます。

ソースを書いて、作っていた代表的なのがUIRefreshControlです。
動的なものはStoryboardで使いにくいという偏見があったのです。

万が一にも同じような人がいるかもしれないと思い、
Storyboardで作る手順をメモしました。

超簡単です。

サンプルプロジェクト作成からの手順を記載します。

1.試す為のプロジェクトを作成。
File → New → ProjectからMaster-Detail Application

スクリーンショット 2014-10-06 17.52.47

2.Product Nameは下記のとおりにしました。
スクリーンショット 2014-10-06 17.53.19

3.Storyboardを表示。

4.MasterViewController画面のナビゲーションバーとPrototype Cellsと表示された部分にめがけて、Viewを追加。

スクリーンショット_2014-10-06_17_54_14

下記の様になっているはずです。

スクリーンショット_2014-10-06_17_55_36

5.追加したViewを選択してください。

スクリーンショット_2014-10-06_17_55_44

6.ClassにUIRefreshControlと入力しましょう。

スクリーンショット_2014-10-06_17_56_55

これでTableViewにUIRefreshControlを追加完了です。

デバッグ起動し、確認する。

Screen_Shot_2014-10-06_at_18_16_31

あとはソースファイルに接続して、コーディングで作成したときと同様に処理をしてあげればいいだけです。

【Objective-C, Swift】iOS8へのアップデートでアプリのドキュメントディレクトリのパスが変わる

【Objective-C, Swift】iOS8へのアップデートでアプリのドキュメントディレクトリのパスが変わる

iOS8へのアップデートでアプリのドキュメントディレクトリのパスが変わってしまいます。
正確にはドキュメントディレクトリのパスにはアプリ固有のIDが含まれているが、
そのIDが変わってしまうようだ。

自分が昔作成したアプリで問題が発生したため、原因に気づくことができた。

どんなときに問題か?

ドキュメントディレクトリの絶対パスをユーザーデフォルトなどに格納していて、
アプリ内でのファイル保存時などにその格納した値を使用しているケースが考えられる。
この場合、OSアップデート後にそのファイルにアクセスしようとした際、
ファイルが見つけられずにエラーとなる。

例えば、私は動画を端末内に保存し、オフラインで視聴できるアプリを使用していた。
iOS8へのアップデート前は問題なく、オフラインで視聴できていた。
しかし、iOS8へのアップデート後、オフライン動画の一覧を開こうとすると、アプリが強制終了してしまっていた。
そのときは原因が分からなかったが、アプリを削除したところ、アプリを使用できるようになった。
当然、OSアップデート前に保存していたオフライン動画は削除されている。

推測だが、ドキュメントディレクトリの絶対パスが変わってしまったためではないだろうか。

ちなみに私はUtilityという共通で使用できるクラスメソッドを集めたファイルを用意し、
ドキュメントディレクトリに保存しているファイルにアクセスする場合は
このメソッドを使用することで解決した。

ドキュメントディレクトリにあるファイルにアクセスする際、
都度、ドキュメントディレクトリのパスをOSから取得しアクセスしている。
これによって、OSアップデートでドキュメントディレクトリのパスが変わっても対応可能である。

 ※なお、アプリアップデート時もドキュメントディレクトリのパスは変わるらしい。

  http://www.zero4racer.com/blog/453

 

また、関連した話として、iOS8にすると、Xcodeでデバッグする度に、
ドキュメントディレクトリ(パス内のアプリID)が変更されることがわかった。
AppDelegateのdidFinishLaunchingWithOptions内に下記追加し確認した。

結果は以下のようになった。
1. iPhone4(iOS7.1.1)
→ デバッグしても、ドキュメントディレクトリ(パス内のアプリID)が変更されない

1回目デバッグ起動時
/var/mobile/Applications/7132DFFE-F99D-4ECA-B07E-C1190C14AAC6/Documents

スクリーンショット 2014-10-02 11.30.05

2回目デバッグ起動時
/var/mobile/Applications/7132DFFE-F99D-4ECA-B07E-C1190C14AAC6/Documents

スクリーンショット 2014-10-02 11.31.41

2.iPhone5(iOS8.0.2)
→ デバッグする都度、ドキュメントディレクトリ(パス内のアプリID)が変更される

1回目デバッグ起動時
/var/mobile/Containers/Data/Application/5C6DE361-35BD-4587-B1AA-98EC280FEF37/Documents

スクリーンショット 2014-10-02 11.33.49

2回目デバッグ起動時
/var/mobile/Containers/Data/Application/30AED3CA-83BB-4D17-A0C1-7DA1EC1830AC/Documents

スクリーンショット 2014-10-02 11.34.33

【Swift Objective-C】文字列からURLを検出し、リンク表示するには?

【Swift Objective-C】文字列からURLを検出し、リンク表示するには?

文字列からURLを検出し、リンク表示するには?

このように表示したい。
Screen Shot 2014-10-01 at 21.46.23

そして、リンクをタップするとSafariに遷移するようにした。
Screen Shot 2014-10-01 at 21.46.29

TTTAttributedLabelを使うと簡単だ!
TTTAttributedLabelは[GitHub](https://github.com/mattt/TTTAttributedLabel)やCocoaPodから入手できる、オープンソースです。

予め、プロジェクトにTTTAttributedLabelを導入しておく。
TTTAttributedLabelのインスタンスを作成します。
肝は

linkLabel.enabledTextCheckingTypes = NSTextCheckingTypeLink;

でしょう。
このプロパティをセットした後にテキストをセットすると、
URLを探し、リンク表示してくれます。
Objective-CとSwiftで試しました。