2014年8月29日金曜日

UIWebViewとアプリの連携


UIWebViewDelegateの shouldStartLoadWithRequest を使ったアプリとの連携例を、先日アップした"UIWebViewで閲覧中のページ内の検索"に追加しました。
サンプルコードダウンロード: TheSearcher2

shouldStartLoadWithRequestはページ移動が発生したときに呼ばれ、基本的には移動を許すかどうかを判断するものですが、ここでアプリの処理を追加することができます。

リンク先のURLをrequestから取得し、それに基づいて処理を行います。
TheSearcher2にhashとprotocolを利用してアプリへの処理要求かどうかを判断し、JavaScriptでUIWebViewに表示する例を加えてあります。

・アイコンイメージをタップ
protocol=file://でurl末尾が".png"
アイコンイメージをstringByEvaluatingJavaScriptFromStringで切替

・"Home Directory"をタップ
protocol=file://でhash="#homedir"
NSHomeDirectory()内のフォルダ一覧を作成し、stringByEvaluatingJavaScriptFromStringでdirDiv内に表示。
各フォルダの情報は<a>タグに設定、hrefにフルパスをセット。
protocolは"filename://"とする。

・フォルダ一覧のリンクをタップ
protocol="filename://"
パス内のファイル、フォルダ一覧をstringByEvaluatingJavaScriptFromStringでdirDiv内に表示。

上記の場合に、NOを返し、ページ移動はキャンセルする。







2014年8月22日金曜日

warning: no rule to process file ... of type sourcecode.javascript

JavaScriptなどコンパイル対象でないファイルをプロジェクトに追加したとき、
no rule to process file ... of type ...というエラーが発生する。

warning: no rule to process file '/Users/..../UIWebViewSearch.js' of type sourcecode.javascript for architecture i386

プロジェクトのBuild Phases > Complie Sources から当該ファイルを削除する。

UIWebViewで閲覧中のページ内の検索

UIWebViewで閲覧中のHTML内で文字検索をしたいと思い、なにかいい方法がないか探したところ、サンプルアプリを添付してくれているページがありました。
第一のポイントはstringByEvaluatingJavaScriptFromString:の使い方で、てっきりHTMLに既にあるscriptの呼び出しに使うかと思っていたのですが、この引数で渡すjavascriptHTML Documentに適用して結果を返してくれる、つまりscriptを事実上追加することができるのです。このjavascriptで適用した変数(var)やfunctionは、それ以降のメソッド呼び出しで使用することができ、グローバル変数は値も保持されます。

このサンプルのJavaScriptをもう少し単純化できないか試したのですが、書き直してはいるものの、ハイライト部分はほとんど同じ方法になっています。

このサンプルを基に作成したTheSearche2をアップします。
TheSearcher2

TheSearche2はオリジナルに次のような変更を加えています。

Storyboardを使用。
検索ヒット箇所の前後移動を追加。
初期HTMLをGoogle、Yahoo、Bingへのリンクとし、実際のWebページ内での検索を実行。
UIWebViewのサブクラスをdelegateを使用する方法に変更。

UIWebViewのドキュメントには"The UIWebView class should not be subclassed."と書かれています。

このサンプルには"UIWebViewとアプリの連携"のコードも含まれています。

2014年4月3日木曜日

UIView小技集


  1. UIViewの罫線
    drawRectで描画することもできますが、こんな簡単な方法で可能でした。
    //↓赤枠を2ptで描画
    [view.layer setBorderColor:[UIColor redColor].CGColor];
    [view.layer setBorderWidth:2.0];
    (UIViewに枠線を付ける方法からのコピペです。)

    角を丸くする場合
    view.layer.cornerRadius = 10;
     
  2. UILabelのサイズをtextに合わせる
    CGFloat padding = 4;
    CGSize size =
       [aL
    abel.text sizeWithAttributes:@{NSFontAttributeName:aLabel.font}];
    aLabel.frame = CGRectMake(aLabel.frame.origin.x,                                              aLabel.frame.origin.y,
                                                  size.
    width + padding*2,
                                                  size.
    height + padding*2);
  3. UILabel内の文字マージン調整
    UILabelのサブクラスでdrawTextInRectをオーバライド
    - (void)drawTextInRect:(CGRect)rect
    {
        rect.origin.y += 2;
        [super drawTextInRect:rect];}
     
  4. Viewの拡大/縮小
    例: aViewを縦横1.5倍に拡大
    CGFloat scaleX = 1.5;
    CGFloat scaleY = 1.5;
    CGAffineTransform tr =
                   CGAffineTransformScale(aView.transform, scaleX, scaleY);
    aView.transform = tr;






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だけ置くという方法もあります。

