底辺SE奮闘記

年収300万SEブログ

【Xcode・iOS】"An SSL error has occurred and a secure connection to the server cannot be made."に対処

タイトル通り、

An SSL error has occurred and a secure connection to the server cannot be made.

のエラーに対応します。

上記エラーの原因はHTTPS接続がAppleのセキュリティ水準に達していないことにあります。

検索エンジンで検索するといくらでも回答が出てきますが、以外とハマる点についても言及しておきます。

解決できるエラー文言

An SSL error has occurred and a secure connection to the server cannot be made.
App Transport Security has blocked a cleartext HTTP connection since it is insecure. Use HTTPS instead or add Exception Domains to your app's Info.plist.

などなど

環境

  • Xcode13
  • iOS15

対応

通常の解法

  1. プロジェクトの管理画面を見る
  2. プロジェクトのTARGETSを選択
  3. 「Signing & Capabilities」を開く
  4. 左上の「+ Capability」をクリック
  5. 「App Transport Security Exception」を選択
  6. 「App Transport Security Exception」欄の+を押下し、セキュリティ除外したいドメインを設定。

f:id:uma-no-kawa:20211008141710p:plain

f:id:uma-no-kawa:20211008141755p:plain

f:id:uma-no-kawa:20211008141838p:plain

見逃しやすい?ポイント

上記対応を行なったドメインは「https://~」で接続してはいけない。

【SwiftUI・ColorPicker】カラーホイールをカスタマイズ(非表示)するアイデア

環境

  • Xcode 13
  • Swift 5
  • SwiftUI
  • iOS14, 15

解決する問題

  • カラーホイールが邪魔(オリジナルデザインにしたい)
  • UIColorPickerViewControllerの出し入れを自分でコントロールしたい

作戦

現在(2021/10/07)のiOSデフォルトのカラーピッカーはラベル横のカラーホイールは非表示にできません。ラベルは非表示にできるのに...。

なのでUIColorPickerViewControllerをSwiftUIで使用することを考えます。

実装

UIViewControllerRepresentableプロトコルを実装したクラスを作成します。

import Foundation
import SwiftUI
import UIKit

/// カラーピッカーコンテナ
struct ColorPickerContainer : UIViewControllerRepresentable
{
    //新しい色が設定されたら呼ぶ
    let changedColor : (Color) -> Void
    
    //イベントを受け取るコーディネータ
    class Coordinator: NSObject, UIColorPickerViewControllerDelegate{
        // カラーピッカーコンテナ
        private let parent: ColorPickerContainer
        
        init(parent: ColorPickerContainer) {
            self.parent = parent
        }
        
        // 新しい色が設定されたら呼ばれる
        func colorPickerViewController(_ viewController: UIColorPickerViewController, didSelect color: UIColor, continuously: Bool) {
             changedColor(Color(color))
        }
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(parent: self)
    }
    
    // UIColorPickerViewControllerを表示しようとしたらよばれる
    func makeUIViewController(context: Context) -> UIColorPickerViewController {
        let controller = UIColorPickerViewController()
        controller.delegate = context.coordinator
        controller.title  = "タイトル"// カラーピッカーのタイトル
        controller.supportsAlpha = false// 色の透明度を設定できるか否か
        return controller
    }
    
    func updateUIViewController(_ uiViewController: UIColorPickerViewController, context: Context) {
        //
    }
}

使い方例 Example

import SwiftUI

struct TestView: View {

    ///カラーピッカーを表示するか
    @State private var isShow = false
    
    var body: some View {
        VStack{
            Button(action : {
                isShow = true// 押下でカラーピッカーを開く
            }) {
                Text("カラーピッカーを開く")
            }    
        }
        .sheet(
            isPresented: $isShow,
            onDismiss: {}) {
            ZStack(alignment: .top){
                ColorPickerContainer (){ color in
                    // ここのcolorを好きなように使う
                }
                // 閉じるボタンがなかったので下記のように設定すると良い
                HStack{
                    Spacer()
                    Button(action: {
                        isShow = false
                    }) {
                        Text("閉じる")
                            .foregroundColor(Color("text_main"))
                            .padding(.top, 20)
                            .padding(.trailing, 20)
                    }
                }
            }
        }
    }
}

