【解決しました】iOSのアプデで「アップデート準備中…」で止まったが解決した

 iOS14.8 や iOS15.0 のアップデートで起こっていた

「アップデート準備中…」で固まったまま、プログレスバーの進捗が止まる現象。

「iOS15.1」へのアプデでも、また当たり前のように発生しました!


またか・・。という事で同様の現象でお困りの方へのメモを残しておきます。


■ 対処方法

※自身の端末で動作確認した行動を記載していますが、自己責任の上、行ってください。

※当サイトは以下行動で起こったいかなる端末異常/症状への責任はおいかねます。

1. アプデ中の場合は、一度WiFiをオフにして強制キャンセルする。
  また、自動アップデートをOFFにする。(アプデキャンセルからOFFのできるかは未確認)

2. ストレージの空き容量が十分に確保
(iOS15.0からiOS15.1へは2GB程度でよいですが、もっと前のバージョンからはできるだけ多くのストレージを空けておきましょう)
 空き容量は、設定から「一般」→「iPhoneストレージ」で確認できます。
 自分は250GB以上の空きの状態で行いました。

3. 端末を再起動する(余計なアプリはすべて終了させてから行うこと!)

4. WiFiにつなぎなおす

5. WiFiの電波が強になっているか確認(WiFiアイコンの波がフルで光っている)

6. アップデートを開始(あるいは再開)

7. 30分~1時間放置!

最後は「放置!」これに限ります。

なお、私は端末でYoutube見ていて、30分ほどしたら終わっていました。


完了すると、上記スクリーンショットの最下段のように「今すぐインストール」が表示されました。

これで今すぐインストールを押すと・・、


こうなって、端末が勝手に再起動するのでしばらく待ちます。




再起動されたあとにバージョンを確認。無事アップデートされました!





「アップデートを準備中...」と出て全然「iOSバージョンアップができない」問題

きっかけは「iOS 14.8」アップデート

iOS 14.8にアップデートしようとしたところ、 「アップデートを準備中...」の表記がでて全然進まなくなりました。





さきに結論から


今回の一件で試したところ、 以下の状況で起こることがわかりました。

  • 通信状況が悪いとき
  • Appleのサーバが混み合ってるとき

自分は、
  • 電波の良いWiFiにつなぎなおし
  • Youtubeでも見ながら放置してたら
いつの間にか終わっていました。

詳細は、以下で解説します。 



一度キャンセルして端末を再起動


5分以上同じ画面でプログレスバーも全然進まないので、

一度キャンセルして端末再起動したいと思いました。

キャンセル選択は特にありませんが、WiFiを切ると強制キャンセルとなるようです。




「一時停止中」になったので、端末を再起動しました。



電波弱いWiFiアクセスポイントにつないでいた事に気づく


念の為、WiFiもつなげなおそうと、現在の設定をふとみたら、

別の部屋においているルータのWiFiにアクセスしていて、

そもそも電波アイコンが2つの状態でした。


ああ、通信状況悪かったのか・・、

と今いる部屋のルータにつなぎ直し

電波強の状況にしてリトライ。

結果変わらず

「アップデートを要求しています」から

 「アップデートしています」的なダウンロードに変わるも

結局また「アップデートを準備中...」となりプログレスバーが止まりました。


止まった位置はさっきと違います。

・・という事は。


Apple側が混んでいる

こちら側の環境がよくなっても、停止する位置が不安定ということは

iOS側(Apple側)が要因であると思われます。

iOS14.8リリース時は、Twitterのトレンドでも話題になっており、

非常に危険なセキュリティホールを埋めるアップデートだったため

世界的にも話題となっていましたので、

ダウンロードが殺到していた事も考えられます。



進まないものは仕方がない

iPhoneの空き容量も100GB以上あり、端末の問題ではなさそうという事で

Youtubeで音楽でも聞きながら仕事に戻ることにしました。



そして、一時間後

アップデート画面を確認すると・・

ダウンロードが完了しているではありませんか!(SS撮り忘れました・・)


さっそくインストール

Youtubeなど「オーディオ再生中はアップデートできません」という表示がされていたので

Youtube再生を止めてインストールを押したら、無事インストールされました。




まとめ


というわけで、

  • WiFiの電波に問題はないか→「速度計測サイト」で目安確認しましょう。
  • 端末の空き容量は問題ないか
  • 端末を再起動しても変わらないか

これでもダメなら放置して気長に待ちましょう!

「DOTween」の警告を解消する

警告が出た

DOTweenを使用してロジックを組んでいた所、以下の警告が出て気になりました。

DOTWEEN ► This Tween has been killed and is now invalid

原因

すでにTweenの再生が終了しているものに対して、DOTween APIを使用すると発生するようです。

if (tween != null && tween.IsPlaying()) // ここで警告が出ている
{
    tween.Complete();
}

