20210512のiOSに関する記事は9件です。

iOS で体温記録する

体調管理の一環で、体温を記録しようと思っても、 どのアプリを選んだら良いか迷ってしまう、という私のための記事です。 ↓こんなことがやりたい おことわり。 体温情報は、個人の健康に関連する機微情報の一つだと考えています。どこに保存すべきか、そもそも保存するべきかの判断は、個々人で配慮いただければと思います。本記事の趣旨としては、iOS ショートカットでこんな使い方もできる、というアイデアの一例のご紹介です。 閑話休題。 いわゆる普通の体温計 (水銀じゃなくても) で体温測るのですが、記録をどこに残そうか、そのためにわざわざアプリ入れるのも、高機能な体温計を探すのもなぁ・・ そうだ、ヘルスケアアプリに直で記録してしまえ。 iPhone などの iOS の機能の ショートカット と ヘルスケア アプリでお手軽に実現できたので、ご紹介まで。 なお、期せずしてノーコードっぽい感じなので、スクリーンショット多めです。 それではさっそく iOS で「ショートカット」を開きます。 1. 入力フィールドの作成 右上の+マークから新規ショートカットの作成を開始します。 アクションを追加を選択すると、いくつか選択肢が出てきます。 検索フィールドに「入力」と入れ、候補が絞り込みされるので、「入力を要求」を選択します。 「プロンプト」を「体温」に、「テキスト」を「数字」に変更します。 入力を表示を増やすを選択すると、入力ルールを調整することもできます。 2. 「ヘルスケア」への書き込み 下部の+から、ステップを追加します。 今度は、「ヘルスケアサンプルを記録」を追加します。 「種類」の指定 「種類」を「体温」に変更します。 ここで、ヘルスケアアプリへのアクセス許可を確認されます。 一度、「ショートカット」アプリから「設定」アプリへスイッチし、 プライバシー - ヘルスケアから、 「ショートカット」からの書き込みを許可します。 (今回の用途では読み出しは不要です) 「値」の参照と適用 ショートカットの作成画面に戻って、「値」を指定します。 マジック変数 (杖っぽいアイコン) をクリックすると、 直前の入力ステップの下に指定入力という項目が現れるので、これを選択します。 「日付」の指定 (とタイムゾーンを意識したフォーマット) 日付を、「現在の日付」にします。 このままだと、私の iPhone では、記録日時が期待通り動かなかったので (12 時間ずれてたりする)、日付フォーマットをカスタムフォーマットに変更の上、 「yyyy-MM-dd HH:mm:ss Z」を指定します。 3. テストラン&保存 右下の再生ボタン (横向き三角) を選択すると、入力プロンプトが現れるはずです。 体温の数値を更新して、実行すると、ヘルスケアへの記録が実施されます。 最後に右上の次へを選択し、ショートカットに名前をつけて、完成です。 実行するとこんな感じ。 記録された結果は、ヘルスケアアプリの体温を確認すると、 冒頭のようなグラフ表示 (最初は点しか無いと思いますが) に反映されていることが確認できるかと思います。 だいたい 10 分くらいでそれなりの形になるかと。 あとは工夫次第で、どうぞ。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SwiftUIで書くiOSアプリハンズオン(QiitaClientを作ってみよう)

