20200210のiOSに関する記事は5件です。

【Unity】iOSでデータを読み書きする

概要

UnityでiPhoneの実機テストをした時に
ファイルの読み書きにつまづいたのでメモを残します。

環境

Unity 2019.2.10f1
Xcode ver.11.3.1
iOS 13.2

サンプル

データ

[System.Serializable]
public class SaveData
{
    public int stageNum = 3;
    public int[] score = new int[stageNum];
}

jsonなので配列も扱えますね。

セーブ

    public void Save(SaveData data){
        StreamWriter writer;
        string jsonData = JsonUtility.ToJson(data);

        writer = new StreamWriter(Application.persistentDataPath + "/savedata.json", false);
        writer.Write (jsonData);
        writer.Flush ();
        writer.Close ();
    Save();

pathにはApplication.persistentDataPathを使います。
StreamingAssetsは読み込み専用なのでセーブデータには適しません。
逆にアプリから書き換えることのないステージ情報などはStreamingAssetsを使うのが良いと思います。
・参考
StreamWriterの第二引数はtrueで追記、falseで上書きとなります。

ロード

    public SaveData Load(){
        string data = "";
        StreamReader reader;

        reader = new StreamReader(Application.persistentDataPath + "/savedata.json");
        data = reader.ReadToEnd ();
        reader.Close ();

        return JsonUtility.FromJson<SaveData>(datastr);
    }
    SaveData data = Load();
    print(data.score[0]);

リセット

    public void ResetData(){
        // 初期状態のデータをセーブ
        SaveData data = new SaveData();
        Save(data);
    }
    ResetData();

初回起動のとき

    void Start() {
        if (System.IO.File.Exists(Application.persistentDataPath + "/savedata.json") == false) {
            ResetData();
        }   
    }

jsonデータがないときにデータを作成します。
開発の段階であらかじめpersistentDataPathにjsonファイルを置いておくことはできません。

終わりに

iOS以外のプラットフォームでは処理を分ける必要がある場合があります。
間違い等あればご指摘願います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity】iOSでセーブデータを読み書きする

概要

UnityでiPhoneの実機テストをした時に
ファイルの読み書きにつまづいたのでメモを残します。

環境

Unity 2019.2.10f1
Xcode ver.11.3.1
iOS 13.2

サンプル

データ

[System.Serializable]
public class SaveData
{
    public int stageNum = 3;
    public int[] score = new int[stageNum];
}

jsonなので配列も扱えますね。

セーブ

    public void Save(SaveData data){
        StreamWriter writer;
        string jsonData = JsonUtility.ToJson(data);

        writer = new StreamWriter(Application.persistentDataPath + "/savedata.json", false);
        writer.Write (jsonData);
        writer.Flush ();
        writer.Close ();
    Save(data);

pathにはApplication.persistentDataPathを使います。
StreamingAssetsは読み込み専用なのでセーブデータには適しません。
逆にアプリから書き換えることのないステージ情報などはStreamingAssetsを使うのが良いと思います。
・参考
StreamWriterの第二引数はtrueで追記、falseで上書きとなります。

ロード

    public SaveData Load(){
        string data = "";
        StreamReader reader;

        reader = new StreamReader(Application.persistentDataPath + "/savedata.json");
        data = reader.ReadToEnd ();
        reader.Close ();

        return JsonUtility.FromJson<SaveData>(datastr);
    }
    SaveData data = Load();
    print(data.score[0]);

リセット

    public void ResetData(){
        // 初期状態のデータをセーブ
        SaveData data = new SaveData();
        Save(data);
    }
    ResetData();

初回起動のとき

    void Start() {
        if (System.IO.File.Exists(Application.persistentDataPath + "/savedata.json") == false) {
            ResetData();
        }   
    }

jsonデータがないときにデータを作成します。
開発の段階であらかじめpersistentDataPathにjsonファイルを置いておくことはできません。

終わりに

iOS以外のプラットフォームでは処理を分ける必要がある場合があります。
間違い等あればご指摘願います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

今からスマホアプリの学習をしようとしてる人に向けて!

1. はじめに

私は新卒でITベンチャーに入社して、現在スマホアプリのフロントエンドエンジニア(※以下 アプリのフロント)として、
Android、iOS共に、主にECアプリなどを開発しております。
そんな私がスマホアプリの学習をしようか検討中の方に向けて、「アプリのフロントはこんな感じ」というのを共有させていただければと思い記事にしました。

2. スマホ開発の仕事はある?

学習するか悩んでる言語がある方の多くは、「その言語を学んでも仕事が無いんじゃ意味がない」と思っている方だと思います。
確かに「仕事がない」=「必要とされていない」と言っていいと思うので、これから学習する言語は仕事が多く取れる言語が良いですよね。
その点、スマホのエンジニアは仕事があると私は胸を張って言えます。
これは「勤めている会社の中で仕事があるから」「自分がやっているから」というだけが理由ではありません。
私は趣味で英語の勉強会に行くのですが、その際職業の話になりアプリを作っていることを話すと、
結構な確率で「こういうサービスを考えているんだけど…」と相談されます。
今、何かサービスを作って流行らせようとする人は「アプリを作ろう」と考える人が多いと思います。
一昔前Webサイトのエンジニアが引っ張り凧だったように、アプリもサービスの入り口として考える人が多くなった今では、比較的仕事は取りやすくなっていると言えると思います。

3. 将来性は?

いきなりマイナスな事を言いますが、近い将来アプリの言語が衰退するのは間違いないと思います。
その将来が何年後になるかは分かりませんが、スマホがもの凄い勢いで発展したように、
スマートグラスなのか、スマートウォッチなのかは分かりませんが、次のハードが進化した時、
必ずスマホ周りの言語も衰退します。
ただこれはどんな言語もほぼ同じなので、月並ですが、日々情報を追っていくしか無いと言えるでしょう。

4. 学習コストは? Python、Ruby、C++と比べたら?

4-1) 難しさのレベルは?

私が学習したことのある言語で具体的にアプリ等を最後まで作ったことのある言語は、
Swift、Kotlin、Java、 JavaScript、GAS、Python、Ruby、C#(Unity)、C++です。
これらを実際に学習してみて、アプリのフロントで主に扱う言語のSwift、Kotlin、Java Script (React-Nativeなど)、C# (Unity)の学習コストを比較して考えてみると…
中くらいのレベルの難しさ、と僕は言いたいです。

複数の言語を学習したことがある方ならお分かりいただけると思うのですが、
基本文法の学習コストはどれもそんなに変わりません。個々の好みの範囲と言えると思います。
現によくRubyやPythonは学習コストの低い言語として取り上げられますが、僕はあまりそう思いません。

4-2) 学習コストの差

