Error: unrecognized selector sent to instance

Error

2021-07-17 17:22:01.168937+0900 MaskedBlur2[19987:9237645] -[NSConcreteValue X]: unrecognized selector sent to instance 0x2835e0690

2021-07-17 17:22:01.172931+0900 MaskedBlur2[19987:9237645] *** Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘-[NSConcreteValue X]: unrecognized selector sent to instance 0x2835e0690’

*** First throw call stack:

(…)

libc++abi: terminating with uncaught exception of type NSException

*** Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘-[NSConcreteValue X]: unrecognized selector sent to instance 0x2835e0690’

terminating with uncaught exception of type NSException


Cause

Unexpected data type was passed for a parameter.
In this case, forKey:kCIInputCenterKey is expecting CIVector, but CGPoint was passed.

OK

    var location: CIVector= CIVector(cgPoint: CGPoint(x: 0, y: 0))

    radialMask.setValue(imageCenter, forKey:kCIInputCenterKey)

Error

    var location: CGPoint= CGPoint(x: 0, y: 0)

    radialMask.setValue(location, forKey:kCIInputCenterKey)

SwiftUI: ForEach, forEach, for in の違い

SwiftUIでは、ForEach, forEach, for in の動きが異なります。

import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            // OK
            // SwiftUI の ForEach は View を返すので OK
            ForEach(1..<5) { i in Text("hello") }
            
            // Error: Closure containing control flow statement cannot be used with result builder 'ViewBuilder'
            // クロージャーを持つ制御文は 複数のView を構成する ViewBuilder として使えない
            // 要は、次のように複数の Text からなる View を構成することができない
            for i in 1..<5 { Text("hello") }
            
            // Error: Type '()' cannot conform to 'View'
            // forEach は View を返さない
            [1,2,3,4].forEach{ d in Text("hello") }
        }
    }
}

XCode UnitTest Error : Multiple commands produce …

Symptom

  1. Create a project.
  2. Add a new target with Swifter by pod install
  3. run a unit test, then Multiple commands produce … error comes up.

Cause

Error Message is as follows.

Multiple commands produce …..
1) Target ‘appname’ has … /appname.app’
2) Target ‘appname_Twitter (iOS)’ has…./appname.app’

It means, there are two files with appname.app for two different targets.

Solution

Rename one of the product name, and clean rebuild.
In my case, I renamed my app with Swifter from TARGETS >> Build Settings “Product Name” from appname to appname2.

Warning: To use these entitlements, add them to your entitlements file. Otherwise, remove unused entitlements from your provisioning profile.

Symptom

When I was building an App Clip, the following warning was reported by XCode. Provisioning profile “iOS Team Provisioning Profile: com.aiharasoft.***App” for “***” contains entitlements that aren’t in the entitlements file: com.apple.developer.associated-appclip-app-identifiers. To use these entitlements, add them to your entitlements file. Otherwise, remove unused entitlements from your provisioning profile.

Solution

From https://developer.apple.com/, “Certificates, Identifiers & Profiles” >> “Profiles” >> Choose profile. Somehow, the Status got into Invalid.

And I edited the profile and saved, and the status turned to Active.Rebuild XCode and the warning has gone.

Another point is when I added “Associated Domains” from capabilities, only on debug was selected. Thus, two entitlements file for debug and release were created. I did not notice the two entitlements, debug and release files became inconsistent, and then uploaded to App Store Connect. So, the app got into into inconsistent state.

I’m not sure, but as the warning says, inconsistency between Provisioning Profile and *App.entitlements causes this warning.

Anyway, check the Profiles, entitlements, and the consistencies, first.

  1. https://developer.apple.com/, “Certificates, Identifiers & Profiles”
  2. App.entitlements in Xcode file.

XCode cannot get into debug mode with message: “Finished running”

Symptom

When I started debugging with XCode on a physical iPhone 8 device, the debugger stopped with “Finished running”. The app was successfully deployed, up and running on a device, but it could not start debugging.

On a simulator, Xcode could get into debug mode.

Restarting xcode did not solve the problem.

Solution

Reboot the iPhone and restart Xcode.

[Error] The file couldn’t be opened because you don’t have permission to view it.

Symtom

While accessing PHPicker, the following error occurred. However, I could access the image successfully.

2021-03-07 16:28:16.910394+0900 **** [4516:1164237] [default] [ERROR] Could not create a bookmark: NSError: Cocoa 257 “The file couldn’t be opened because you don’t have permission to view it.” }

Solution

Reference:

https://developer.apple.com/forums/thread/654021

https://developer.apple.com/forums/thread/652695

Per Apple Frameworks Developer, they are aware of this issue (64630315) and it will be fixed in a future release. (as of 2020 Summer).