2014年2月10日月曜日

staticライブラリで追加したCategoryのメソッドがunrecognized selectorになる

staticライブラリにCategoryで既存クラスにメソッドを追加し、それを別プロジェクトでリンクしようとしたが、コンパイルは通るが実行時にunrecognized selectorでエラーとなる。
Objective-Cはダイナミックバインディングを行うため、個々のクラスにはリンカーシンボルが設定されるが、個々のメソッドには設定されない。スタティックライブラリでカテゴリにより既存クラスを拡張した場合、リンカーは関連づく基クラスのメソッドが分からず、このエラーとなる。
プロジェクトのBuild Settings/Linking/Other Linker Flagsに-ObjeCフラグを追加すると回避できる。

このオプションにより、当該ライブラリ中のObjective-Cのクラス/カテゴリが定義されているオブジェクトファイルが全てロードされる。
不要なものもロードされることになり、実行ファイルがフラグなし時より大きくなることが多い。
スタティックライブラリ中のクラス/メソッドの多くが必要な場合は問題ないでしょうが、ほんの一部しか利用しない場合は、ライブラリの構成を見直した方がよいでしょう。

参考: 

2013年11月25日月曜日

Projectに追加した画像ファイルの場所


UIImage の imageNamed メソッドを使うとUIImageオブジェクトがキャッシュされます。サイズが大きい画像の場合などでキャッシュに残したくない場合はimageWithContentsOfFile メソッドを使用するように書かれています。

imageNamed:
If you have an image file that will only be displayed once and wish to ensure that it does not get added to the system’s cache, you should instead create your image using imageWithContentsOfFile:.

プロジェクトに追加しイメージファイルのパスは次の方法で取得します。

NSString* imgPath =
                  [[NSBundle mainBundle] pathForResource:imgName ofType:@"png"];



設定の通知センターからアプリが消えない



Push Notificationのテスト後、Push Notificationを無効にしたが、通知センターからアプリアイコンが削除されない。アプリをアンインストールするといったん消えるが、再インストールすると再度登録されてしまう。

これはPush Notification許諾の確認が一日一回だけ行われ、いったん許諾するとその間はそのアプリが通知センターの対象となるため。

デバイスの時計を一日以上先に進めるとリセットすることができる。
手順は以下のサイト参照。

Troubleshooting Push Notifications
When I delete my iOS application push notification state remains

2013年11月24日日曜日

UIWebViewのキャッシュ



UIWebViewを使用しているときのキャッシュコントロール

//キャッシュを全て消去
[[NSURLCache sharedURLCache] removeAllCachedResponses];

//NSURLRequest作成時にポリシーを設定
NSURLRequest *request = [NSURLRequest requestWithURL:url
                                     cachePolicy:NSURLRequestReturnCacheDataElseLoad
                                     timeoutInterval:30.0];


NSURLRequestCachePolicyの値


NSURLRequestUseProtocolCachePolicy
Protocolのキャッシュポリシーに従う。デフォルト。

NSURLRequestReloadIgnoringLocalCacheData
キャッシュの有効期限にかかわらずurlへアクセス


NSURLRequestReloadIgnoringLocalAndRemoteCacheData
上に加え、proxyなどにもキャッシュ破棄を指示する。

NSURLRequestReturnCacheDataElseLoad
キャシュがあればそれを使用、なければURLへアクセス

NSURLRequestReturnCacheDataDontLoad
キャッシュのみを使用。オフラインと同等の動作。


NSURLRequestReloadRevalidatingCacheData
有効性をチェックし、有効ならキャッシュを使い、無効ならリロード。

2013年10月22日火曜日

iOS7対応: install iconが消えない