上記のような場合、tweenがもう再生済みでKillされているにも関わらず

「IsPlaying()」がコールされた事で警告が発生します。

対策

if (tween != null && tween.IsActive() && tween.IsPlaying())
{
    tween.Complete();
}

というように「IsActive()」を追加する事で警告なしでTweenがすでに無効化されているかを確認できます。

公式ドキュメントにも、以下のように記載されているので、意図した挙動となっています。

Returns FALSE if the tween has been killed.

「C#」で「拡張メソッド」を作ろう

C#の拡張メソッドとは?

例えば、

"なにがし".IsNullOrEmpty()

で、引数の文字列が「nullまたは空」なら「true」を返すというメソッドがありますが、

都度、 「string.IsNullOrEmpty」 と記述されるのは長ったらしいので、

"なにがし".IsNullOrEmpty()  

といった書き方でも同様の処理ができるようにしたい時、拡張メソッドで実現可能です。

上記のように「既存の型」に対して、「新しい機能を追加」できる概念を「拡張メソッド」といいます。

実例

string a = "123";
string b = null;
Console.WriteLine( $"{a.IsNullOrEmpty()}/{b.IsNullOrEmpty()}" ); 
```shell > false/true

こんな感じで、文字列の後ろにメソッドを書く感じにします。

やりかた

基本的に 「public staticなクラス」 の中に

「public staticなメソッド」 を作って

「最初の引数の頭にthisというキーワードをつける」 だけでOKです。

実際に書いてみます。

public static class StringUtility
{
    public static bool IsNullOrEmpty( this string str )
    {
        return string.IsNullOrEmpty(str)
    }
}

これだけです。

追加した拡張メソッドを使って処理を書くと、以下のようになります。

Console.WriteLine( $"{"ABC".IsNullOrEmpty()} ); // false

string test = null;
Console.WriteLine( $"{test.IsNullOrEmpty()} ); // true

“ABC” も文字列リテラルのstring扱いなので、

(今回のメソッドでは、ほぼ無意味ですが)そのまま拡張メソッドを使用可能です。

まとめ

  • 適当な名前の「public static class」を追加
  • 「public static」なメソッドに「bool」を返してほしいので、戻り値に「bool」
  • 「最初の引数の頭にthis」というキーワードをつける
  • あとは、処理を書くだけ

こうする事で、「thisを付けた型」の変数の後ろに「ドット 拡張メソッド名」の形式で呼べるようになります。

ちなみに、「クラス名」「メソッド名」「thisの後ろの型」「thisの後ろの変数名」は任意に付けられますので、

必ず上記サンプルの名前でなくてはならないという事ではない点は、抑えておきましょう。

色々、応用が聞くので自分なりの拡張メソッドで開発を効率化しましょう!

TypeScriptで「文字列」を「数値」に「変換」する方法

TypeScriptで文字列→数値に変換

文字列を数値にする変換する方法のメモ。
基本的にNumber()メソッドに文字列を渡せばOK。
let num:number = Number("12345")

GitHub登録時のメール認証時に「What!?」エラーが出る

経緯


GitHubに、メインアカウントとは別のアカウントを用意しました。

登録自体は正常に終了し、メール認証してね画面まで進んだところ・・ 


謎のエラーに遭遇

認証メールからGitHubにログインするとエラーが出て入れません。 

 What‽ Your browser did something unexpected. Please try again. If the error continues, try disabling all browser extensions or using a different browser. Please contact us if the problem persists.


解決方法

Chromeで開いていたのを、シークレットモードからログインすればなんなく進みました。

シークレットじゃない状態でも開けるようにするには、

おそらく複数アカウントを持っていると出るので、

一度、普通にログイン済みのアカウントをログアウトかつ、

ブラウザのキャッシュなどをクリアしないと解決しないと思われます。

Unityの「instantiate is null」エラーを解決する

問題点

インスペクタに正しく参照を設定しているにも関わらず、

ArgumentException: The Object you want to instantiate is null. UnityEngine.Object.CheckNullArgument (System.Object arg, System.String message) 

がコンソールに出ました。

なぜか未実行時にも出て、実行時にも当然出るのでおかしいなと思っていたのですが、
ステップ実行したら一瞬で原因がわかりました。

原因


- 「Awake」ではなく「クラスコンストラクタ」でInstantiateしていました。
- もともとピュアクラスだったものをビヘイビアに変えたときにコンストラクタをAwakeにするのを忘れていました。
- 「コンストラクタ」をやめて「Awake」内に入れて解決しました。

NG例:

public class YourClass : MonoBehaviour
{
    public YourClass() {
        var dest = Instantiate( sourcePrefab );
    }
}

OK例:

public class YourClass : MonoBehaviour
{
    private void Awake() {
        var dest = Instantiate( sourcePrefab );
    }
}


まとめ


クラスコンストラクタをAwakeに書き直してみましょう!