質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1986閲覧

シェアボタンの不具合につて

satoshi2019

総合スコア13

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/07/22 13:30

編集2020/07/23 08:03

よろしくお願いします。

アプリをapple store connectに申請しましたが、以下の理由によりリジェクトされました。

Your app crashed on iPad running iOS 13.6 on WiFi when we:

Tapped on Share button.

We have attached detailed crash logs to help troubleshoot this issue.

実際にシュミレータで起動してみると
確かにiPadでシェアボタンを押すとクラッシュしていまします。

iphoneでは正常に起動に反応します。

どのように対応すれば良いでしょうか。

シェアボタンのコードは以下になります。
イメージ説明
よろしくお願いいたします。

<途中経過>
・上記質問からコードを追加した。
・shareボタンを押した後、activityControllerは出現するようになった。
・しかし、activityController出現後にクラッシュするようになった。
・当初はシュミレーターのiPadのみでクラッシュしたが、iphoneでもクラッシュするようになった。

コード
イメージ説明

シュミレーターを起動しボタンを押した時の状況
イメージ説明
イメージ説明

エラーメッセージ
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TsukubaDepot

2020/07/23 03:22

UIAlertController の例ですが、 let cancelAction = UIAlertAction(title: "キャンセル", style: .cancel, handler: nil) alertController.addAction(cancelAction) // iPad 対策 alertController.popoverPresentationController?.sourceView = view こんな感じでクラッシュ対策していました。 UIActivityController も同じプロパティがあるので、 view を代入すれば解決しそうですが、いかがでしょうか。
satoshi2019

2020/07/23 03:56

ありがとうございます。 // iPad 対策 activityVC.popoverPresentationController?.sourceView = view を打ち込みました。シュミレーターではクラッシュエラーは無くなりました。 しかしボタンを押しても何も反応しません。 以下のメッセージが出ます。 2020-07-23 12:55:33.388241+0900 test[20546:1109055] [LayoutConstraints] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. ( "<NSLayoutConstraint:0x600002d1ec10 LPLinkView:0x7fca3140a9f0.leading == UILayoutGuide:0x6000037a65a0'UIViewLayoutMarginsGuide'.leading (active)>", "<NSLayoutConstraint:0x600002d1e7b0 H:[LPLinkView:0x7fca3140a9f0]-(59)-| (active, names: '|':_UIActivityContentTitleView:0x7fca3140bc20 )>", "<NSLayoutConstraint:0x600002d70af0 H:|-(0)-[_UIActivityContentTitleView:0x7fca3140bc20] (active, names: '|':_UINavigationBarContentView:0x7fca314123c0 )>", "<NSLayoutConstraint:0x600002d70b40 _UIActivityContentTitleView:0x7fca3140bc20.trailing == _UINavigationBarContentView:0x7fca314123c0.trailing (active)>", "<NSLayoutConstraint:0x600002d74f00 'UIView-Encapsulated-Layout-Width' _UINavigationBarContentView:0x7fca314123c0.width == 0 (active)>", "<NSLayoutConstraint:0x600002d1ed00 'UIView-leftMargin-guide-constraint' H:|-(16)-[UILayoutGuide:0x6000037a65a0'UIViewLayoutMarginsGuide'](LTR) (active, names: '|':_UIActivityContentTitleView:0x7fca3140bc20 )>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x600002d1ec10 LPLinkView:0x7fca3140a9f0.leading == UILayoutGuide:0x6000037a65a0'UIViewLayoutMarginsGuide'.leading (active)> Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
TsukubaDepot

2020/07/23 04:35

ボタンが押せないことと直接関係あるか分かりませんが、少なくとも制約に関する警告が出ていることは間違いないかとおもいます。 たとえば、UIActivityControllerだけを出すごく簡単なサンプルを作り、それがiPhone/iPad双方で問題がないことを確認し、それから少しずつレイアウトなどを今回のアプリに揃えてゆき、どこで問題が発生するのか確認されてみるのはいかがでしょうか。
satoshi2019

2020/07/23 04:54

ありがとうございます。試してみます。 また何かありましたら質問させていただきます。
guest

回答1

0

ベストアンサー

追記されたコードでうまくいかないのは、present()が二回呼び出されているためだと思います。

ここは少し自信がないのですが、iPad対策のコードは iPhone の場合でも問題なく使えるので、特に条件分けする必要はないかとおもいます。

条件分けを行い、また iPad の場合が画面の中央に表示されるようにするのであれば、追記されたコードから余計な present()を除いた下記のようなコードで実行できそうです(iPhone 11 Pro Max, iPad 7thの各シミュレータで実験)。

Swift

1 @IBAction func share(_ sender: UIButton) { 2 let message = "abcdefg" 3 4 if let link = NSURL(string: "https://apps.apple.com/") { 5 let objectsToShare = [message, link] as [Any] 6 let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil) 7 activityVC.excludedActivityTypes = [.airDrop, .addToReadingList] 8 9 // 10 if UIDevice.current.userInterfaceIdiom == .pad { 11 activityVC.popoverPresentationController?.sourceView = view 12 let screenSize = UIScreen.main.bounds 13 activityVC.popoverPresentationController?.sourceRect = CGRect(x: screenSize.size.width/2, y: screenSize.size.height/2, width: 0, height: 0) 14 } 15 present(activityVC, animated: true, completion: nil) 16 } 17 }

あるいは、たとえば iPad の場合は選択したボタンから吹き出しのようにして表示するのであれば、 sourceViewUIButtonのインスタンスを指定します。

Swift

1 @IBAction func shareButton(_ sender: UIButton) { 2 let message = "abcdefg" 3 4 if let link = NSURL(string: "https://apps.apple.com/") { 5 let objectsToShare = [message, link] as [Any] 6 let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil) 7 activityVC.excludedActivityTypes = [.airDrop, .addToReadingList] 8 9 if UIDevice.current.userInterfaceIdiom == .pad { 10 activityVC.popoverPresentationController?.sourceView = sender 11 } 12 present(activityVC, animated: true, completion: nil) 13 } 14 }

上記の場合、既にsenderが UIButtonとして型が指定されていますが、Anyであれば代入時にダウンキャストすればいけるかと思います。

  • iPad 7th

ボタンから吹き出しが出る。

イメージ説明

  • iPhone 11 Pro Max

設定に関係なく画面下部から出る。

イメージ説明

投稿2020/07/23 08:35

TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

satoshi2019

2020/07/23 13:24

解決しました。長い間お付き合いいただきありがとうございました。本当に助かりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問