Enterprise InHouse Distributionで、iOS6では問題なくインストールが完了するが、iOS7ではインストールアイコンが残ったままになるという現象が発生しました。

私の場合はアプリのBundle Identifierと、インストールサイトにあるplistのそれとが一致していなかったのが原因でした。

Ad Hocのインストールで同様の問題が発生するという書き込みが結構あります。
同じ原因の場合もありましたが、他にprovisioning, certificateを作り直して解決した場合も報告されています。これも、なんらかの不整合が解消したためでしょう。

iOS6ではインストールが完了するため、かえって基本的な設定ミスを見逃していることがありそうです。

参考:
http://forums.macrumors.com/showthread.php?t=1626848
https://devforums.apple.com/message/904282#904282

2013年10月5日土曜日

Build番号の自動インクリメント



Build番号の自動インクリメントを仕掛けました。

このページに画面キャプチャー付きで手順が載っており、そのとおりに行えば設定できます。


・ProjectのBuild PhaseにRun Sricptを追加する。
・Run Sricptは末尾に追加され、ビルドの最後で実行される。(ドラッグで順序を変更可能)
・Run Scriptニシェルスクリプトを登録する。

Xcode5ではBuild Phase追加はメニューから行います。

"How to auto-increment Bundle Version in Xcode 4?"ではスクリプトファイルを保存し、それを実行するため、プロジェクトを他の環境でビルドする場合は各々の環境にスクリプトファイルを保存する必要があります。それが面倒な場合はRun Scriptに直接スクリプトを書くこともできます。


buildPlist=${INFOPLIST_FILE}
newVersion=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$buildPlist" | /usr/bin/perl -pe 's/(\d+\.\d+\.)(\d+)/$1.($2+1)/eg'`

この場合はVersion、Build ともに数字3つのをピリオドで区切ったものとなります。
例:Version=1.1.0 、Build=1.1.123

Versionを 1.1.0 、Buildを 1.1.0.123 のように設定する場合はPerlの正規表現を次のように変更します。("\d+\."を追加)
's/(\d+\.\d+\.\d+\.)(\d+)/$1.($2+1)/eg'

TARGETS/Generalの設定は次のようになります。

プログラム中で値を取得する例
(リリース時はVersion、デバッグ時はBuild):
#ifdef DEBUG
    NSString *buildNumber = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
#else
    NSString *buildNumber = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
#endif

2013年9月14日土曜日

iOS7対応: iOS6/7 delta



iOS7ではStatusBar、NavigationBarとアプリのViewがオーバラップして表示されるため、Xcode5のstoryboardで配置したViewの位置がiOS6/7で違ってしまう。

ViewのframeのルートViewに対するframe.origin.yの値が0の場合、iOS6ではStatusBar、NavigationBarの下に配置されるが、iOS7ではスクリーンの左上に配置される。

autolayoutの場合は調整してくれるようだが、そうでない場合は調整が必要になる。
Interface BuilderのサイズインスペクタにあるiOS6/7 deltaで行うことができる。

Xcode5ではこまめ表示/非表示ができるので、上のキャプチャーの少し上にあるViewのhideをクリックすると、この部分がすっかり隠れてしまいます。

iPhoneのUITableViewでは、iOS6と同じ設定だとiOS7ではViewの上にNavigationBar分の空きができる。この場合はiOS7の場合にcontentInsetのtopを-44にするとiOS6と同じレイアウトになる。

参考: Interface Builder: What are the UIView's Layout iOS 6/7 Deltas for?

2013年9月13日金曜日

iOS7対応: UIButtonの属性



UIButtonTypeRoundedRectのUIButtonをプログラムで作っている場合、iOS7では背景色なし、ボーダーなし、文字色シアンのため、iOS6から移行するとき調整が必要なことが多くなりそうです。

//背景色
myButton.backgroundColor = [UIColor lightGrayColor];

//文字色
//[myButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