では学習コストで生まれる差は何か?
それは何に使うかです。Pythonなら機械学習など、RubyならWebアプリ作成など、C++ならPCのリソースに関わるプログラムの作成…などなどです。
ではアプリのフロントで使用する言語では?
当然スマホのアプリを書くためです。
他の言語と比較して目的がはっきりしている分、学習者が突っかかる問題も同じ事が多いです。
そのためネットでエラーを検索するとその解決法は他の言語に比べ見つけやすいです。
初学者にとって入門しやすいと私は思います。

4-3) アプリのフロントならではの難しさ

ではなぜ「Swiftは簡単な言語」と、手放しでは言えないのか?
その主な理由はOSやハードウェアの進化にあります。
皆さんも日々生活されていて、新しいiPhoneのニュースなどはTVやYouTubeなどで、よく見かけると思います。
Androidも同様に日々革新的な進化をし続けています。
アプリのフロントはこれらを追い続けなければならないのです。
アプリのフロントの言語は初学者にとっては入門しやすいですが、どれだけ熟達しても学習が定期的に必要な言語と言えると思います。
これが私が簡単が言語とは言い難いと思う理由です。

5.クロスプラットフォーム?ネイティブ?

少し突っ込んだ話になります。
まず学ぶなら、React-Nativeなどのクロスプラットフォームがいいか、ネイティブがいいか?
私はネイティブをオススメします。
というのもクロスプラットフォームを使ってもどのみちXcodeやAndroid Studioの使い方を知る必要がありうるからです。
例えばReact-Nativeでアプリを書いた場合、iPhoneの実機でのデバッグはXcodeからビルドする必要があります。
また、アプリのアーカイブやライブラリの設定、証明書の設定などをする際も同様です。
せっかくアプリを書いたのに、そこから使ったことのないツールをまた一から学習するのは少しうんざりしますよね。
ですので、チュートリアル程度でいいのでSwiftとKotlinである程度学習してから、クロスプラットフォームを使用することをオススメします。

