精华内容
下载资源
问答
  • iOS13 已越狱 iOS12.4 已越狱

    万次阅读 2019-06-20 12:13:39
    你没看错,iOS13 beta 内测版系统刚出没多久,那么快被攻破了,在2019年6月11日国外越狱大神 iBSparkes 开发者 在推特分享了二张图片,分别为iOS12.4 和 iOS 13 已经越狱的 Cydia 截图。众所周知一旦设备成功搭载 ...

    你们期待的iOS12.4~13越狱终于有消息啦!你没看错,iOS13 beta 内测版系统刚出没多久,那么快被攻破了,在2019年6月11日国外越狱大神 iBSparkes 开发者 在推特分享了二张图片,分别为iOS12.4 和 iOS 13 已经越狱的 Cydia 截图。

    众所周知一旦设备成功搭载 Cydia越狱商店,这意味着该系统已经成功越狱了,由越狱大神 iBSparkes 开发者分享Cydia首页底部图可见,一个是iOS13另一个是iOS12.4,这么一个消息可带来给我们希望,这意味着,目前最新系统都能越狱,但最终结果还需要等待正式版出现,如果正式版修复了,那意味着该系统还不能分享越狱。

    iBSparkes是谁?

    之前有分享过iOS10~10.3.3越狱工具,该工具叫:Meridian,不知道你们是否还记得。

    除了这个越狱工具还,还分享参与 iOS12 Chimera 越狱,就是目前最新的iOS12.0~12.1.2越狱工具,越狱爱好者应该不会对他们很陌生。

    另外Yalu102 越狱工具开发者卢卡也在推特转发 iBSparkes 越狱的消息,并且还对iOS12.4系统注明了「apfs、0day、apfs、security、eature」,表示他已经发现了 iOS 12.4 上可用的 0day 漏洞,并解决 apfs 问题,只要iOS12.4 正式版发出,应该很快会出现,iOS12.1.3~12.4的越狱工具,前提iOS12.4正式版未封堵漏洞。

    总结:
    1.等iOS12.4正式版系统,看是否有封堵漏洞。
    2.iOS12.1.3~12.4系统可能优先越狱。
    3.iOS13系统越狱应该没有那么快。
    注意!并不是说正式版发布后就能越狱,只是说等正式版出现后,再看看越狱消息有什么跟进,但已经是很好的消息啦!想越狱的用户还是很有希望的。


    原文地址:https://ioshacker.net/thread-88-1-1.html

    展开全文
  • iOS高级分享 — 谈谈 IOS 13

    千次阅读 2019-09-24 20:47:12
    为了纪念上周发布的iOS13,我们来看一看你现在可以在你的应用程序中使用的一些模糊的(基本上是没有文档的)API。我们已经清除了最好的部分IOS13发行说明API差异现在把它们呈现给你。 下面是我们最喜欢的一些从iOS 13...

    为了纪念上周发布的iOS13,我们来看一看你现在可以在你的应用程序中使用的一些模糊的(基本上是没有文档的)API。我们已经清除了最好的部分IOS13发行说明API差异现在把它们呈现给你。
    下面是我们最喜欢的一些从iOS 13开始可以做的事情:

    生成URL的富表示

    新的IOS 13,链接呈现框架提供一种方便的内置方式来复制您在消息中看到的URL的丰富预览。如果您的应用程序有任何聊天或消息功能,您肯定会想要检查这一点。

    丰富的URL预览至少可以追溯到20世纪初,随着微格式由语义web先驱和早期先驱使用khtml2png若要生成网页的缩略图图像,请执行以下操作。快到2010年,随着社交媒体和用户生成的内容的兴起,facebook创建了OpenGraphProtocol允许网络出版商自定义其页面的外观时,张贴在新闻提要。

    如今,大多数网站都有开放图形标签在他们的网站上,为社会网络,搜索引擎,以及任何其他链接被贩运的地方提供他们的内容摘要。例如,如果您对这个网页进行了“查看源”,您将看到以下内容:

    <meta property="og:site_name" content="NSHipster" />
    <meta property="og:image" content="https://nshipster.com/logo.png" />
    <meta property="og:type" content="article" />
    <meta property="og:title" content="iOS 13" />
    <meta property="og:url" content="https://nshipster.com/ios-13/" />
    <meta property="og:description" content="To mark last week's release of iOS 13, we're taking a look at some obscure (largely undocumented) APIs that you can now use in your apps." />
    

    如果您想在应用程序中使用这些信息,现在可以使用LinkPresting框架的LPMetadataProvider类来获取元数据,并可选择地构造一个表示:

    import LinkPresentation
    
    let metadataProvider = LPMetadataProvider()
    let url = URL(string: "https://nshipster.com/ios-13/")!
    
    let metadataProvider = LPMetadataProvider()
    metadataProvider.startFetchingMetadata(for: url) { [weak self] metadata, error in
        guard let metadata = metadata else { return }
    
        let linkView = LPLinkView(metadata: metadata)
        self?.view.addSubview(linkView)
    }
    

    在设置适当的约束(或者调用sizeToFit()),您将得到以下内容,用户可以点击它预览链接的网页:

    在startFetchingMetadata(for:)完成处理程序,您可以检查和变异从服务器检索的元数据。您可能会利用这个机会为没有这些内容的页面添加默认的图像/视频,将文本翻译成用户首选的语言之一,或者检查显式文本和媒体。

    或者,如果您已经在-app中拥有元数据,或者不能或不希望远程获取元数据,则可以构造一个LPLinkMetadata直接:

    let metadata = LPLinkMetadata()
    metadata.url = url
    metadata.title = "iOS 13"
    metadata.iconProvider = ...
    
    let linkView = LPLinkView(metadata: metadata)
    

    LPMetadataProvider在IOS上做广告,但MacOS客户端必须具有com.apple.security.network.client权限,以便从远程URL获取元数据。

    执行设备上语音识别

    SFSpeechRecognizer在iOS 13中获得一次重大升级-最显著的是它增加了对设备上语音识别的支持。

    以前,抄写需要一个互联网连接,并且被限制在最多1分钟的时间内,每天的请求都有限制。但是现在,你可以完全在设备上和离线下进行语音识别,没有任何限制.唯一要注意的是,离线转录不如服务器连接的效果好,而且只适用于某些语言。

    若要确定脱机转录是否可用于用户的区域设置,请检查SFSpeechRecognizer财产supportsOnDeviceRecognition…在出版时,所支持的语文清单如下:

    根据IOS 13发布说明:“supportsOnDeviceRecognition属性总是返回false第一次被访问的时候。几秒钟后,再次访问它将返回正确的值。“

    但这并不是iOS 13中的全部语音识别!SFSpeechRecognizer现在提供信息,包括说话速率和平均停顿时间,以及语音分析功能,如抖动(音高的变化)和闪光器(振幅的变化)。

    import Speech
    
    guard SFSpeechRecognizer.authorizationStatus() == .authorized
        let recognizer = SFSpeechRecognizer()
    else {
        fatalError()
    }
    
    let url: URL = ...
    let request = SFSpeechURLRecognitionRequest(url: url)
    
    recognizer.recognitionTask(with: request) { (result, error) in
        guard let result = result else { return }
    
        for segment in result.bestTranscription.segments {
            guard let voiceAnalytics = segment.voiceAnalytics else { continue }
    
            let pitch = voiceAnalytics.pitch.acousticFeatureValuePerFrame
            let voicing = voiceAnalytics.voicing.acousticFeatureValuePerFrame
            let jitter = voiceAnalytics.jitter.acousticFeatureValuePerFrame
            let shimmer = voiceAnalytics.shimmer.acousticFeatureValuePerFrame
        }
    }
    

    您的应用程序可以使用有关音调、语音和其他功能的信息(可能)。协同CoreML)区分说话人或从说话人的拐弯处确定潜台词。

    发送和接收Web套接字消息

    说到FoundationURL加载系统,我们现在已经有了本机支持的东西,这些东西在我们的愿望列表中占据了很多年的首位:Web套接字.

    多亏了新的URLSessionWebSocketTask在IOS 13中,您现在可以像发送HTTP请求一样轻松可靠地在应用程序中集成实时通信-所有这些都没有任何第三方库或框架:

    let url = URL(string: "wss://...")!
    let webSocketTask = URLSession.shared.webSocketTask(with: url)
    webSocketTask.resume()
    
    // Configure how messages are received
    webSocketTask.receive { result in
        guard let .success(message) = result else { return }
        ...
    }
    
    // Send a message
    let message: URLSessionWebSocketTask.Message = .string("Hello, world!")
    webSocketTask.send(message) { error in
        ...
    }
    
    // Eventually...
    webSocketTask.cancel(with: .goingAway, reason: nil)
    

    对于web套接字的低级控制,包括客户端和服务器支持,请查看网络框架.

    多年来,网络可能一直是整个苹果技术体系中移动最快的部分。每个WWDC,都有太多要谈论的话题,以至于他们不得不在两个不同的会议上打破他们的内容。2019年也不例外,我们强烈建议你花点时间看看今年的“网络进步”会议(第一部分, 第二部分).

    用地图做更多

    MapKit是Apple SDK的另一个组成部分,它在WWDC上年复一年地表现强劲。在我们日常生活中,影响最大的往往是那些小小的触碰。

    例如,新的MKMapView.CameraBoundaryiOS 13中的API使得在不完全锁定地图的情况下将地图的视口限制到特定区域变得容易得多。

    let region = MKCoordinateRegion(center: mapView.center,
                                            latitudinalMeters: 1000,
                                            longitudinalMeters: 1000)
    mapView.cameraBoundary = MKMapView.CameraBoundary(coordinateRegion: region)
    

    新的MKPointOfInterestFilterapi,您现在可以自定义地图视图的外观,只显示特定类型的兴趣点。(而以前是全无命题).

    let filter = MKPointOfInterestFilter(including: [.cafe])
    mapView.pointOfInterestFilter = filter // only show cafés
    

    最后,用MKGeoJSONDecoder,我们现在有一个内置的方式来拉进来。GeoJSON来自Web服务和其他数据源的形状。

    let decoder = MKGeoJSONDecoder()
    
    if let url = URL(string: "..."),
        let data = try? Data(contentsOfURL: url),
        let geoJSONObjects = try? decoder.decode(data) {
    
        for case let overlay as MKOverlay in geoJSONObjects {
            mapView.addOverlay(overlay)
        }
    }
    

    用JavaScript信守诺言

    如果你喜欢我们的文章JavaScriptCore,你会很高兴知道JSValue对象现在本地支持承诺.

    对于不熟悉的人:在JavaScript中,Promise表示异步操作的最终完成(或拒绝)及其结果值的对象。承诺是现代JS开发的支柱-也许最值得注意的是fetchAPI

    iOS 13中JavaScriptCore的另一个补充是对符号(不,不是那些符号)。有关init(newSymbolFromDescription:in:), 参考文档 猜猜怎么用。

    对目标C相关对象的响应(?)

    在云雀上,我们决定看看目标C今年是否有什么新发现,并惊讶地发现objc_setHook_setAssociatedObject…同样,除了声明之外,我们没有什么可继续进行的,但是现在您似乎可以配置一个块,以便在关联对象已经设定好了。对于任何仍深入目标C运行时的人来说,这听起来很方便。

    驯服活动项目(?)

    关于失踪文件的问题:UIActivityItemsConfiguration似乎就像在新的iOS13共享表中管理操作的一个很有吸引力的选项,但是我们不知道从哪里开始…

    遗憾的是,我们还没有足够的信息来利用这一点。

    格式列表和相关时间

    中讨论过的前一篇文章,IOS 13为基金会带来了两个新的格式:ListFormatter和RelativeDateTimeFormatter.

    不是为了唠叨这件事,但他们都是仍然因此,如果您想了解更多信息,我们建议您从7月份开始查看这篇文章。或者,如果您很着急,下面是一个演示如何将两者结合使用的快速示例:

    import Foundation
    
    let relativeDateTimeFormatter = RelativeDateTimeFormatter()
    relativeDateTimeFormatter.dateTimeStyle = .named
    
    let listFormatter = ListFormatter()
    listFormatter.string(from: [
        relativeDateTimeFormatter.localizedString(from: DateComponents(day: -1)),
        relativeDateTimeFormatter.localizedString(from: DateComponents(day: 0)),
        relativeDateTimeFormatter.localizedString(from: DateComponents(day: 1))
    ]) // "yesterday, today, and tomorrow"
    

    跟踪排队操作的进展

    从iOS 13开始,OperationQueue现在有一个progress财产。

    当然,(NS)Progress对象并不是最简单、最方便的东西(我们一直打算在某个时候写一篇关于它们的文章),但是它们有一个完整的、经过深思熟虑的API,甚至在应用程序框架中也有一些方便的插槽。

    例如,检查连接一个UIProgressView若要以其方式显示操作队列的实时更新进度,请执行以下操作:observedProgress财产:

    import UIKit
    
    fileprivate class DownloadOperation: Operation { ... }
    
    class ViewController: UIViewController {
        private let operationQueue = {
            let queue = OperationQueue()
            queue.maxConcurrentOperationCount = 1
        }()
    
        @IBOutlet private var progressView: UIProgressView!
    
        @IBAction private func startDownloading(_ sender: Any) {
            operationQueue.cancelAllOperations()
            progressView.observedProgress = operationQueue.progress
    
            for url in [...] {
                let operation = DownloadOperation(url: url)
                operationQueue.addOperation(operation)
            }
        }
    }
    

    还值得一提的是13岁时出现的其他一些API,如schedule(after:interval:tolerance:options:?,哪条线索OperationQueue进入新的组合框架以一种很好的方式,而且addBarrierBlock(?,它的工作原理可能是调度屏障(虽然没有文档,但这是任何人的猜测)。

    轻松管理后台任务

    定义应用程序与竞争对手的区别之一是,它们使用后台任务来确保应用程序在下一次进入前台时得到充分同步和更新。

    iOS 7是第一个提供用于调度后台任务的官方API (尽管在此之前,开发人员使用了各种创造性的方法)…但在这段时间里,多个因素-从iOS应用程序能力和复杂性的提高,到对应用程序的性能、效率和隐私的日益重视-催生了对更全面解决方案的需求。

    该解决方案是通过新的iOS 13实现的。背景测试框架.

    如今年WWDC会议所述“应用程序后台执行的进展”该框架区分了两大类背景任务:

    • 应用程序刷新任务:短命的任务,使应用程序一整天都保持最新。
    • 背景处理任务*用于执行可推迟的维护任务的长期任务

    WWDC会话和附带的示例代码项目很好地解释了如何将这两者结合到您的应用程序中。但是,如果您想要它的快速要点,下面是一个应用程序从Web服务器定期刷新的一个小例子:

    import UIKit
    import BackgroundTasks
    
    fileprivate let backgroundTaskIdentifier = "com.nshipster.example.task.refresh"
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
        var window: UIWindow?
    
        lazy var backgroundURLSession = {
            let configuration = URLSessionConfiguration.background(withIdentifier: "com.nshipster.url-session.background")
            configuration.discretionary = true
            configuration.timeoutIntervalForRequest = 30
    
            return URLSession(configuration: configuration, delegate: ..., delegateQueue: ...)
        }
    
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
           ...
    
            BGTaskScheduler.shared.register(forTaskWithIdentifier: backgroundTaskIdentifier, using: nil) { task in
                self.handleAppRefresh(task: task as! BGAppRefreshTask)
            }
    
            return true
        }
    
        func applicationDidEnterBackground(_ application: UIApplication) {
            scheduleAppRefresh()
        }
    
        func scheduleAppRefresh() {
            let request = BGAppRefreshTaskRequest(identifier: backgroundTaskIdentifier)
            request.earliestBeginDate = Date(timeIntervalSinceNow: 60 * 10)
    
            do {
                try BGTaskScheduler.shared.submit(request)
            } catch {
                print("Couldn't schedule app refresh: \(error)")
            }
        }
    
        func handleAppRefresh(task: BGAppRefreshTask) {
            scheduleAppRefresh()
    
            let url: URL = ...
            var dataTask = backgroundURLSession.dataTask(with: url) { (data, response, error) in
                ...
                let success = (200..<300).contains(response?.statusCode)
                task.setTaskCompleted(success: success)
            }
    
            task.expirationHandler = {
                dataTask.cancel()
            }
    
            dataTask.resume()
        }
    
        ...
    }
    

    以前进行背景更新的方法-即,UIApplication.setMinimumBackgroundFetchInterval(:)和UIApplicationDelegate.application(:performFetchWithCompletionHandler:)-现在已在IOS 13中被否决。

    注释文本内容类型以获得更好的可访问性。
    你知道听到一些人读出网址是多么令人沮丧吗?“eɪʧtipiˈkoʊlənslʃˈdʌbəljuˈdʌbəljudɑt”…)这就是当画外音试图在不了解更多信息的情况下阅读一些东西什么在看书。

    iOS 13承诺通过新的accessibilityTextualContext财产和UIAccessibilityTextAttributeContextNSAttributedString属性键只要有可能,一定要用最能描述所显示的文本类型的常量对视图和属性字符串进行注释:

    • UIAccessibilityTextualContextConsole
    • UIAccessibilityTextualContextFileSystem
    • UIAccessibilityTextualContextMessaging
    • UIAccessibilityTextualContextNarrative
    • UIAccessibilityTextualContextSourceCode
    • UIAccessibilityTextualContextSpreadsheet
    • UIAccessibilityTextualContextWordProcessing

    隐式删除从情节提要初始化的视图控制器中的未包装选项

    SwiftUI可能已经预示了故事板的最终结束,但这并不意味着事情不是也不会继续好转,直到那一天到来。

    对于斯威夫特纯粹主义者来说,在使用故事板进行iOS项目时,最令人恼火的反模式之一就是视图控制器初始化。由于Interface Builder的“准备”方法与SWIFT的对象初始化规则之间的阻抗不匹配,我们经常不得不在使所有属性成为非私有、变量和(隐式展开)选项之间进行选择,或者完全选择前面的故事板。

    Xcode 11和IOS 13允许这些范例通过新的方式来协调它们之间的差异。@IBSegueAction属性和一些新的UIStoryboard班级方法:

    首先,@IBSegueAction属性可以应用视图控制器方法声明来指定自己为API,负责创建segue的目标视图控制器。(即destinationViewController的属性segue参数中的prepare(for:sender:)方法).

    @IBSegueAction
    func makeProfileViewController(coder: NSCoder, sender: Any?, segueIdentifier: String?) -> ProfileViewController? {
        ProfileViewController(
            coder: coder,
            name: self.selectedName,
            avatarImageURL: self.selectedAvatarImageURL
        )
    }
    

    第二,UIStoryboard类方法instantiateInitialViewController(creator:)和instantiateViewController(identifier:creator:)提供一个方便的基于块的定制点来实例化Storyboard的视图控制器.

    import UIKit
    
    struct Person { ... }
    
    class ProfileViewController: UIViewController {
        let name: String
        let avatarImageURL: URL?
    
        init?(coder: NSCoder, name: String, avatarImageURL: URL?) {
            self.name = name
            self.avatarImageURL = avatarImageURL
    
            super.init(coder: coder)
        }
    
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    }
    
    let storyboard = UIStoryboard(name: "ProfileViewController", bundle: nil)
    storyboard.instantiateInitialViewController(creator: { decoder in
        ProfileViewController(
            coder: decoder,
            name: "Johnny Appleseed",
            avatarImageURL: nil
        )
    })
    

    和新的UIKit场景在我们等待SwiftUI成熟和稳定的时候,iOS 13提供了大量的工作。

    这是为了我们的iOS 13功能的总结性,你可能已经错过了。但是请放心-我们计划在未来的NSHipster文章中涵盖更多的新API。

    如果遗漏了什么你想让我们来掩护,请通过加我们的交流群 点击此处进交流群 ,来一起交流或者发布您的问题,意见或反馈。

    原文地址 https://nshipster.com/ios-13/#track-the-progress-of-enqueued-operations

    展开全文
  • iOS 13适配汇总

    千次阅读 2019-09-15 11:46:01
    随着iPhone 11的发布,iOS 13适配也提上了日程,接下来就开发中升级iOS13的手机可能出现的问题 Xcode: 11.0 iOS : 13.0 UIViewController 模态弹出界面 viewController.present(presentVC, animated: true, ...

    随着iPhone 11的发布,iOS 13适配也提上了日程,接下来就开发中升级iOS13的手机可能出现的问题
    Xcode: 11.0
    iOS : 13.0

    UIViewController 模态弹出界面

    viewController.present(presentVC, animated: true, completion: nil)
    在调用模态弹出视图,会发现弹出的界面没有全屏。如图
    模态弹出界面
    通过多次的尝试,发现在低版本里面不会发生这种情况(iOS12及以下),于是我查阅了最新的开发文档,发现了端倪,主要还是因为我们之前忽略了UIViewController里面的一个属性,即:modalPresentationStyle

     Defines the presentation style that will be used for this view controller when it is presented modally. Set this property on the view controller to be presented, not the presenter.
     If this property has been set to UIModalPresentationAutomatic, reading it will always return a concrete presentation style. By default UIViewController resolves UIModalPresentationAutomatic to UIModalPresentationPageSheet, but other system-provided view controllers may resolve UIModalPresentationAutomatic to other concrete presentation styles.
     Defaults to UIModalPresentationAutomatic on iOS starting in iOS 13.0, and UIModalPresentationFullScreen on previous versions. Defaults to UIModalPresentationFullScreen on all other platforms.
    
    
    public enum UIModalPresentationStyle : Int {
        case fullScreen
        
        @available(iOS 3.2, *)
        case pageSheet
        @available(iOS 3.2, *)
        case formSheet
    
        @available(iOS 3.2, *)
        case currentContext
    
        @available(iOS 7.0, *)
        case custom
    
        @available(iOS 8.0, *)
        case overFullScreen
    
        @available(iOS 8.0, *)
        case overCurrentContext
    
        @available(iOS 8.0, *)
        case popover
    
        
        @available(iOS 7.0, *)
        case none
    
        @available(iOS 13.0, *)
        case automatic
    }
    

    通过查看API 可以看到,iOS 13 新增一个:automatic类型,默认情况下就是这个所以才会弹出不是全屏的界面。如果我们想要修改为全屏的话
    可以:presentVC.modalPresentationStyle = .fullScreen设置为全屏即可

    KVC 限制

    iOS13以后已经不能肆无忌惮的通过 KVC来修改一些没有暴露出来的属性了。

    *** Terminating app due to uncaught exception 'NSGenericException', reason: 'Access to xxx's _xxx ivar is prohibited. This is an application bug'
    

    我们常用的有

    // UITextField 的 _placeholderLabel
            let textField = UITextField.init()
            textField.setValue(UIColor.red, forKey: "_placeholderLabel.textColor")
            
            /// UISearchBar 的 _searchField
            [searchBar valueForKey:@"_searchField"]
            
    

    下面方法替换

    ///分别设置字体大小和颜色(富文本)
    textField.attributedPlaceholder = NSAttributedString.init(string: "请输入....", attributes: [NSAttributedString.Key.foregroundColor: UIColor.red], [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 15)])
    
     /// UISearchBar 用 searchField代替
    bar.value(forKey: "searchField") as! UITextField
    
    

    UISegmentedControl 默认样式改变

    
    默认样式变为白底黑字,如果设置修改过颜色的话,页面需要修改
    

    UITabbar

    如果之前有通过TabBar上图片位置来设置红点位置,在iOS13上会发现显示位置都在最左边去了。遍历UITabBarButton的subViews发现只有在TabBar选中状态下才能取到UITabBarSwappableImageView,解决办法是修改为通过UITabBarButton的位置来设置红点的frame

    App启动过程中,部分View可能无法实时获取到frame

    // 只有等执行完 UIViewController 的 viewDidAppear 方法以后,才能获取到正确的值,在viewDidLoad等地方 frame Size 为 0,例如:
     UIApplication.shared.statusBarFrame
    

    废弃UIWebView

    查看API可以看到:iOS 2.0 到 iOS 11.0
    在12.0就已经被废弃,部分APP使用webview时, 审核被拒

    @available(iOS, introduced: 2.0, deprecated: 12.0, message: "No longer supported; please adopt WKWebView.")
    open class UIWebView : UIView, NSCoding, UIScrollViewDelegate {
    	.........
    	.........
    	.........
    }
    
    

    CNCopyCurrentNetworkInfo

    iOS13 以后只有开启了 Access WiFi Information capability,才能获取到 SSID 和 BSSID wi-fi or wlan 相关使用变更
    最近收到了苹果的邮件,说获取WiFi SSID的接口CNCopyCurrentNetworkInfo 不再返回SSID的值。不仔细看还真会被吓一跳,对物联网的相关APP简直是炸弹。仔细看邮件还好说明了可以先获取用户位置权限才能返回SSID。
    注意:目本身已经打开位置权限,则可以直接获取

    - (NSString*) getWifiSsid {
        if (@available(iOS 13.0, *)) {
            //用户明确拒绝,可以弹窗提示用户到设置中手动打开权限
            if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) {
                NSLog(@"User has explicitly denied authorization for this application, or location services are disabled in Settings.");
                //使用下面接口可以打开当前应用的设置页面
                //[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
                return nil;
            }
            CLLocationManager* cllocation = [[CLLocationManager alloc] init];
            if(![CLLocationManager locationServicesEnabled] || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined){
                //弹框提示用户是否开启位置权限
                [cllocation requestWhenInUseAuthorization];
                usleep(50);
                //递归等待用户选选择
                return [self getWifiSsidWithCallback:callback];
            }
        }
        NSString *wifiName = nil;
        CFArrayRef wifiInterfaces = CNCopySupportedInterfaces();
        if (!wifiInterfaces) {
            return nil;
        }
        NSArray *interfaces = (__bridge NSArray *)wifiInterfaces;
        for (NSString *interfaceName in interfaces) {
            CFDictionaryRef dictRef = CNCopyCurrentNetworkInfo((__bridge CFStringRef)(interfaceName));
    
            if (dictRef) {
                NSDictionary *networkInfo = (__bridge NSDictionary *)dictRef;
                NSLog(@"network info -> %@", networkInfo);
                wifiName = [networkInfo objectForKey:(__bridge NSString *)kCNNetworkInfoKeySSID];
                CFRelease(dictRef);
            }
        }
        CFRelease(wifiInterfaces);
        return wifiName;
    }
    

    打印:如下

     network info -> {
        BSSID = "44:dd:fb:43:91:ff";
        SSID = "Asus_c039";
        SSIDDATA = <41737573 5f633033 39>;
    }
    不同意
    network info -> {
        BSSID = "00:00:00:00:00:00";
        SSID = WLAN;
        SSIDDATA = <574c414e>;
    }
    
    

    SceneDelegate

    有关Xcode 11 新建工程创建SceneDelegate文件,可以参考我的这篇文章:iOS 13 SceneDelegate适配

    iOS 13 暗黑模式

    当我们系统开启暗黑模式的时候,你会发现我们的有些界面白色界面变黑,黑色字体变白。
    原因:我们没有设置背景例如UITableviewCell背景,以及采用UILabel的默认背景黑色,当切换到暗黑模式的时候就会出现上述情况。
    当我们还不打算适配暗黑模式的时候,解决方式1:

    1. 手动设置各个页面背景。显然不太好,麻烦还容易遗漏
    2. 在info.plist中添加一个配置文件就好了:User Interface Style设置为Light

    APP暗黑模式取消
    **注释:**关于如何优雅的适配暗黑模会在后续的博客中更新,敬请期待!
    持续更新中…

    展开全文
  • 方案一 参考博客: Xcode11新变化:SceneDelegate iOS13 Scene Delegate详解 iOS 13 SceneDelegate适配


    在Xcode11上新建一个iOS的带storyboard的项目

    最低适配的系统改到iOS13以下后

    在这里插入图片描述

    解决方案一:删除SceneDelegate,还原到iOS13以前的版本(本人亲测可行)

    1.给AppDelegate添加window属性
    2.注释掉AppDelegate中UISceneSession Lifecycle下面的两个代理方法
    在这里插入图片描述
    3.删除Info.plist中的Application Scene Manifest字段
    在这里插入图片描述
    4.删掉SceneDelegate.swift文件
    在这里插入图片描述
    5.在AppDelegate中把之前的几个代理方法写回来在这里插入图片描述

    AppDelegate中的代码

    //
    //  AppDelegate.swift
    //  MySceneDelegate
    //
    //  Created by macvivi on 2020/6/9.
    //  Copyright © 2020 macvivi. All rights reserved.
    //
    
    import UIKit
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
        
        var window: UIWindow?
        
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
            // Override point for customization after application launch.
            return true
        }
        
        // MARK: UISceneSession Lifecycle
        
        //    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        //        // Called when a new scene session is being created.
        //        // Use this method to select a configuration to create the new scene with.
        //        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
        //    }
        //
        //    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        //        // Called when the user discards a scene session.
        //        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
        //        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
        //    }
        
        
        func applicationWillResignActive(_ application: UIApplication) {
            // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
            // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
        }
        
        func applicationDidEnterBackground(_ application: UIApplication) {
            
            // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
            // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
        }
        
        func applicationWillEnterForeground(_ application: UIApplication) {
            // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
        }
        
        func applicationDidBecomeActive(_ application: UIApplication) {
            // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
        }
        
        func applicationWillTerminate(_ application: UIApplication) {
            
            
            // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
        }
        
        
        
    }
    
    
    

    方案二:iOS13以上系统使用SceneDelegate,iOS13以下系统不使用SceneDelegate(本人还未测试)

    参考博客:
    Xcode11新变化:SceneDelegate

    其他参考博客:

    iOS13 Scene Delegate详解

    iOS 13 SceneDelegate适配

    展开全文
  • 适配 iOS13

    千次阅读 2019-06-12 07:58:43
    这次大会上,苹果公布了 iOS13 的更新内容,今天我们来看看如何适配 iOS13. WWDC19视频 Xcode 11 beta 下载 macOS Catalina 10.15 beta 下载 第三方登录 Sign In with Apple will be available for beta testing...
  • IOS屏幕适配(四)最新系统IOS13适配

    千次阅读 2019-09-05 17:29:48
    IOS屏幕适配(四)最新系统IOS13适配3. IOS 最新系统适配问题3.1 IOS 13 适配3.1.1 即将废弃的 LaunchImage3.1.2 Sign in with Apple -提供第三方登录的注意啦3.1.3 iOS 13 DeviceToken有变化3.1.4 ...
  • iOS13 UI适配

    千次阅读 2019-10-10 14:38:06
    iOS13 UI适配 前2天现在了Xcode11,在iOS13模拟器上运行了下app,发现有如下的问题 1.UITabBarItem的title颜色,莫名其妙的变成了系统的蓝色,并且tabbar顶部的线条的也没有隐藏 原来通常使用如下的方法隐藏顶部的...
  • IOS14怎么降级回IOS13

    2020-12-02 16:55:33
    IOS14怎么降级回IOS13?虽然新系统的各种新功能让人眼前一亮,但由于是beta 版本,难免存在某些影响体验的 BUG,例如占用过多存储容量、设备发烫、微信小程序闪退等。那么IOS14怎么降级回IOS13?下面就让小编给大家...
  • 5.iOS13初探

    2019-08-07 10:33:37
    iOS13初探TextFIeld KVC的问题presentViewController 的问题崩溃问题DeviceToken 的问题Dark 模式适配问题 iOS13测试版发布以后,老大让我赶紧也适配一下,就一番折腾,安装了ios13Btea测试版,Xcode直接添加ios13...
  • PC电脑控制手机iphone(iOS 11、iOS 12、iOS 13),需越狱

    千次阅读 热门讨论 2020-08-06 15:32:33
    Veency是一款可以用电脑控制你的iPhone的插件,作者是大名鼎鼎的Cydia的...julioverne在cosmosgenius的基础上改进了screendump,使其完美支持ios12和ios13。这里主要就是使用julioverne的版本。 1、iphone手机安装scre
  • iOS 13 真机调试包

    千次阅读 2019-07-29 00:31:41
    升级 iOS 13之后,使用 Xcode 10真机调试会提示错误: Could not locate device support files. 这是因为 Xcode 10默认没有自带 iOS 13 的调试包,下载调试包,然后重新打开 Xcode 就可以了。 iOS 真机调试包集合...
  • iOS 13获取keyWindow

    千次阅读 2020-10-12 10:52:49
    iOS 13之前获取KeyWindow直接使用[UIApplication sharedApplication].keyWindow。iOS 13这个属性被废弃了。 @property(nullable, nonatomic,readonly) UIWindow *keyWindow API_DEPRECATED("Should not be used for...
  • iOS13适配注意事项

    千次阅读 2019-11-05 16:55:08
    IOS13适配-详细 iOS 13 适配(持续更新中) iOS13适配 掘金 iOS 13适配01 掘金 适配 iOS13 iOS 13 更新tips View Controller Presentation Changes in iOS 13 1. Apple Login (2020年4月份) 附上官方Demo:...
  • iOS 13问题记录

    千次阅读 2019-09-30 10:28:46
    系统: Mac OS 10.14.6, XCode 11,swift 4.2 ...在iOS 13之前,想获取手机连接的蓝牙设备信息,可以直接使用:CBCentralManager.retrieveConnectedPeripherals(<#T##self: CBCentralManager##CB...
  • iOS13:UISceneDelegate

    2019-12-18 15:50:28
    iOS13中UISceneDelegate所带来的的变化; 如何配置使得在iOS13中不使用默认的UISceneDelegate; 概述 iOS13上,仍然不支持 iPhone 分屏功能,其带来的是 iOS开发中 App 生命中期代理者的改变,原先生命周期函数由 ...
  • Github链接:https://github.com/xuan32546/IOS13-SimulateTouch 简介 这个库作为一个iOS底层与应用层的桥梁,实现iOS11 - 13.6的模拟触摸。在应用层一行代码即可进行模拟点击,简洁方便(下文会有代码案例)。并且...
  • IOS 13陀螺仪监控

    2020-04-19 14:02:51
    这是 IOS 13 之后的,苹果给我新增的一个方法用来获取用户权限,获取到用户权限之后,我们就可以来检测加速度了,但是注意该方法是 IOS 13 之后才有的,在 IOS 13 之前这么写的话,DeviceMotionEvent下并没有...
  • iOS13的适配

    千次阅读 2019-08-17 13:56:18
    这次大会上,苹果公布了iOS13的更新内容,今天我们来看看如何适配iOS13. WWDC19视频 Xcode 11 beta 下载 macOS Catalina 10.15 beta 下载 第三方登录 Sign In with Apple will be available for beta testing ...
  • iOS13踩坑记录

    千次阅读 2019-09-21 17:11:00
    iOS13默认UIModalPresentationAutomatic模式,不符合我们的需求。改回之前的模式要用UIModalPresentationFullScreen。 vc.modalPresentationStyle = UIModalPresentationFullScreen; 但是,...
  • iOS 13碰到的crash

    2019-09-30 12:38:20
    人家一步一个脚印,咱是一步一个坑 你好!...此次更新Xcode11之后,有需要适配iOS 13的点却没有做的话,出包之后在iOS 13的设备上会crash。Xcode10不用担心,不更新就没问题嘛。 1. UIStatusBarMan...
  • android studio中跑Flutter项目,运行iOS13系统报错 2019-10-29 14:45:16.875 ios-deploy[38706:203108] [ !! ] Error 0xe800007f: Device doesn't support wireless sync. AMDeviceStartService(device, CFSTR(...
  • iOS13生命周期的改动

    千次阅读 2019-09-07 01:53:00
    大家都知道,应用生命周期这个东西,一直到目前的iOS 12这个版本都是在AppDelegate里头(也就是UIApplicationDelegate协议里头) managing_your_app_s_life_...然而,到了iOS 13(目前还是beta版本,本来不想写这篇文章的...
  • iOS13适配相关

    千次阅读 2019-09-23 15:07:32
    iOS13更新后可能需要对UI进行相应的适配,那么开发者很关心的一个问题,如何在APP UI中关闭暗黑模式呢。 很简单,在Info.plist文件中添加Key:User Interface Style,值类型设置为String,值为Light,重新运行项目就...
  • iOS13-适配 Dark Mode

    千次阅读 2019-08-01 16:01:06
    收录:原文地址 WWDC 19 上发布了 iOS 13,我们来看下如何适配 DarkMode 首先我们来看下效果图 如何适配 DarkMode ...iOS 13 之前 UIColor 只能表示一种颜色,从 iOS 13 开始 UIColor 是一个动态的颜色,它...
  • 去掉tabBar黑线, iOS13

    千次阅读 2019-09-30 10:25:32
    iOS 13 之前, 去掉黑线:设置UITarBar的 backgroundImage 和 shadowImage即可: tabbar.backgroundImage = UIImage(color: UIColor.clear) tabbar.shadowImage = UIImage(color: ...iOS13之后不好使了,改...
  • iOS13相关变化及适配

    千次阅读 2019-10-16 19:24:43
    文章目录一、 iOS 13 支持的机型二、 适配要求三、具体适配清单1、 Dark Mode2、Sign In with Apple3、模态弹出视图的显示问题...iOS13以后将不再继续支持UIWebView7、UISearchDisplayController被废弃8、 MPMoviePl...
  • ios13 h5 input上移

    千次阅读 2019-09-27 01:06:22
    ios12中文本框获取焦点弹出键盘,修改的body的scrollTop,ios13变成了修改html的scrollTop。真坑爹,1点多了,终于找到bug原因了。
  • iOS13适配之SceneDelegte

    千次阅读 2019-12-04 00:10:36
    老项目升级到了XCode11 + iOS13,但是通过第三方平台还是收集到了崩溃信息。以这个最为棘手: 崩溃时发生的异常: 崩溃调用栈: 0 CoreFoundation ___exceptionPreprocess + 220 1 libobjc.A.dylib objc_...
  • ios13怎么添加自定义字体

    万次阅读 2019-09-03 17:19:38
    随着ios13系统的正式版推送,很多用户已经开始升级了ios13系统,而在ios系统中新增了很多意外的功能,苹果竟然可以改字体了,那么ios13怎么添加自定义字体呢?下面就为大家带来ios13添加自定义字体的方法,一起来...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 145,238
精华内容 58,095
关键字:

ios13