2014年3月30日日曜日

Certificate期限切れの通知が送られてきたら


こんなメールが送られてきたら...
Your iOS Distribution Certificate will expire in 30 days.
  • メール内の"Certificates, Identifiers & Profiles"リンクをクリック
    • またはMember Center > Certificates, Identifiers & Profiles > iOS Apps > Certificates
  • iOS App > Certificatesへ移動
  • +をクリックしてCertificateを追加
    追記:Xcode7のPreferencesでCertificateに"Create"ボタンが表示される。これのクリックで以下の数ステップが実行されるかも...
  • 期限が切れるCertificateを選択してContinue
    • Development > iOS App Development
    • Production > App Store or Ad Hoc Distribution
  •  以前に使用したCertificateSigningRequest.certSigningRequestを保存してあればそれをアップロード。
    なければキーチェインアクセス > 証明書アシスタント > 認証局に証明書を要求... で作成してアップロード。
    「要求の処理」は「ディスクに保存」を選択。すると「CAのメールアドレス」の「必須」は消えるので空欄のまま続ける。
  • Certificate Readyになったらダウンロード
  • ダウンロードしたCertificateをダブルクリック
  • Member Centerで更新されたCertificateが追加されていることを確認
  • XcodeのPreferences... > Account > View Details...を開き、左下の丸矢印アイコンクリックで同期
    追記:Xcode7では丸矢印アイコンなし、代わりにDownload Allボタン。Provisioningを更新すると当該項目にDownloadボタンが表示される。
  • 期限切れになるCertificateを使用しているProvisioningを更新
    • Member Center>Certificates, Identifiers & Profiles>
      iOS Apps>Provisioning Profiles
    • 対象Provisioningを選択
    • Edit
    • Certificateを更新後のものに変更
    • Generate
  • XCodeのPreferences... > Account > View Details...で同期
  • 必要なものの期限が全て更新されたことを確認。


Mailアタッチメントのインポート

Supporting Files > ...-info.plistを選択

Information Property Listの+をクリックし、Document typesを追加

Document typesにサポートするDocument Content Type UTIsを追加

ここまででMail添付のファイルをプレスしたときにこのアプリのアイコンも表示されるされるようになる。

AppDelegateにapplication:openURL:sourceApplication:メソッド追加
他のアプリからファイルオープンで起動またはアクティベイトされた場合に呼ばれる。
メソッドが呼ばれたとにきには既にInboxにインポートするファイルがコピーされている。
- (BOOL)application:(UIApplication *)application
                                openURL:(NSURL *)url
                  sourceApplication:(NSString *)sourceApplication
                             annotation:(id)annotation
{
    //url=コピーされたファイルのURL
}

Inboxディレクトリの場所
NSString *inboxDir = [NSString stringWithFormat:@"%@/Documents/Inbox", NSHomeDirectory()];

Inbox内のファイルリスト

NSFileManager *fileManager = [NSFileManager defaultManager];

NSArray *files = [fileManager subpathsAtPath: inboxDir];

テキストファイルの場合
NSStringEncoding enc;
NSString *inboxText = [NSString stringWithContentsOfFile:fullPath usedEncoding:&enc error:&err];

参考: Registering the File Types Your App Supports

カスタムタイプ追加例

  • ExporTTypeUTIsを追加。子要素が自動的に追加される。
  • Conforms to UTIsに親定義を設定。ここではpublic.plane-textを選択。
  • identifierにユニークな識別子を設定。
  • Equivalent Typesにpublic.filename-extensionを追加し、拡張子を設定。
  • Document Types/Document Content Type UTIsにItemを追加し、上記identifierを設定する。

2014年3月18日火曜日

iOS: 7.1対応 自己署名証明書でのEnterpriseアプリ配布


Enterpriseアプリ配布でこんなエラーに出会ったら...
 ”....”の証明書が有効ではないため、Appをインストールできません。
 ...に接続できません。

iOS7.1からEnterprise配布がHTTPSでないとインストールできなくなりました。
apacheを自己署名証明書で構成した場合は信頼できない証明書のため、HTTPSでもインストールできません。

iOSデバイスでは"...に接続できません"とそっけなく表示されますが、デバイスをMacに接続し、コンソールログを見るとエラーの理由が分かります。
Xcode ⇨ Window ⇨ デバイス選択 ⇨ 右ペイン左下の△アイコンクリック


itms-services:プロトコルに従ってurl先のplistをダウンロードするときにサーバ証明書が信頼できないエラーが発生しています。safariで直接plistをダウンロードするのであれば、ここで警告が表示され、サーバを信頼すればダウンロードを継続できますが、インストーラの場合は"...に接続できません"を表示して継続できなくなります。

いろいろ試した結果、iPhone Configulatorでサーバのcrtファイルをインストールするmobileconfigを作り、これをメールかWebで配布、各デバイスにインストールするのが順当なようです。

Apple Configuratorではmobileconfigを出力できないようなので、少し古いですがiPhone Configuratorを使いました。

実はhttpsが必要なのはplistのダウンロードだけなので、plistをパブリックな場所に置いてもよれけば、Enterprise app deployment doesn't work on iOS 7.1で紹介されているdropboxのhttpsを利用する方法もあります。

plistだけdropboxに置き、itms-services://?action=download-manifest&url=http:...のリンク先をdropboxからのファイルダウンロードのURLにすることで、インストールが可能になります。
plist内のリンクは社内LANのURLにしておけば、plistをパブリックにしても社外からアプリをインストールすることはできません。

dropboxでなくともiOSに含まれている認証局の証明書であればよいので、自社のSSLサーバにplistだけ置くという方法もあります。