//border
[[myButton layersetBorderWidth:1.0f];
[[myButton layer] setBorderColor:[UIColor darkGrayColor].CGColor];



iOS7対応: StatusBarが非表示にならない



iOS7: StatusBarが非表示にならない

//ルートのNavigationControllerに追加。
- (void)viewDidLoad
{
    [super viewDidAppear:animated];
    // iOS 7
    if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {
        [self setNeedsStatusBarAppearanceUpdate];
    }
}

//StatusBarを非表示にしたいViewControllerに次のメソッドを追加する。
//defaultの値はNO
- (BOOL)prefersStatusBarHidden
{
    return YES;
}

NavigationControllerが複数ある場合は、各々で
[self setNeedsStatusBarAppearanceUpdate]
を呼ぶ必要があるかもしれません。

iPadでUISplitViewControllerを使う場合は振る舞いが異なる。
この場合。UISplitViewControllerにprefersStatusBarHiddenを実装、YESを返すようにすると全てのViewControllerでStatusBarが非表示になる。
個別にStatusBarの表示/非表示を切り替える方法は試していない。

2013年9月8日日曜日

UITextFieldのleftView追加例



UITextFieldの左側にundoボタンを追加する例です。
leftViewModeをUITextFieldViewModeWhileEditingとしたのでは表示されなかったので、becomeFirstResponder、resignFirstResponderをオーバライドし、表示/非表示を切り替えています。

//UITextFieldのサブクラスを作る。
@implementation MyTextFieldWithLeftView

//Storyboardで設定する場合の初期化
//leftViewにUIButtonをセット。
//初期状態は非表示。
- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];
        btn.frame = CGRectMake(6,0,30,30);
        [btn setImage:[UIImage imageNamed:@"undo"]
                forState:UIControlStateNormal];
        self.leftView = btn;
    }
    return self;
}

//leftViewtarget/actionをセットする。
//複数のTextFieldがある場合、どれか区別がつくようにtagを設定する。
//部品が配置されるViewContollerなどから呼び、ボタンのtarget/actionをセットする。
- (void)addLeftButtonAction:(id)target action:(SEL)selector tag:(NSInteger)tag;
{
    [(id)self.leftView addTarget:target action:selector
                forControlEvents:UIControlEventTouchUpInside];
    self.leftView.tag = tag;
}

//firstResponderになるときにleftViewを表示。
- (BOOL)becomeFirstResponder
{
    self.leftViewMode = UITextFieldViewModeAlways;
    return [super becomeFirstResponder];
}

//firstResponderでなくなるときにleftViewを非表示。
- (BOOL)resignFirstResponder
{
    self.leftViewMode = UITextFieldViewModeNever;
    return [super resignFirstResponder];
}

2013年9月4日水曜日

Archive作成時の header file not found エラー



アプリとstatic libraryのProjectがあるworkspaceで、Archive作成時にヘッダファイルが見つからないエラーが発生しました。
エラーメッセージは次のようなものです。
Lexical or Processor Issue
/Users/.../AppWorkspace/LibA/LibA/MyClassA.h:10:9:
  'LibB/MyClassB.h' file not found

いろいろバリエーションがあるようですが、基本的にはヘッダのサーチパスの設定に由来するようです。
私の場合はworkspaceにアプリのプロジェクトとstatic libraryがふたつあり、そのひとつが他方に依存しているという環境で発生しました。
App - libA、libBに依存
libA - libBに依存
libB

この場合、libAのビルドに失敗しているので、libAのBuild Settingsに設定を追加します。
Build Settings > Serach Paths > User Search Paths > Release
"$(PROJECT_DIR)/.."  recursive

recurciveの設定は入力フィールドをダブルクリックすると表示されるダイアログの右端にある、non-recursive/recursive切り替えスイッチで行います。

次のサイトを参考にしましたが、私の場合はUser Search Pathsの追加だけで解決しています。これだけではダメな場合は参照してみてください。

http://stackoverflow.com/questions/5413338/xcode-4-and-nested-projects-header-files-not-found

http://stackoverflow.com/questions/5584317/compile-build-or-archive-problems-with-xcode-4-and-dependencies

2013年8月16日金曜日

PDFサムネイル表示改良版



PDFサムネイル表示の例では全ページのサムネイルを作り終えるまで応答しなくなる、メモリ不足になっても回復不能でアプリが落ちるという問題があります。その改善策の例です。

@implementation WebViewWithThumnails