struct TestView_Previews: PreviewProvider {
    static var previews: some View {
        TestView()
    }
}

【SwiftUI】テキストをセンタリングしたアイコン付きボタンを作るアイデア

テキストを中央寄せにしながら、そのテキストの前(後)にアイコンがついたボタンを製作します。

バージョン

  • Swift 5

完成イメージ

f:id:uma-no-kawa:20211001155538p:plain

実装

アイコンが必要な方の四角をImageなどに変更し、 Imageと同じサイズを不要な四角のframeにセット、 不要な四角の色を.clearに変更すれば完了です。

f:id:uma-no-kawa:20211001155248p:plain

Button(action:{
    //action
}){
    HStack(spacing:10){

        // 左四角
        Rectangle()
            .fill(.blue)
            .frame(width: 35, height: 35)

        //テキスト
        Text("次へ").foregroundColor(.white)

        // 右四角
        Rectangle()
            .fill(.blue)
            .frame(width: 35, height: 35)

    }.frame(width: 335, height: 60, alignment: .center)
}.background(Color.red)

別解

Rectangleではなく、Colorだけでもいけることに気がつきました。

Color.clear.frame(width: 35, height: 35)

【Stripe】Cannot create the usage record with this timestamp because timestamps must be after the subscription's last invoice period (or current period start time). に対応する

タイトルの通り、使用量をStripeに登録しようとすると下記のようなエラーが発生。

Cannot create the usage record with this timestamp because timestamps must be after the subscription's last invoice period (or current period start time).

原因はよくわからないのだが、サブスクリプション契約データを作成してすぐに、使用量の報告を行うと発生したりする。(テスト時)

なので、使用量の報告をする前に1秒ほどスリープをいれることで対応完了とした。

<?php
    sleep(1);

本番環境では手動操作なので、スリープなしでも問題ないはず。

【Laravel】storage以下の画像ファイルが表示されない(403エラー)現象と驚きの原因

考えられる原因

1. シンボリックリンク貼ってない

ネットでよく見るケース。下記で対応

php artisan storage:link

2.サーバがシンボリックリンクを許していない

これはまさかのケース。

apacheの場合は.htaccessに下記追加で対応。

Options +FollowSymLinks

【AWS EC2】重い時(最悪タイムアウト)に確認するところ

AWSでウェブサーバを組んでる際に発生し得る重い/タイムアウトの改善について、随時まとめます。

改善方法は主に下記の二種類に分けることができるかと思います

  • スペック系
  • 設定系

スペック系は費用に直結するので、要財布と相談。

設定系は、処理を速くするもの、遅くてもタイムアウトさせないようにするもの、などが考えられる。


目次


EC2

基本(スペック系)

CPU使用率等を確認し、必要であればインスタンスタイプを変更しましょう。

*変更時、ダウンタイム有り。

PHP

PHPWEBサービスを運営している場合に確認

バージョン(設定系)

5系を使っている場合は7系にバージョンアップすることを推奨。それだけで速くなる。

設定変更(設定系)

phpinfo()等で読み込まれているphp.iniの場所を確認し、下記項目をいい感じの値に設定。

max_execution_time=999
max_input_time=999

*サーバの再起動が必要。

RDS(スペック系)

CPU / CPUクレジット残量などを確認し、必要であればインスタンスタイプを変更しましょう。

*変更時、ダウンタイム有り(10分前後)。

ELB(CLB)(設定系)

ロードバランサーにもタイムアウトの項目があるので、随時設定

「設定」 > 「属性」 > 「アイドルタイムアウト」

思いついたら随時追記します。

(ロリポップレンタルサーバ + SSL) x LINE Bot MessagingAPIプッシュメッセージの可否

2021年08月30日 下記を確認しました。

SSL種別 プッシュメッセージ可否
無料SSL 不可
クイック認証SSL

ただクイック認証SSLでVerifyボタンを押して疎通確認してもSuccessじゃない時があった。

Successじゃない時はうまくいかないが、Successの時はうまくいく謎な時期があった(無料SSLから切り替えを行ったので、切り替え中だったとか?)

怖いので、Verifyボタンは触らないようにしている。今のところうまく機能している。