6.最後に

色々とごちゃごちゃ書きましたが、
私はアプリのフロントはとても楽しくやらしていただいております。
世の中から必要とされている実感がある、とてもやりがいのある仕事です。
この記事が少しでもスマホアプリのフロントエンドエンジニアになろうと思っている方のお役に立てたら、とても嬉しいです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Swift5】UIActivityIndicatorViewの実装,UITableView画面でぐるぐる回る~~

この文章のデモはこのようになる

本記事はUIActivityIndicatorViewの使い方を勉強する個人的メモとします.役に立てればうれしいです.

UIActivityIndicatorViewは下図のようなぐるぐる回るやつです,
Web経由のデータリクエストや重い処理でロードするときによく使います
687474703a2f2f692e696d6775722e636f6d2f344861624448612e676966.gif

実装方法

こんな感じで簡単に実装できます.
start ぐるぐる
処理を実行する
stop ぐるぐる

本来であれば,Web経由のデータリクエストを行う際に,
データのレスポンスが来るまで画面の背景は何も表示しないのですが,
このデモはすでに存在するTableViewを隠すために”BackgroundView”を入れた.
ぐるぐる終了まで文字を隠すためです.(笑)

Viewの構造は下図のようになる

そのViewの上に”TempView”を置き,色:black, 透明度:50%, 円角:6

TempView.layer.cornerRadius = 6

UIActivityIndicatorViewの実装1.

UIActivityIndicatorViewを用意し,アニメーションのスタート関数とストップ関数を作る.

@IBOutlet weak var TempView: UIView!
// TempViewを置き
@IBOutlet weak var backgroundview: UIView!
// backgroundviewを置き
@IBOutlet weak var activtiindicator: UIActivityIndicatorView!
// StoryBoard上でUIActivityIndicatorViewを置き,変数名activtiindicatorとする
@IBOutlet var TableViewPageTable: UITableView!
// TbaleViewに変数名TableViewPageTableをつける



// アニメーションを実行する関数を作る.
func startAnimating() {
        activtiindicator.startAnimating()
        // アニメーションを実行する(ぐるぐる)
        activtiindicator.isHidden = false
        // アニメーションを実行する際,UIActivityIndicatorViewを表すようにする.
    }

// アニメーションを停止する関数を作る.
func stopAnimating() {
        if activtiindicator.isHidden == false {
            activtiindicator.stopAnimating()
            // アニメーションを停止する
            activtiindicator.isHidden = true
            // アニメーションの実行が終了後,UIActivityIndicatorViewを隠すようにする.
        }
        TempView.isHidden = true
        // アニメーションの実行が終了後,背景画面も一同に隠す.
        ViewBackground.isHidden = true   
        // アニメーションの実行が終了後,背景画面も一同に隠す.
    }

UIActivityIndicatorViewの実装2.

実際に実行し,重い作業を行っていることを想定する.

    override func viewDidLoad() {
    super.viewDidLoad()
        TempView.layer.cornerRadius = 6
        // TempViewの円角を6に設定.
        startAnimating()
        // ぐるぐる回りはじめる.
        DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2), execute: {
            // 2秒ぐらい待ち
            self.stopAnimating()
            // ぐるぐるが終了する.
        })
    }

~全体のコードは以下のURLでダウンロードできる.~
https://github.com/funsiyuan/UseActivityIndicator

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【iOS】UITextViewに埋め込めるリンク3種類の紹介

以下の3種類のリンクを紹介。
[1] ブラウザでインターネット上のURLを開く
[2] アプリ内の特定のページを開く(好きなコードを動かせるので、実際はなんでもできる)
[3] 外部アプリを開く

例えばこういう時に使えます!
[1][2] 規約やポリシーへの同意を求める文面で、青い部分をタップした時にウェブやアプリ内の該当ページを見せたい。
image.png
[3-A] カメラ等の利用許可を得るために、設定アプリを開かせたい。
[3-B] 住所・施設等の紹介ページに、マップアプリを開くリンクをつけたい。

1. インターネット上のURLへのリンク

基本です。
AttributedStringで文章を作り、rangeを指定して.linkAttributeを付与。
その後、textViewのattributedTextに設定。