To workaround the permission error for now, you need to reset your simulator / device.

Panasonic Let’s Note CF-SX1 Win10 20H2 Updateで遅くなる

現象

9年前のPanasonic Let’s Note CF-SX1を、ハードディスクをSSDに換装して、さらに Win10 64bit にアップデートしたものをサブPCとして全く問題なく好調に使っていました。

ところが、Windows 10 Version 20H2 更新プログラムを適用したら、めちゃめちゃ遅くなった。タスクマネージャで確認すると、次のように CPU が50%以上システムに消費されており、応答がとても遅くなり、使い物にならないレベルになった。

対応

以前、SSDに換装して、Windows 10を導入した際に、同じ現象になり、その時にLets Noteのドライバーを入れ直して、解決したことを思い出した。

そこで、サポートページより、あたりをつけて、Intel(R) Dynamic Power Performance Management ドライバーを適用すると、正常動作に戻った。

適用後はこんな感じ。

PHPhotoLibrary.requestAuthorization not asking permissions

Sub Title

How to clean up the app and all associated data from devices.

Symptom

XCode 12.4

iPhone 8

iOS 14.4

macOS Big Sur 11.2.1

When I was testing Nega Viewer App Clip which access the camera and photo library, suddenly PHPhotoLibrary.requestAuthorization did not ask permissions. I tried the following cases, and only #3 worked for me.

Solutions

Case #1

  1. Remove the application from the iPhone.
    It did not work.

CASE #2

  1. Remove the application from the iPhone.
  2. Go to [Settings] >> [General] >> [Date & Time]
  3. Set Automatically Off
  4. Set future date

It did not work.

Case #3

  1. Remove the application from the iPhone.
  2. Power off iPhone and restart.

It worked. After the restart, it did not happen again.

Case #4

  1. ⌘ + Shift + 2, or Xcode >> Menu >> Window >> Devices and Simulators
  2. Select the application and press the minus button to delete the app and all associated data.

Before I tried this, it has been fixed. I will try this next time.

App Clipの起動エクスペリエンスをテストする方法

Reference

Testing Your App Clip’s Launch Experience

を翻訳したものです。ご参考になれば幸いです。

概要

TestFlightからApp Clipを起動し、App Clipとその起動エクスペリエンスをテストします。

App Clipのユーザーエクスペリエンスには、高速でスムーズな起動エクスペリエンスが不可欠です。重要な要素の1つは、起動時の起動 URLです。その結果、App Clipエクスペリエンスの構成と、起動URLを処理するコードの記述にかなりの時間を費やすことになります。App Clipがスムーズな起動エクスペリエンスを提供することを確認するには、App Clipとその起動エクスペリエンスをテストする必要があります。App Clipの起動エクスペリエンスは、さまざまな方法でテストできます。

  • App Clipのコードに変更を加えるときは、_XCAppClipURL 環境変数を使用して起動URLを構成します。App Clipをビルドして実行し、起動URLを処理するコードをデバッグします。
  • テストデバイスでローカルエクスペリエンスを作成することにより、App ClipカードのデザインとApp Clipの起動エクスペリエンスを確認します。
  • ベータ版を他のユーザーと共有する準備ができたら、TestFlightでテスター向けのApp Clipエクスペリエンスを作成します。

App Clipをデバッグする

起動 URLはApp Clipのユーザーエクスペリエンスにとって重要であるため、起動URLを処理し、App ClipのUIを更新するコードを徹底的にテストすることが重要です。最初のステップとして、シミュレーターまたはデバイスでApp Clipをビルド、実行、およびデバッグします。次に、App Clipのデバッグ時に起動時にApp Clipで使用できるApp Clipへの起動URLを指定します。

デバッグ用の起動URLを構成するには:

  1. Xcodeで、[Product]> [Scheme]> [Edit Scheme]を選択し、App Clipのスキームを選択します。
  2. [Run]アクションを選択します。
  3. [Arguments]タブで、_XCAppClipURL 環境変数が存在するかどうかを確認します。App Clipターゲットをプロジェクトに追加すると、Xcodeはこの環境変数を追加します。存在しない場合は、環境変数を追加します。
  4. 環境変数の値を、テストする起動URLに設定します。
  5. 変数の横にあるチェックボックスをオンにして、変数を有効にします。
  6. App Clipを作成して実行し、NSUserActivityオブジェクトから構成したテストURLにアクセスします。起動URLへのアクセスの詳細については、「Responding to Invocations」を参照してください。

次のスクリーンショットは、_XCAppClipURL 環境変数の値を使用してApp Clipターゲットの実行アクションを構成するためのシートを示しています。

