🔨

Swift - ActionSheet(シェアボタン)がiPadでクラッシュする時の対処法

2022/05/13に公開約2,000字

クラッシュ

アプリにシェアボタンを設置したところ、なぜかiPadだけクラッシュしてしまう不具合が発生しました。

原因

iPadではiOSのシェア機能をそのまま使うことができないようです。
iPad対応をするにはiPad用の記述をする必要があります。

完成イメージ

iOS

iPadOS

完成コード

ViewController.swift
import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var button: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func buttonTapped(_ sender: UIButton) {
        let link = URL(string: "https://apps.apple.com")!
        let av = UIActivityViewController(activityItems: [link], applicationActivities: nil)
        let scenes = UIApplication.shared.connectedScenes
        let windowScenes = scenes.first as? UIWindowScene
        let window = windowScenes?.keyWindow
        window?.rootViewController?.present(av, animated: true, completion: nil)
        if UIDevice.current.userInterfaceIdiom == .pad {
            av.popoverPresentationController?.sourceView = window
            av.popoverPresentationController?.sourceRect = CGRect(x: UIScreen.main.bounds.width/2.1, y: UIScreen.main.bounds.height/1.3, width: 200, height: 200)
        }
    }
}

ポイント

シェアするURL

let link = URL(string: "https://apps.apple.com")!

まずはこの箇所にシェアしたいURLを入れましょう。

window

let scenes = UIApplication.shared.connectedScenes
let windowScenes = scenes.first as? UIWindowScene
let window = windowScenes?.keyWindow

この箇所はこちらの記事を参考にさせていただきました。

https://zenn.dev/paraches/articles/windows_was_depricated_in_ios15

iPad用の記述

if UIDevice.current.userInterfaceIdiom == .pad {
	av.popoverPresentationController?.sourceView = window
	av.popoverPresentationController?.sourceRect = CGRect(x: UIScreen.main.bounds.width/2.1, y: UIScreen.main.bounds.height/1.3, width: 200, height: 200)
}

この箇所がiPad用のシェアカードを生成する部分になります。
このコードがなくてもiOSでは問題なく動きます。

参考記事

https://www.youtube.com/watch?v=LNKnChO5aPc

Discussion

ログインするとコメントできます