ViewController
class LinkUIViewController: UIViewController {
    @IBOutlet weak var textView: UITextView! {
        didSet {
            let baseString = "Googleへのリンク"
            let paragraph = NSMutableParagraphStyle()
            let attributedString = NSMutableAttributedString(string: baseString, attributes: [NSAttributedString.Key.paragraphStyle: paragraph])
            attributedString.addAttribute(.link, value: "https://www.google.com/", range: NSString(string: baseString).range(of: "Google"))
            textView.attributedText = attributedString
        }
    }
}

2. アプリ内リンク

アプリ内の遷移先をStoryboardで作る

まず、遷移先の画面を用意する。既にある場合は飛ばしてOKです。

今回の遷移先のViewControllerをもつStoryboardを作成。
image.png
利用規約のViewControllerを作る。
image.png
それぞれのViewControllerにIDを振る。
image.png
なお、Storyboard IDとRestoration IDは同じにすることが推奨されており、Restoration ID設定のUse Storyboard IDにチェックを入れるとStoryboard IDと同一名扱いになる。

コード

1と同様にURLを埋め込むが、これを任意の文字列にしておく。
今回は"TermOfUseLink"に。

LinkUIViewController.swift
class LinkUIViewController: UIViewController {
    @IBOutlet weak var textView: UITextView! {
        didSet {
            let baseString = "利用規約へのリンク"
            let paragraph = NSMutableParagraphStyle()
            let attributedString = NSMutableAttributedString(string: baseString, attributes: [NSAttributedString.Key.paragraphStyle: paragraph])
            attributedString.addAttribute(.link, value: "TermOfUseLink", range: NSString(string: baseString).range(of: "利用規約"))
            textView.attributedText = attributedString
        }
    }
}

そしてUITextViewDelegateのtextView(_:shouldInteractWith:in:interaction:)を使うと、URLを開く前に判定できる。
URLに先程の"TermOfUseLink"が設定されていた場合、Storyboard経由でViewControllerを呼ぶようにする。

UITextViewDelegateExtension.swift
import UIKit

extension LinkUIViewController: UITextViewDelegate {
    public func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
        let urlString = URL.absoluteString
        if urlString == "TermOfUseLink" {
            // Storyboardを呼び出し
            let storyboard = UIStoryboard(name: "MyPage", bundle: nil)
            // Storyboard内のViewControllerをIDから呼び出し
            let viewController = storyboard.instantiateViewController(withIdentifier: "TermOfUse")
            // 画面遷移
            navigationController?.pushViewController(viewController, animated: true)
            return false // 通常のURL遷移を行わない
        }
        return true // 通常のURL遷移を行う
    }
}

そしてここでreturn falseすると通常のURL遷移はキャンセルされる。
単にURLを開く許可・不許可を判定する用途にも使える。

Return Value
true if interaction with the URL should be allowed; false if interaction should not be allowed.

3.外部アプリへのリンク

設定を開く

定数としてUIApplication.openSettingsURLStringが利用でき、これを使うと標準で自分のアプリに関しての設定画面が開く。

ViewController
class LinkUIViewController: UIViewController {
    @IBOutlet weak var textView: UITextView! {
        didSet {
            let baseString = "設定へのリンク"
            let paragraph = NSMutableParagraphStyle()
            let attributedString = NSMutableAttributedString(string: baseString, attributes: [NSAttributedString.Key.paragraphStyle: paragraph])
                                                         // ↓これ
            attributedString.addAttribute(.link, value: UIApplication.openSettingsURLString, range: NSString(string: baseString).range(of: "設定"))
            textView.attributedText = attributedString
        }
    }
}

特定のアプリを開く

有名サービスの多くはiOS9以降のUniversal Links機能に対応しているので、Twitter等を呼ぶ際に特に意識することはないと思われる。
例えばGoogleMapなら、以下のようなURLで特定座標をMapアプリもしくはブラウザで開いてくれる。
"https://www.google.com/maps/@42.585444,13.007813,6z"
https://developers.google.com/maps/documentation/urls/ios-urlscheme

まとめ

「3種類」と言っても、流れはどれも同じでした。
step1. テキストにNSMutableAttributedStringでリンクを埋め込む
step2. shouldInteractWithでリンクを判定
step3. 必要に応じて好きな動作

これに限らずUITextViewDelegateはすごく強いので、うまく使ってやりたいところです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む