SwiftUIを使ったハンズオン用に記事を作成しました 使用するAPI 今回はQiitaAPiを題材とします。(ドキュメント) 登録不要で使えて、例えば、 https://qiita.com//api/v2/items で、投稿を取得できます。 [{ rendered_body: "...", coediting: false, comments_count: 0, created_at: "2017-11-09T22:50:51+09:00", group: null, id: "fe412a67b64e793d138b", likes_count: 0, private: false, reactions_count: 0, tags: [{ name: "processing", versions: [] }, { name: "openFrameworks", versions: [] } ], title: "【openFrameworks 初心者冒険記5】逃げまくってた...三角関数の扉を再ノック。sin() cos() サインコサイン....。メディアアートで避けては通れない?最初の壁", updated_at: "2017-11-09T22:50:51+09:00", url: "http://qiita.com/39_isao/items/fe412a67b64e793d138b", user: { description: "鮭とメロンパンが好物な奥田民生になりたいボーイです。 最近はてなブログ始めました http://sudara-bluse.hatenablog.com/", facebook_id: "", followees_count: 52, followers_count: 44, github_login_name: null, id: "39_isao", items_count: 103, linkedin_id: "", location: "", name: "", organization: "", permanent_id: 76843, profile_image_url: "https://qiita-image-store.s3.amazonaws.com/0/76843/profile-images/1508030106", twitter_screen_name: "sudara_bluse", website_url: "http://sudara-bluse.hatenablog.com/" } }, {,,,} ] 今回は、以下のデータを使ってiOSアプリを作ってみます。 投稿タイトル ユーザアイコン URL 完成したアプリ プロジェクトを作成する 使うライブラリをインストールする file -> swift package から使用するライブラリを追加します https://github.com/dmytro-anokhin/url-image.git 通信周りのクラスを作成する JSONを変換するための構造体を作成 import Foundation struct Item: Decodable, Identifiable { let id: String let title: String let body: String? let url: String let user: User } struct User: Decodable { let profileImageUrl: String } APIからデータを取得するクラスを実装 SwiftUIの画面から参照するためObservableObject を継承し、画面に表示する値を @Published にする import Foundation class ApiFetcher: ObservableObject { @Published var items = [Item]() private let baseURL = "https://qiita.com/api/v2" func fetchItems(query: String) { let url = URL(string: "\(baseURL)/items?query=\(query)&page=1&per_page=50")! URLSession.shared.dataTask(with: url) {(data,response,error) in do { if let data = data { let decoder = JSONDecoder() decoder.keyDecodingStrategy = .convertFromSnakeCase let items = try decoder.decode([Item].self, from: data) DispatchQueue.main.async { self.items = items } } } catch { // ignore } }.resume() } } 一覧画面を作る 一覧のセルを作成する 新しく ItemRow.swift というファイルを作成します import SwiftUI import URLImage struct ItemRow: View { let item: Item var body: some View { HStack { URLImage(URL(string: item.user.profileImageUrl)!) { proxy in proxy.image .resizable() .aspectRatio(contentMode: .fill) .clipped() }.frame(width: 60.0, height: 60.0) Text(item.title) } } } struct ItemRow_Previews: PreviewProvider { static var previews: some View { ItemRow(item: Item( id: "d040cf8b2d15bd7e507d", title: "[Angular] Angular アプリの構成をみる", body: "Angular に関する自身の勉強の復習がてらの備忘録記事。", url: "https://qiita.com/ksh-fthr/items/d040cf8b2d15bd7e507d", user: User( profileImageUrl: "https://qiita-user-profile-images.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F193342%2Fprofile-images%2F1500888159?ixlib=rb-1.2.2&auto=compress%2Cformat&lossless=0&w=300&s=9a22e880d804d67db66a33ac2e7671b5" ) )) } } 一覧画面を作成する 新しく ItemRow.swift というファイルを作成します import SwiftUI struct ItemList: View { @ObservedObject var fetcher = ApiFetcher() @State var keyword: String = "" var body: some View { NavigationView { VStack { TextField("Search", text: $keyword) { self.fetcher.fetchItems(query: self.keyword) }.padding(16) List(fetcher.items) { item in ItemRow(item: item) } } .navigationBarTitle(Text("投稿一覧")) } } } struct ItemList_Previews: PreviewProvider { static var previews: some View { ItemList() } } ここまで作成するとプレビューが以下のように表示されます 起動画面を一覧画面にする もともと作成されている ContentView を修正して一覧画面を表示するようにします struct ContentView: View { var body: some View { ItemList() } } 起動する ここまで作ったら一度起動して入力した文字で検索できることを確認してみましょう 詳細画面を作る 詳細画面は一覧でタップした投稿をWebViewで表示します 新しくItemDetail.swiftを作成します import SwiftUI import WebKit struct ItemDetail: View { let title: String let url: String var body: some View { WebView(url: URL(string: url)!) .navigationBarTitle(Text(title), displayMode: .inline) } } struct WebView : UIViewRepresentable { var url: URL func makeUIView(context: Context) -> WKWebView { return WKWebView(frame: .zero) } func updateUIView(_ uiView: WKWebView, context: Context) { let req = URLRequest(url: url) uiView.load(req) } } struct ItemDetail_Previews: PreviewProvider { static var previews: some View { ItemDetail(title: "テスト", url: "https://www.apple.com") } } 一覧から詳細画面に遷移できるようにする ItemList.swift の List を以下のように修正して画面遷移できるようにします List(fetcher.items) { item in ItemRow(item: item) } List(fetcher.items) { item in NavigationLink( destination: ItemDetail( title: item.title, url: item.url ) ) { ItemRow(item: item) } } 実行してみましょう 最後に 完成はこちらにあります。 https://github.com/decoch/swiftui_example_qiita_client おつかれさまでした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Flutter flutter_pdfview 使い方