AppClipターゲットの実行アクションを構成するためのシートを示すスクリーンショット。 _XCAppClipURL環境変数の値は設定されていますが、有効になっていません。

Xcodeを使用してApp Clipをデバッグすると、App Clipがすぐに起動し、App Clipカードは表示されません。App Clipの完全な起動エクスペリエンスをテストおよびテストするときに、起動時にApp Clipカードを確認するには、テストデバイスにローカルエクスペリエンスを登録します。

ローカルエクスペリエンスを登録する

_XCAppClipURL 環境変数を活用すると、起動URLを処理するApp Clipのロジックをデバッグするときに役立ちます。ただし、App Clipが、さまざまな起動からの高速で信頼性の高い起動エクスペリエンスを提供することを確認する必要があります。さらに、App ClipカードはユーザーがApp Clipを起動したときの最初の操作であるため、App Clipカードの画像、テキスト、行動を促すフレーズの動詞を調べることは特に重要です。

起動をテストし、ローカルエクスペリエンスでApp Clipカードのデザインを調べるために、App Clipをウェブサイトに関連付けたり、ビルドをTestFlightにアップロードしたりする必要はありません。

ローカルエクスペリエンスを使用すると、次の方法でApp Clipを起動できます。

  • コントロールセンターのコードスキャナーまたはカメラアプリを使用してApp ClipコードまたはQRコードをスキャンします。
  • デバイスを、App Clipコードと連携したNFC、またはNFCタグに近づけるか、コントロールセンターのNFCタグリーダーでスキャンします。
  • SafariのWebサイトで Smart App バナーをタップします。
  • メッセージアプリで他の人が共有しているリンクをタップします。

ローカルエクスペリエンスを使用してApp Clipの起動エクスペリエンスをテストするには:

  1. テストデバイスでApp Clipのスキームを構築して実行し、App Clipがテストデバイスにキャッシュされていることを確認します。たとえば、Frutaサンプルコードプロジェクトでは、指示に従って構成してから、スキームを実行します。サンプルコードプロジェクトをダウンロードするには、Fruta: Building a Feature-Rich App with SwiftUI.にアクセスしてください。
  2. テストデバイスで、[設定]アプリを開き、[Developer]> [Local Experience]に移動して、[Register Local Experience]を選択します。
  3. テストする起動URLを入力します。場合によっては、https://fruta.example.comのような単純なURLプレフィックスでも可能です。また、パスとクエリパラメータを含むより長い起動URLにすることもできます。
  4. App Clipのbundle IDを入力します。
  5. Title とSubtitle のテキストを入力します。Frutaサンプルコードプロジェクトの場合、タイトル[Order a smoothie.]とサブタイトル[It’s yummy!]を入力します。
  6. 行動を促すフレーズ(たとえばOpen)を選択します。。
  7. App Clipカードのヘッダー画像として使用する写真を選択します。

注意

テストデバイスでApp Clipのスキームを構築して実行し、デバイスにキャッシュするだけでなく、App Clipの.ipaファイルをデバイスに手動で追加することもできます。まず、App Clipの対応する完全なアプリをアーカイブします。次に、Xcodeの[Organizer]ウィンドウで、Ad Hoc またはDevelopment distribution にApp Clipのバイナリをエクスポートします。最後に、App Clipのエクスポートされた.ipaファイルを、Xcodeの[Devices and Simulators]ウィンドウで接続されているデバイスにドラッグします。

次のスクリーンショットは、iPhoneでローカルエクスペリエンスを構成するために使用するインターフェイスを示しています。

ローカルエクスペリエンスを構成するためのインターフェイスを示すiPhoneのスクリーンショット。 URLプレフィックスとしてhttps://example.comを使用し、バンドル識別子としてcom.example.app.clipを使用します。 ローカルエクスペリエンスのアプリクリップカードのタイトルはサンプルアプリ、サブタイトルは「ローカルアプリクリップエクスペリエンス」、行動を促すフレーズの動詞はオープンです。

ローカルエクスペリエンスを使用して起動をテストする

App Clipをテストするためにデバイスでローカルエクスペリエンスを構成したら、起動手段より App Clipを起動できます。ローカルエクスペリエンスでテストする起動に関係なく、上記のようにApp Clipがテストデバイスにキャッシュされていることを確認してください。App Clipがキャッシュされていることを確認するためにApp Clipを少なくとも1回起動したら、次の方法でApp Clipを起動します。

  • 作成したApp Clipコード、QRコード、またはNFCタグをスキャンして、ローカルエクスペリエンスを起動します。テスト用のApp Clip Codesの作成については、「Creating App Clip Codes with the App Clip Code Generator]を参照してください。QRコードを作成したり、NFCタグを記述したりするには、お気に入りのツールを使用します。
  • Webサイトに追加したスマートバナーをタップします。
  • Smart App バナーを表示するウェブサイトへのリンクを共有する。メッセージの送信者をテストデバイスの連絡先として追加したことを確認します。

