iOS6ですか?iOS7ですか?それを知りたいんです。

連投3です。

対象OSをiOS6からにした場合、iOS7と異なる処理を書かないといけないことがあったりする。 例えばレイアウトやらなんやら。。。

今回クソぅ!と思ったポイントと回避方法を簡単に書いておきます。

まずiOS7かどうか判断するのは

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
   //iOS7用の処理
}else{
   //iOS6以前の処理
}

これでいけます。

どこでクソぅ!となったかというと、UIActivityViewControllerです。
UIActivityViewControllerはFacebookTwitterAirDropなど共有するときに使う機能です。
(下からうねぇっと飛び出してくる。そう、ヤツです。)
iOS6とiOS7では共有できる機能が異なります。
AirDropなんてiOS6では無かったですからね。

以下の例はFacebookTwitterのみ生かしたままにして、他は1個ずつ指定してブロックしています。

    NSArray *shareItems = @[@"共有したい文字", @"共有したいURL"];
    NSArray *blockItems = nil;
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        //iOS7用
        blockItems = @[UIActivityTypePostToWeibo
                                ,UIActivityTypeMessage
                                ,UIActivityTypeMail
                                ,UIActivityTypePrint
                                ,UIActivityTypeCopyToPasteboard
                                ,UIActivityTypeAssignToContact
                                ,UIActivityTypeSaveToCameraRoll
                                ,UIActivityTypeAddToReadingList
                                ,UIActivityTypeAirDrop];
    }else{
        //iOS6用
        blockItems = @[UIActivityTypePostToWeibo,UIActivityTypeMail,UIActivityTypeCopyToPasteboard];
    }
UIActivityViewController *avc = [[UIActivityViewController alloc] initWithActivityItems:shareItems applicationActivities:nil];
    avc.excludedActivityTypes = blockItems;

そうです。ブロックする項目がiOS7だと急に多くなるんです。

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
   //iOS7用の処理
}else{
   //iOS6以前の処理
}

これで除外する(できる)項目が違うぞ!と明記してあげないとエラーになります。

一度エラーになり、あぁ・・・うまくやってくれないんだね、残念。。となりました。