//WebViewWithThumnailsではプレイスホルダーとなるThumbnailViewの配置だけ
//行い、サムネイルイメージはセットしない。
- (void)addThumbnailsWithData:(NSData *)pdfData
{
    //画面下にUIScrollViewを追加
    _thumbnailScrollView =
        [[ThumbnailScrollView alloc] initWithWebView:self height:80];
    [_thumbnailScrollView addThumbnailViews:pdfData];
    //この行を削除。
    //[_thumbnailScrollView setPdfThumbnailImage:pdfData];
}

@implementation ThumbnailScrollView

//layoutSubviewsをオーバライドし、表示領域内にあるThumbnailViewに
//サムネイルイメージをセットする。
- (void)layoutSubviews
{
    float x1 = self.contentOffset.x;
    float x2 = x1 + self.frame.size.width;
    NSMutableArray *views = [NSMutableArray arrayWithCapacity:16];
    for(ThumbnailImageView *v in self.subviews) {
        if ([v isMemberOfClass:[ThumbnailImageView class]]) {
            if (v.frame.origin.x >= x1 - v.frame.size.width && v.frame.origin.x <= x2
                && v.subviews.count < 2) {
                [views addObject:v];
            }
        }
    }
    //すぐにサムネイルを作らず、performSelector:withObject:afterDelay:でキュー
    //に入れる。cancelPreviousPerformRequestsWithTarget:を呼ぶことで、
    //layoutSubviewsが続けて呼ばれた場合に最後のものだけが実行される。
    if (views.count > 0) {
        [NSObject cancelPreviousPerformRequestsWithTarget:self];
        [self performSelector:@selector(setImagesWithViewArray:) withObject:views afterDelay:0.1];
    }
    [super layoutSubviews];
}

- (void)setImagesWithViewArray:(NSArray *)views
{
    //残りメモリが不足していたらメモリ空き容量を増やす。
    if (_memMonitor.freeMemory < 50000000) {
        [self removeThumbnailImages];
        //十分メモリが空いたかわからないのでreturn。
        return;
    }
    //表示領域内のサムネイル画像を表示する。
    for(ThumbnailImageView *v in views) {
        CGPDFPageRef page = CGPDFDocumentGetPage(_pdf, v.pageNum);
        [v setImageWithPdfPage:page];
    }
}

//この例では既に作成されているサムネイル画像を全て解放する。
- (void)removeThumbnailImages
{
    for(UIView *v in self.subviews) {
        if ([v isMemberOfClass:[ThumbnailImageView class]]) {
            [(ThumbnailImageView *)v removeThumbnailImage];
        }
    }
}

2013年8月15日木曜日

webView:didFailLoadWithError: error.codeリファレンス



UIWebViewDelegate の webView:didFailLoadWithError: で渡される error のerror.code の内容が書かれているドキュメント。

CFNetwork Error Codes Reference

Organizer - Documentationでこの名前で検索する。

内容の一部

enum CFNetworkErrors {
   kCFHostErrorHostNotFound      = 1,
   kCFHostErrorUnknown           = 2,
   
/* SOCKS errors */
   kCFSOCKSErrorUnknownClientVersion = 100,
   kCFSOCKSErrorUnsupportedServerVersion = 101,
   
/* SOCKS4-specific errors*/
   kCFSOCKS4ErrorRequestFailed   = 110,
   kCFSOCKS4ErrorIdentdFailed    = 111,
   kCFSOCKS4ErrorIdConflict      = 112,
   kCFSOCKS4ErrorUnknownStatusCode = 113,

   ......

/* CFURL and CFURLConnection Errors */
   kCFURLErrorUnknown   = -998,
   kCFURLErrorCancelled = -999,
   kCFURLErrorBadURL    = -1000,
   kCFURLErrorTimedOut  = -1001,
   kCFURLErrorUnsupportedURL = -1002,
   kCFURLErrorCannotFindHost = -1003,
   kCFURLErrorCannotConnectToHost    = -1004,
   kCFURLErrorNetworkConnectionLost  = -1005,
   kCFURLErrorDNSLookupFailed        = -1006,
   kCFURLErrorHTTPTooManyRedirects   = -1007,
   kCFURLErrorResourceUnavailable    = -1008,
   kCFURLErrorNotConnectedToInternet = -1009,
   ......