Associated Domains Entitlementローカルエクスペリエンスを起動するために、App Clipを構成したりWebサイトに関連付けたりする必要はないことに注意してください。Webサイトまたはメッセージアプリからの起動のサポートの詳細については、WebサイトおよびメッセージアプリSupporting Invocations from Your Website and the Messages App.を参照してください。

ヒント

[設定] アプリを開き、[コントロールセンター]を選択して、コードスキャナーとNFCタグリーダーをコントロールセンターに追加します。

デバイスでローカルエクスペリエンスを構成する場合、ローカルエクスペリエンスは、App Store Connect で構成するApp Clipエクスペリエンスよりも優先されます。ただし、ローカルエクスペリエンスでは、Development、Ad Hoc、またはTestFlight配布用に署名されたApp Clipのみが起動されます。App Storeで公開されているApp Clipや完全なアプリを起動することはありません。App Store Connectで構成するApp Clipエクスペリエンスをテストする前に、ローカルエクスペリエンスを削除することを忘れないでください。

TestFlightでテスター向けのApp Clipエクスペリエンスを作成する

信頼できるユーザーエクスペリエンスはApp Clipsにとって非常に重要であり、すべてのユーザーフローとサポートされている起動をテストするために時間を費やす必要があります。App Clipが期待どおりに機能することを確認するために、TestFlightのテスターがApp Clipを利用できるようにすることができます。まず、App Clip付きのアプリをApp Store Connectにアップロードします。次に、App Store Connectで、アップロードされたビルドに移動します。[App Clip]セクションでは、テスト用に最大3つの異なるApp Clipエクスペリエンスを構成できます。

重要

ローカルエクスペリエンスとは異なり、TestFlightでテスター用のApp Clipエクスペリエンスを作成するには、App ClipをWebサイトに関連付ける必要があります。関連するドメインの構成の詳細については、「Associating Your App Clip with Your Website」を参照してください。

ユーザーはApp Clipをインストールせず、App Clipはホーム画面に表示されません。同様に、テスターはApp Clipのベータ版をインストールせず、ホーム画面にも表示されません。代わりに、テスターは、デバイス上のTestFlightを介してテスト用に構成したApp Clipエクスペリエンスを起動します。

App Store Connectでテストするためのエクスペリエンスの構成の詳細については、「Testing an App Clip Experience」を参照してください。

テスターは、TestFlightで配布するApp Clipを起動するようにローカルエクスペリエンスを構成することもできます。ただし、App ClipをWebサイトに関連付ける必要があります。さらに、テスターは、App Store Connectで構成したテストのために、App ClipエクスペリエンスからApp Clipを起動して、App Clipがデバイスにキャッシュされていることを確認する必要があります。

AVCaptureSession.InterruptionReason.videoDeviceNotAvailableInBackground

概要

AVCaptureSession でビデオセッションがバックグラウンド・フォアグラウンドに移行した場合の動作に関して。

Reference

AVCaptureSession.InterruptionReason.videoDeviceNotAvailableInBackground

  • iOS9.0以降
  • Mac Catalyst 13.0+
  • AVFoundation

宣言

case videoDeviceNotAvailableInBackground = 1

Discussion

バックグラウンドでのカメラの使用は禁止されています。バックグラウンドでカメラの実行を開始しようとすると、キャプチャセッションはこの中断理由でAVCaptureSessionWasInterruptedを送信します。stopRunning()メソッドを明示的に呼び出さない場合、startRunning()リクエストは保持され、アプリがフォアグラウンドに戻ると、AVCaptureSessionInterruptionEnded を受信してセッションの実行が開始されます。

解説

AVCaptureがバックグラウンド・バックグラウンドに移行しても、明示的にsession を stopRunning, startRunning を行う必要はなく、自動的に停止・再開される。フォアグランドに戻った時に、AVCaptureSessionInterruptionEnded が呼ばれるので、そこで必要な処理(Permission のチェックなど)を行えば良い。

実装例

    override func viewDidLoad() {
        NotificationCenter.default.addObserver(self, selector: #selector(avCaptureSessionInterruptionEnded), name: Notification.Name.AVCaptureSessionInterruptionEnded, object: nil)
    }

    // フォアグランドに戻って、session が自動的に再開された
    @objc func avCaptureSessionInterruptionEnded() {
        debugPrint("avCaptureSessionInterruptionEnded フォアグラウンドに戻ったので、session が自動的に再開された")
        doSomething()
    }