【iOS】mBaasで新しくリリースしたアプリを通知する

iPhoneアプリ開発初心者です。

新しいアプリが出た時に通知が飛んでくる仕組みを、自分のアプリにも入れたいなーと思っていたので、実装してみました。

今回利用したmBaasは、[NIFTY Cloud mobile backend](http://mb.cloud.nifty.com/about.htm)です。
個人アプリなので、無料のBasicプランを利用しました。

単純なプッシュ通知だけなら、20~30分で実装できると思います。
結構ドキュメントも充実してるので、そんなに迷わないです。

##設定手順
### 1.APNs証明書登録
* [ドキュメント](http://mb.cloud.nifty.com/doc/tutorial/push_setup_ios.html)
* AppIDを登録(Push通知のチェック入れる)
* csrをアップロード後、証明書ダウンロード

### 2.mBaasの設定
* [ドキュメント](http://mb.cloud.nifty.com/doc/dashboard/push.html)
* 新しくアプリを登録して、APIキーとクライアントキー取得
* 「アプリの設定」
 * プッシュ通知の許可＞許可する で保存
 * iOSプッシュ通知--> 先ほどの証明書をアップロード

###3.Xcodeの設定
* [ドキュメント](http://mb.cloud.nifty.com/doc/quickstart_ios.html)
* [SDKをダウンロードする](http://mb.cloud.nifty.com/assets/sdk/ios/NCMB_latest.zip)
* Frameworkを追加
 * SystemConfiguration.framework
 * MobileCoreService.framework
 * AudioToolbox.framework
 * CoreLocation.framework(端末の位置情報を利用する場合)
* JSONKitの追加
 * https://github.com/johnezang/JSONKit
 * Build Phases＞Compile Sources＞「-fno-objc-arc」を追加
* コードの追加
 * application:didFinishLaunchingWithOptionsにAPIキーとクライアントキーを追加
 * [その他追加するコード](http://mb.cloud.nifty.com/doc/sdkguide/ios/push.html)


##新しく出したアプリを通知する
mobilebackendの管理画面上から、urlを指定してプッシュ通知を送ると、webViewが開いて該当のページを表示する仕組みがある。
今回は、新たに自分がアプリを出した時にAlertViewを出して、「はい」を選択したらそのurlに飛ばすようにしたかったので、実装。

```ruby:AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    NSDictionary *payload = [launchOptions objectForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"];
    url = [payload objectForKey:@"com.nifty.RichUrl"];
    if (url != Nil){
        //値を取得した後の処理
        UIAlertView *alert =
        [[UIAlertView alloc] initWithTitle:@"お知らせ" message:@"新しくアプリリリースしました！アプリを見てみる？？"
                                  delegate:self cancelButtonTitle:@"いいえ" otherButtonTitles:@"はい", nil];
        alert.tag = 0;
        [alert show];
    }
	return YES;
}

```
* プッシュ通知の中身は[launchOptions objectForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"];で取得
* 管理画面で指定したurlはペイロードのcom.nifty.RichUrlに入っているので、「はい」を押したらそのurlに飛ぶように変更

ちなみに、アプリがバックグラウンドで動いている時には、didFinishLaunchingWithOptionsを通らないのでdidReceiveRemoteNotificationに書いてあげる。ここは↑と少し書き方が違う。

```ruby:AppDelegate.m
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    
    if (application.applicationState == UIApplicationStateActive) {
        // アプリがすでに起動していた場合
    } else {
        // アプリがバックグラウンドで動作中にプッシュ情報からフォアグラウンド状態になった場合
        [NCMBAnalytics trackAppOpenedWithRemoteNotificationPayload:userInfo];

        if ([userInfo.allKeys containsObject:@"com.nifty.RichUrl"]){
            if ([[UIApplication sharedApplication] applicationState] != UIApplicationStateActive){
                url = [userInfo objectForKey:@"com.nifty.RichUrl"];
                UIAlertView *alert =
                [[UIAlertView alloc] initWithTitle:@"お知らせ" message:@"新しくアプリリリースしました！アプリを見てみる？？"
                                          delegate:self cancelButtonTitle:@"いいえ" otherButtonTitles:@"はい", nil];
                alert.tag = 0;
                [alert show];
            }
        }
    }
}

```
* プッシュの中身はuserInfoから取得
* urlは同様に、com.nifty.RichUrlから取得


##注意すべきところ
* 広告を入れる場合、アプリのターゲット内、Build Settings の Other Linker Flags に「-all_load　-ObjC」を設定する場合があるが、これをやるとFBSDK入れないとエラー吐いてビルドできない
* リリース時はmBaasにリリース用のアプリ登録をして、リリース時の証明書をアップロードすること

何か間違えとか、他に良い方法あればご指摘おねがいします。