[iOS]アプリ作って申請したらアレが来たので晒しておきます[apple developer]

#恐怖の4.2 Minimum Functionality（訳：雑魚アプリすぎてワラエル、機能しょぼすぎw）

swift歴２年生の僕が、年間１万円以上取られるapple developer代くらい稼ぎたいとアプリ開発数打て作戦の第一弾として作ったアプリが、めでたくこのリジェクトを頂戴しましたので、ご報告です。

このリジェクト理由、要は機能がしょぼすぎるとかっていう理由らしい。

![スクリーンショット 2021-01-31 23.48.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241333/b5504df4-310a-46d0-2729-7774e436f6ed.png)

どんなアプリかという紹介をします。

##概要
1.自分で考えた必殺技の名前をメモっておくアプリ。
2.常用漢字2,000文字以上から選択できる。
3.自分が平仮名を打って変換するのではなく、すでにある漢字から選択することによって、雰囲気で作成する事ができ、漢字圏外の外国でも使ってもらえそうだと思った。
4.漢字を選択後、読み仮名をふって登録。
5.作った必殺技名は記録され、見返す事ができる。
6.黒歴史を恐れない人は、シェアボタンからtwitterやラインで友達に自慢できる！
7.とにかく早く完成品を作ってみたい。

といった具合のコンセプトを元に作りました。

##初期機能
登録されるアプリの数が年々増えてくるためか、審査も年々厳しくなっているようです。
それでも、完成を急いだ私は、３〜４画面で完結できるように専念しました。

###1.漢字選択画面
![Simulator Screen Shot - iPhone 11 Pro Max - 2021-02-01 at 00.53.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241333/98e6c879-e79e-2445-1f80-237fbd6f99fb.png)
collectionViewで漢字を表示をしました。
また、選択した文字は上部のUILabelに表示するのですが、UILabelではPlaceholder機能がデフォルトでは無いため、いろいろ探し回った結果、UILabelを拡張することで問題解決された記事を見つけたので引用させていただきました。

```UILabel-Extension.swift
@IBDesignable class PlaceHolderTextView: UILabel {
    
    @IBInspectable private var placeHolder: String = "" {
        willSet {
            self.placeHolderLabel.text = newValue
            self.placeHolderLabel.sizeToFit()
        }
    }
    
    private lazy var placeHolderLabel: UILabel = {
        let label = UILabel(frame: CGRect(x: 6.0, y: 6.0, width: 0.0, height: 0.0))
        label.lineBreakMode = .byWordWrapping
        label.numberOfLines = 0
        label.font = self.font
        label.textColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.22)
        label.backgroundColor = .clear
        self.addSubview(label)
        return label
    }()
    
    //Initializers
    
    deinit {
        NotificationCenter.default.removeObserver(self)
    }
    
    //Life-cycle Methods
    
    override func awakeFromNib() {
        super.awakeFromNib()
        changeVisiblePlaceHolder()
        NotificationCenter.default.addObserver(self, selector: #selector(textChanged), name: UITextView.textDidChangeNotification, object: nil)
    }
    
    func changeVisiblePlaceHolder() {
        self.placeHolderLabel.alpha = (self.placeHolder.isEmpty || !self.text!.isEmpty) ? 0.0 : 1.0
    }
    
    @objc private func textChanged(notification: NSNotification?) {
        changeVisiblePlaceHolder()
    }
}
```
そしてごめんなさい。引用元をメモし忘れていたため、どなたの記事だったかがわからなくなってしまいました。

このExtensonを作成後、UILabelのカスタムクラスに「PlaceHolderTextView」と入力すると、Inspectorsの欄にPlaceHolderが表示されます。

###2.フリガナ入力画面
![Simulator Screen Shot - iPhone 11 Pro Max - 2021-02-01 at 01.04.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241333/968790b0-140c-3018-a7ba-453f29944b0f.png)