内容 flutter_pdfviewの使い方の忘却録。 開発環境 PC : macOS Big Sur エディター : Visual Studio Code Flutter 1.22.1 flutter_pdfview 1.0.4 コード まずは、pubspec.yamlにパッケージを追加 あとは、読み込みたいPDFファイルも追加 pubspec.yaml dependencies: flutter: sdk: flutter flutter_pdfview: ^1.0.4 <- 追加 ・ ・ ・ assets: - sample.pdf <- 追加 ※Info.plistの修正は今回は必要ないので、追記しない ●ファイルパスを使用する方法 サンプルではassetsフォルダのファイルを読み込んで、ローカルに保存し、パスを指定している。 PDFScreen.dart class PDFScreen extends StatefulWidget { final String path; PDFScreen({Key key, this.path}) : super(key: key); _PDFScreenState createState() => _PDFScreenState(); } class _PDFScreenState extends State<PDFScreen> with WidgetsBindingObserver { final Completer<PDFViewController> _controller = Completer<PDFViewController>(); int pages = 0; int currentPage = 0; bool isReady = false; String errorMessage = ''; @override Widget build(BuildContext context) { return Scaffold( // 省略 body: Stack( children: <Widget>[ PDFView( filePath: widget.path,  // パスを指定 enableSwipe: true, swipeHorizontal: true, autoSpacing: false, pageFling: true, pageSnap: true, defaultPage: currentPage, fitPolicy: FitPolicy.BOTH, preventLinkNavigation: false, // 省略 ), // 省略 ], ), // 省略 ); } } ●ファイルパスを使用しない方法 ローカルにデータを保存したくなかったので、ファイルパスではなく、Uint8Listを渡して表示するように変更。 PDFScreen.dart class PDFScreen extends StatefulWidget { final Uint8List pdfData; PDFScreen({Key key, this.pdfData}) : super(key: key); _PDFScreenState createState() => _PDFScreenState(); } class _PDFScreenState extends State<PDFScreen> with WidgetsBindingObserver { final Completer<PDFViewController> _controller = Completer<PDFViewController>(); int pages = 0; int currentPage = 0; bool isReady = false; String errorMessage = ''; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Document"), actions: <Widget>[ IconButton( icon: Icon(Icons.share), onPressed: () {}, ), ], ), body: Stack( children: <Widget>[ PDFView( pdfData: widget.pdfData, // ファイルパスではなく、Uint8Listを使用 enableSwipe: true, swipeHorizontal: true, autoSpacing: false, pageFling: true, pageSnap: true, defaultPage: currentPage, fitPolicy: FitPolicy.BOTH, preventLinkNavigation: false, // 略 ), // 略 ], ), // 略 ); } } PDFScreenを呼び出しているウィジェットでのPDF読み込み処理 PDFRead.dart Future<void> readPDFData(String assetsPath) async { final data = await rootBundle.load(assetsPath); _pdfData = data.buffer.asUint8List(); } サーバーからPDFを読み込むときは createFileOfPdfUrlメソッド内の var bytes = await consolidateHttpClientResponseBytes(response); でUint8Listが取得できる。 httpリクエストの時は、bodyBytesがUint8Listなので、これを使う。 PDFRead.dart final url = "https://hogehoge/sample.pdf"; final header = {"sample": "samplesample"}; final request = await http.get(url, headers : header); if (request.statusCode == 200) { _pdfData = request.bodyBytes; } 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

絶対使いたくなる!MacCatalystのメリットを紹介!

Macへの移植が簡単 「MacCatalyst」では、iPadアプリのソースコードを流用できるのはもちろん、UIのデザインをMac向けに最適化してくれたり、キーボード&マウス操作に対応してくれたりと、何かと自動でやってくれるので、簡単にMac移植ができます。 対応OSが増えれば必然的にユーザー数も増えるので、簡単にMac対応ができる「MacCatalyst」は効率が良くて便利です。 アプリの管理が楽 対応OSが増えると、アプリの管理の手間もどんどん増えていきます。 ですが、「MacCatalyst」を使えば、アプリの修正や機能追加などが簡単になります。 というのも、iPad版とMac版で同じソースを共有しているため、アプリに変更を加えたい場合は1つのソースに変更を加えるだけで良いからです。 これで面倒なソース管理も楽にできちゃいます。 iOSアプリと同じ感覚でMacアプリを作れる iOSアプリとMacアプリでは、作成するのに使うAPIが違います。 そのため、同じアプリを開発する場合でも勝手が違うのですが、「MacCatalyst」なら、iPadアプリのソースからMacアプリが作れるので、iOSアプリの作り方さえ覚えればMacも作れるようになれます。iOSアプリの作り方がわからない方もこの機会に一度触れてみてはいかがでしょうか。     MacCatalystのメリットをご紹介しました。 まとめると、アプリのMac版の作成と管理が楽になる、といった感じです。 次回はMacCatalystで作られているアプリをご紹介します。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Android, iOSで文字の幅を取得する方法

Android test.kt val paint = TextPaint().also { it.textSize = 10 if (!isInEditMode) { it.typeface = ResourcesCompat.getFont(context, R.font.your_font) } } paint.measureText("hoge") iOS UIFont+.swift import UIKit extension UIFont { /// テキストのwidthを取得する func measureText(text: String) -> CGFloat { let str = NSString(string: text) return str.size(withAttributes: [.font: self]).width } } test.swift let font = UIFont(name:"your_font", size: 10.0) font.measureText("hoge")
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SwiftUI Tutorialsの解説と振り返り

この記事は投稿は何? AppleのSwiftUI Tutorialsを一通り実践したので、振り返ります。 実行環境 macOS 11.3.1 Xcode 12.5 Swift 5.4 SwiftUI Tutorials 全部で3つのチャプターから構成されます。 それぞれのチャプターは、3つのセクションで構成されています。 ここでは最初のチャプターを振り返ります。 Section 1 Create a New Project and Explore the Canvasでは、ビューを構築するための基本的な方法を学びます。 下図は、このSection1で作成したビューをツリー構造にしたものです。 ここでは、画面の表示を更新する仕組みも扱っています。それが@Stateという属性です。 Section 2 Building Lists and Navigationでは、データをリスト形式で表示する画面を構築します。 Section2は、データから動的にビューを作成する方法を理解しておくことも重要なところです。 Section 3 Handling User Inputでは、アプリ全体で共有するデータモデルを導入します。 上図は、理解しやすくするためにだいぶ簡略化して表現したものですが、データモデルを共有する仕組みがわかるかと思います。 動画教材 Udemyという動画学習サービスで、チュートリアルを実践した様子と解説を動画にして、学べるようにしました。 無料のクーポンを発行できたので、こちらで配布させていただきます。 本日(2021/5/12)より3日間以内の登録期限がありますが、どなたでもお気軽にご利用くださいませ。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swift だけで Unity の iOS の Native Plugin を作る

Swift だけで Unity の iOS の Native Plugin を作る Unity は Native Plugin を作成することで、Unity から提供されていない、OS 固有の機能を使用することができます 例えば iOS では、Bluetooth や MP4 動画の作成、アルバムの利用などが出来るようになります これらの Native の機能を Swift で実装し、C# から呼び出す手順です Swift Package Manager (以下 SwiftPM) を使って、Framework を作成し、Unity に組み込みます ついでに、ライブラリの開発用の Native のアプリターゲットを作成します Framework 化するメリット PostProcess の設定が不要です Unity の Inspector 上で Embed の設定が完了します 合わせて Native でアプリターゲットを実装する事で、動作確認のために Unity のビルドをせずに、ライブラリの開発が可能です 今回の話のリポジトリです↓ やりたい事 今回は、Swift で文字列型の数値を long 型に変換する Native Plugin を実装します [DllImport("__Internal")] を付けて定義された、関数 swiftPmPlugin_toNumber が Swift で実装された関数です 今回は、C# にも存在する機能ですが、呼び出した先の Swift で iOS 固有の機能を利用することが可能です → https://github.com/fuziki/UnityPluginXcodeTemplate/blob/develop/Examples/UnityExample/Assets/Scripts/Cube.cs public class Cube : MonoBehaviour { // Swift で実装された関数の定義 [DllImport("__Internal")] private static extern long swiftPmPlugin_toNumber(string numberString); void Update() { // 呼び出し Debug.Log("number is: " + swiftPmPlugin_toNumber("30")); } } Native Plugin の実装 Swift Package Manager (SwiftPM) を使って実装し Framework を出力します 上記の swiftPmPlugin_toNumber が実装された SwiftPmPlugin.framework を作成します 環境 maxOS 11.3.1 Xcode 12.5 Swift 5.4.0 Unity 2020.3.5f1 Swift Package Manager type に libraryを、name に 作りたいパッケージの名前 (今回は SwiftPmPlugin) を指定して、package を初期化します library package が作成されるので、Package.swift を開きます Xcode が起動するので、SwiftPmPlugin.swift に実装していきます swift package init --type=library --name=SwiftPmPlugin open Package.swift SwiftPmPlugin の実装 Swift でロジックを実装します SwiftPmPlugin クラスに、文字列を数値に変換する toNumber 関数を実装しました Int(string) ?? 0 として数値変換に失敗したときは、0 を返すようにしました → https://github.com/fuziki/UnityPluginXcodeTemplate/blob/develop/Sources/SwiftPmPlugin/SwiftPmPlugin.swift class SwiftPmPlugin { var text = "Hello, World!" static func toNumber(string: String) -> Int { return Int(string) ?? 0 } } Swift で関数を公開する Swift で公開する関数を作成します @_cdecl を使って、C の関数として定義します char 配列のポインタを受け取って、Swift の String 型に変換します 先ほど作った SwiftPmPlugin.toNumber を使って、String から Int に変換します C# で定義した関数が戻り値が long 型で 64bit 整数なので戻り値も、揃えます @_cdecl("swiftPmPlugin_toNumber") public func swiftPmPlugin_toNumber(_ stringPtr: UnsafePointer<CChar>?) -> Int64 { let str = String(cString: stringPtr!) return Int64(SwiftPmPlugin.toNumber(string: str)) } Framework でビルドする SwiftPM から xcodeproj を出力して xcodebuild を使って出力した xcodeproj から framework を作成します CONFIGURATION_BUILD_DIR に指定したディレクトリに、SwiftPmPlugin.framework 作成されています swift package generate-xcodeproj --skip-extra-files xcodebuild -project SwiftPmPlugin.xcodeproj -scheme SwiftPmPlugin-Package -configuration Release -sdk iphoneos CONFIGURATION_BUILD_DIR=. Framework の Headers を確認すると、先ほど実装した swiftPmPlugin_toNumber が公開されていることが分かります open SwiftPmPlugin.framework/Headers/SwiftPmPlugin-Swift.h Unity でビルドする Framework の設定 Plugins/iOS/ を作成して、SwiftPmPlugin.framework を配置します SwiftPmPlugin.framework の Inspector で、Add To Embedded Binaries を有効にします Add To Embedded Binaries を有効にすることで、ビルドしたときに Framework が自動で Embed され ます iOSアプリをビルドする Unity で、通常通り iOS 向けにビルドします PostProcess などは、設定していないです 作成した target の frameworks に、SwiftPmPlugin.framework があり、 Embed の項目が、Embed & Sign になっていることを確認します 自動で追加されていない場合は、Unity の設定に失敗している可能性があります 手動で追加しても問題ないです 確認できれば通常通り iOS アプリを実行できるはずです Framework 開発用の Native のアプリターゲットを作る Framework の開発が便利になる tips 的なやつです Unity で使う Framework の動作確認のために、Framework のビルド→Unityのビルド→iOSのサイクルを回すのは大変です そこで、SwiftPM で作ったライブラリを取り込んだ、アプリターゲットを作成し、開発すると効率的だと考えています xcworkspace を作成する xcworkspace を作成し、Package を取り込み、アプリターゲットのターゲットを用意します ※ アプリを Objective-C で作る必要はないです、Swift でも問題ないです アプリターゲットの Frameworks に SwiftPmPlugin を追加します コードから呼び出すことが可能なので、呼び出します #import "ViewController.h" @import SwiftPmPlugin; @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. NSLog(@"value: %lld", swiftPmPlugin_toNumber("20")); } @end Swift からも呼び出すことが可能です import SwiftUI import SwiftPmPlugin struct ContentView: View { var body: some View { Text("number: \(swiftPmPlugin_toNumber("20"))") .padding() } } おわりに Native Plugin を実装することで、ゲームの開発は Unity に集中しつつ、OS 固有の機能を十分に利用することが可能です Swift で実装し、SwiftPM で管理し、Native アプリで動作確認することで、効率的な開発を目指しています
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Swift】UserDefaultsを扱いやすくする

はじめに 今回はUserDefaultsをジェネリクスとプロトコルを使って少し工夫します。 やりたいこと 普通は以下のように使うと思います。 UserDefaults.standard.set("サンプル", forKey: "sampleKey") // 書き込み let text = UserDefaults.standard.string(forKey: "sampleKey") // 読み込み 今回は以下のように、forKeyを工夫してアクセスしやすくします。 let userDefault = UserDefault<UserDefautlsKeys.Animal>() userDefault.set(true, forKey: .dog) let bool = userDefault.bool(forKey: .dog) 一番簡単なのは、以下のようにStringを拡張する方法です。 extension String { static var dog: String { return "sampleDogKey" } static var cat: String { return "sampleCatKey" } } しかし、これだとUserDefaultsのkey以外でもこの文字列を使うことができ、あまり意味がありません。 今回はUserDefaultのforKeyを設定する時のみ、このような使い方をするにはどうすればよいのかをやっていこうと思います。 実装 struct Animal { let dog: String let cat: String } struct Drink { let water: String let milkTea: String let cola: String } struct UserDefautlsKeys { enum Animal: String, UserDefautlsKeyProtocol { static let domain: Domain = .animal var id: String { self.rawValue } case dog case cat } enum Drink: String, UserDefautlsKeyProtocol { static let domain: Domain = .drink var id: String { self.rawValue } case water case milkTea case cola } } enum Domain: String { case animal case drink } protocol UserDefautlsKeyProtocol { static var domain: Domain { get } var id: String { get } var key: String { get } } extension UserDefautlsKeyProtocol { var key: String { Self.domain.rawValue + "." + id } } final class UserDefault<R: UserDefautlsKeyProtocol> { private let userDefaults: UserDefaults init(userDefaults: UserDefaults = .standard) { self.userDefaults = userDefaults } func set(_ value: Any?, forKey identifier: R) { userDefaults.set(value, forKey: identifier.key) } func bool(forKey identifier: R) -> Bool? { return userDefaults.bool(forKey: identifier.key) } } 解説 一番のポイントはUserDefaultのジェネリクスです。これでキーの型をUserDefautlsKeyProtocolが準拠したものに限定できます。今回であれば、UserDefautlsKeysのAnimalとDrinkに準拠させているので、これらのkey(今回はkeyを初期設定しているので、enumの中には書かれていないが、domainとidで一意に決まる)に限定できます。 また、プロトコルを使うことでUserDefaultsKeyを抽象化し、キーを扱いやすくしています。 おわりに おわりです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【iOS】Safariの広告をブロックしたい

hostsを編集。【要牢破り】 hostsファイル hostsファイルはDNSより優先されるので代替サーバーのアドレスを記載したりしますが、目的のサーバーをデバイス自身にする事で、ネット上にサーバーが見つからないようにできます。 例 例えばQiitaのアドレスを次のようにhostsに書き加えると、Qiitaにアクセスできなくなります。 127.0.0.1 localhost ::1 localhost 127.0.0.1 qiita.com ::1 qiita.com 解説 - IPv4のアドレス127.0.0.1とIPv6のアドレス::1をlocalhostとして宣言してるので、qiita.comへ接続する際にlocalhostを探すことになりますが、デバイス自身であるlocalhostにはqiita.comの情報がないので、SafariでQiitaにアクセスすると、 「ページを開けません。Safariはサーバに接続できませんでした。」 と表示されQiitaにアクセスできなくなります。 このしくみを応用して、埋め込まれた広告のアドレスをlocalhostに書き換えるように記述すると、WEBページは閲覧できてるのに埋め込まれた広告は表示されなくなります。 hostsファイルの編集 iOSの場合/etc/hostsにあり、プロパティは以下の内容です。 所有者 グループ パーミッション root wheel 0100644 バックアップをとって、新しくhostsファイルを作っても反映しなかったので、追記することにしました。 広告ドメインのリストからhostsファイルにコピペして保存します。 以下の例では、amazonが表示されなくなります。 etc/hosts ## # Host Database # # localhost is used to configure the loopback interface # when the system is booting. Do not change this entry. ## 127.0.0.1 localhost 255.255.255.255 broadcasthost ::1 localhost # ここから追記 127.0.0.1 www.amazon.co.jp ::1 www.amazon.co.jp ReSpringすると反映されます。 Filza File Manager 超便利なファイルブラウザ。    広告ドメインのリスト ありがたいことに、広告のドメインをまとめたファイルを配布してるサイトがたくさんあります。 GitHub - iVmj2ef/hosts_iphone 日本環境向け 広告除去用hosts - ログろいど 悪いインターネット | 広告ホスト LetMeBlock hostsファイルへの変更を反映させるモノ。 unc0verで牢破りするとインストールされてるみたい。    Mega UHB IPv4+6 iOS 9/10/11/12 - MUHB (Mega Untrusted Hosts Blocker) 広告ブロッカー【牢破り用】 広告ブロックが反映しない場合は、これをインストールして、広告ブロックが反映されてる ことが確認できれば、アンインストールしても反映は残る、   
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む