漢字を選択した後は、最強にかっこいいフリガナを付けます。
当て字にしてもいいし、漢字のニュアンスだけ捉えた横文字にしてもいいです。数字以外入力に制限はありません。
ここは非常にシンプルに、前の画面の入力文字を保持したままかな入力を保持して次の画面に送る処理をするだけです。


###3.かっこよく見せる演出画面
![Simulator Screen Shot - iPhone 11 Pro Max - 2021-02-01 at 01.11.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241333/3d05a86b-292b-78d1-ac78-48ed530485dd.png)

背景を動画にし、躍動感とシンプルな文字表示により、クールさを演出したつもりの画面です。
デザインセンス皆無な人間が作ると、どんなものもダサく作れるのはある種の才能ですかね。

ここではAVFoundationを使い、炎を背景を動画にしました。
文字の表示にはいろいろアニメーションを考えたのですが、かっこいい演出を考えれば考えるほどチグハグになっていったので、結局シンプルなものになりました。

また、前の画面の決定ボタンを押した時、UserDefaultを使って自作の技名を保持させています。
Realmなどの使用も考えたのですが、今回はとにかくライブラリもあまり使わないでみようと思っていたので、UserDefaultを選択しました。

シェアボタンをUIActivityViewControllerで実装したのですが、ここは結構手間取りました。
IOS13以降表示の方法が変わったようで、見様見真似で何とか実装できました。
正直よくわかってないです。
ひとまず,UIActivityItemSourceを継承したクラスを作り、LPLinkMetadata()をいじるとなんかうまくできるみたいです。

```ShowTechNameViewController.swift

class ShowTechNameViewController: UIViewController {

//viewDidloadとか省略

  let shareImage = getImage()  //getImageという関数を別で作っています。画像を取り込めばOKです。
  let shareText = "これが俺の必殺技！"
  let items: [Any] = [shareText, ImageActivityItemSource(shareImage)]
  let ac = UIActivityViewController(activityItems: items, applicationActivities: nil)
}


class ImageActivityItemSource: NSObject, UIActivityItemSource {
    
    var image: UIImage?
    
    override init() {
        super.init()
    }
    
    convenience init(_ image: UIImage?){
        self.init()
        self.image = image
    }
    
    func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
        return image ?? UIImage()
    }
    
    func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
        return image
    }
    
    func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? {
        let linkMetaData = LPLinkMetadata()
        linkMetaData.iconProvider = NSItemProvider(object: image as! NSItemProviderWriting)
        return linkMetaData
    }
}

```
###4.技ライブラリ画面
もはやお見せする事が恥ずかしくなってくるぐらいただのTableViewです。
UserDefaultで保持したデータを表示しているだけです。

##手直し１回目
実は一番最初に審査に出した時は漢字の数も2００個くらいの数でした。
さすがにこれはよくないかと思い、githubに転がっていた常用漢字データを使いやすいよう加工してぶっ込んでいます。
かさ増しすれば少しは箔がつくと思い？再び提出しましたが、またもリジェクト。

##手直し２回目
次にLaunchScreenを作りました。
正確には独自にLaunchというStoryboardを作成し、一番最初にそれを読み込ませる方法で表示してます。
さらに、ボタンを押した時に音が出るようにしました。スタートボタンはバイオハザードのような重厚感のある音を、漢字選択時は格闘ゲームで弱パンチヒット時に出るような音を付けました。
さらにお披露目画面でも炎の動画に合わせた「ゴーっ」という音を映像と合成し、迫力を追加しました。

##手直し３回目
心が折れました。


##結び
というわけで、リジェクトに心折れ、公開に至りませんでした。
豆腐メンタルなので、復活したらまた何か機能を追加して申請するかもしれません。
この4.2リジェクト、何やらBundleNameを変更するだけでも通る可能性があるらしく、担当者の心次第らしいです。
なのでみなさんはもう少し諦めず、いろいろ試してみるといいと思います。
私は次の作りたいものに浮気します。

それでは！永久全炎黄昏剣！（エターナルパーフェクトフレイムトワイライトブレード！）