我在我的 iOS 应用程序中使用 Alamofire。我在 viewWillAppear 和 AppDelegate 中使用 bool 值和 NSNotifications 来检查是否有互联网连接。如果没有 wifi 连接,则会出现一个弹出窗口以通知用户。如果有 wifi 连接,弹出窗口就会消失,一切正常。只要wifi显然无法正常工作,我就没有问题。
我正在参加一个聚会,有人向我解释说它的工作方式是它寻找 wifi 连接而不是互联网连接。例如。如果我有一个 wifi 路由器并且它已插入但路由器未连接到互联网 Alamofire 会将此视为成功连接,因为它实际上正在连接到 wifi 虽然它不知道 wifi 无法连接到互联网.
我只是在连接到开放网络的情况下,我的应用程序最初的响应好像我真的连接到了互联网(没有弹出窗口),但我无法连接到任何东西。wifi信号全开。在终端中,我运行了 ping,结果发现连接已死。我的应用程序无法区分。
在这样的情况下,如何让弹出窗口出现?
还有什么是 .case unknown ?
Alamofire.Swift:
import Foundation
import Alamofire
open class NetworkManager {
open static var sharedManager: NetworkReachabilityManager = {
let reachabilityManager = NetworkReachabilityManager()
reachabilityManager?.listener = { (status) in
switch status {
case .notReachable:
print("The network is not reachable")
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "unsuccessful"), object: nil)
case .unknown : //???????
print("It is …Run Code Online (Sandbox Code Playgroud) 我刚刚将Firebase Cocoapods从3.15.0升级到4.0.4,将FirebaseAuth Cocoapods从3.1.1升级到4.0.0.
我正在使用电子邮件和密码来验证用户身份.当用户更改他们的电子邮件时,我在下面使用此方法,一切正常:
FIREmailPasswordAuthProviderID.credential(withEmail: emailTextField.text!, password: passwordTextField.text!)
Run Code Online (Sandbox Code Playgroud)
现在我更新了我收到错误消息
"String"类型的值没有成员"凭证"
我查看了文档,并说它使用以下方法:
问题是我得到了同样的错误:
FIREmailAuthProviderID.credential(withEmail: emailTextField.text!, password: passwordTextField.text!)
Run Code Online (Sandbox Code Playgroud)
"String"类型的值没有成员"凭证"
我的原始代码如下
import Firebase
import FirebaseAuth
let user: User?
let credential = FIREmailPasswordAuthProviderID.credential(withEmail: emailTextField.text!, password: passwordTextField.text!)
if let user = user{
user.reauthenticate(with: credential, completion: {
(error) in
if error != nil{
//...do something
return
}
//...do something else
})
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我正在使用ARVideoKit来录制屏幕(ReplayKit 对此不起作用),有时我可以毫无问题地录制和保存。其他时候我记录,当我去保存时,我会崩溃:
** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“*** -[AVAssetWriterInput appendSampleBuffer:] 无法追加示例缓冲区:必须先启动会话(使用 -[AVAssetWriter startSessionAtSourceTime:)”
查看 StackTrace 它是一个__pthread__kill,它发生在thread 83:
具体在此DispatchQueue:
let audioBufferQueue = DispatchQueue(label: "com.ahmedbekhit.AudioBufferQueue")
我怎样才能防止这种情况发生?
这是文件中的代码:
import AVFoundation
import CoreImage
import UIKit
@available(iOS 11.0, *)
class WritAR: NSObject, AVCaptureAudioDataOutputSampleBufferDelegate {
private var assetWriter: AVAssetWriter!
private var videoInput: AVAssetWriterInput!
private var audioInput: AVAssetWriterInput!
private var session: AVCaptureSession!
private var pixelBufferInput: AVAssetWriterInputPixelBufferAdaptor!
private var videoOutputSettings: Dictionary<String, AnyObject>!
private var audioSettings: [String: Any]?
let audioBufferQueue = DispatchQueue(label: "com.ahmedbekhit.AudioBufferQueue")
private var …Run Code Online (Sandbox Code Playgroud) 我使用的是 Swift 3、iOS 10.3 和 Xcode 8.3.3。
当我访问模拟器上的照片库时,UIImagePicker 没有问题,我可以选择照片。一旦我尝试在实际设备(iPhone 7+)上访问照片库,应用程序就会崩溃,因为 UIImagePicker 不会被呈现(我什至没有到选择照片的地步)。奇怪的是在实际设备上,imagePicker 展示了相机,我可以毫无问题地拍照。
尽管我没有在这个问题中添加它,但在我的实际代码中,我运行了 api 权限。在我的实际代码中,我使用了它们并将它们注释掉,但问题仍然存在:
import AVFoundation
//there is way more code then this I just put these here to show that I'm using them
PHPhotoLibrary.authorizationStatus()
PHPhotoLibrary.requestAuthorization()
AVCaptureDevice.authorizationStatus(forMediaType: ...)
AVCaptureDevice.requestAccess(forMediaType: ...)
Run Code Online (Sandbox Code Playgroud)
更新:我仍然没有解决这个问题,但我已经找到了更多信息。我一直在玩这个应用程序,崩溃后我再次尝试了这个应用程序,它让我可以访问图书馆。我意识到只要 Xcode 未运行,该应用程序就可以让我访问手机上的库。一旦我将手机重新插入 Xcode 并尝试再次访问库,我就会崩溃。我不知道该怎么办。
只要 Xcode 未连接到设备,我就可以成功地从 libary 获取照片。使用模拟器,我可以毫无问题地获取照片。由于设备未连接到 Xcode,我可以获得照片。但是,一旦设备和 Xcode 连接,我就会崩溃。我已经尝试以 3 种不同的方式初始化 UIImagePicker(如下所述),以查看它们中的任何一个是否会改变结果,但结果始终相同。我的应用程序有 100 多个类和 50 个 vc,也许问题发生在其他地方。但是,如果它发生在其他地方,那么当 Xcode 也没有连接到设备时它应该会崩溃。
在使用 UIImagepicker 的类中,我注释掉了所有不必要的代码,只关注库和相机按钮。一旦设备和 Xcode 交织在一起,就会发生崩溃。好消息是,一旦他们没有连接,我就可以访问库,这样用户就不会遇到问题,因为他们永远不会让 Xcode 与我的应用程序一起运行。
需要注意的是,当设备和Xcode连接起来时,我可以使用相机并成功拍照。问题似乎被监管到图书馆。
我已经多次看到这个问题,但答案总是
“必须设置 info.plist …
我在我的应用程序的登录页面上循环播放视频.我按照这个Youtube教程让它在视图控制器中运行循环视频
问题是当应用程序进入后台时,如果我不立即回来,当我回来时,视频会被冻结.
根据应该发生的Apple Docs.
我试图使用NotificationCenter,Notification.Name.UIApplicationWillResignActive但是没有用.
应用程序从后台返回后,如何让视频继续播放?
var player: AVPlayer!
var playerLayer: AVPlayerLayer!
override func viewDidLoad() {
super.viewDidLoad()
configurePlayer()
}
@objc fileprivate func configurePlayer(){
let url = Bundle.main.url(forResource: "myVideo", withExtension: ".mov")
player = AVPlayer.init(url: url!)
playerLayer = AVPlayerLayer(player: player!)
playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
playerLayer.frame = view.layer.frame
player.actionAtItemEnd = AVPlayerActionAtItemEnd.none
player.play()
view.layer.insertSublayer(playerLayer, at: 0)
NotificationCenter.default.addObserver(self, selector: #selector(playerItemReachedEnd), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem)
NotificationCenter.default.addObserver(self, selector: #selector(playerItemReachedEnd), name: Notification.Name.UIApplicationWillResignActive, object: player.currentItem)
}
@objc fileprivate func playerItemReachedEnd(){
player.seek(to: kCMTimeZero)
}
Run Code Online (Sandbox Code Playgroud) 我正在使用AVPlayer播放视频URL。我按照苹果的代码播放视频并处理错误:
在“ 响应状态更改 ”部分中,有一个带有.failed案例的switch语句,注释掉的代码说:// Player item failed. See error.我在此放置了一个断点,使它运行了几次。
问题是我看不到任何NSError类型的变量,它可以让我选择实际打印出错误的类型。我如何找出.failed错误是什么?
观察玩家的状态:
let url: URL = // Asset URL
var asset: AVAsset!
var player: AVPlayer!
var playerItem: AVPlayerItem!
// Key-value observing context
private var playerItemContext = 0
let requiredAssetKeys = [
"playable",
"hasProtectedContent"
]
func prepareToPlay() {
// Create the asset to play
asset = AVAsset(url: url)
// Create a new AVPlayerItem with the asset and an
// array of asset keys …Run Code Online (Sandbox Code Playgroud) 我循环遍历几个Urls,将它们转换为Data,然后将数据发送到Firebase Storage,然后在一切完成后将收集到的信息发送到Firebase Database
我使用 DispatchGroup().enter()来启动循环,一旦我将数据发送到 Storage 并获得absoluteString我.leave()用来开始下一次迭代的值 url 字符串。
我意识到在循环过程中,有几个点可能会发生错误:
UrlSession.putData功能.downloadURL(completion:...完成处理程序?.absoluteString为 nil如果我在其中任何一点出现错误,我会显示一个警报功能showAlert(),显示警报并取消 UrlSession 与session.invalidateAndCancel(). 我取消了一切,因为我希望用户重新开始。
由于 DispatchGroup() 挂在 处.enter(),如何取消 DispatchGroup() 以停止循环?
var urls = [URL]()
var picUUID = UUID().uuidString
var dict = [String:Any]()
let session = URLSession.shared
let myGroup = DispatchGroup()
var count = 0 …Run Code Online (Sandbox Code Playgroud) 我有一个标签,它使用 NSMutableAttributedString 将文本写为:
我想要做的是降低星号的顶部填充,以便它的 midY 与下面的 Cuisine 一词一致:
如何使用 NSMutableAttributedString 添加填充?
我知道我可以单独使用星号创建一个单独的标签,并使用带有常量的锚点将其居中,但我想看看使用 NSMutableAttributedString 是如何实现的
let cuisineLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
let attributedText = NSMutableAttributedString(string: "Cuisine ", attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 17), NSAttributedStringKey.foregroundColor: UIColor.lightGray])
attributedText.append(NSAttributedString(string: "*", attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 24), NSAttributedStringKey.foregroundColor: UIColor.red]))
label.attributedText = attributedText
return label
}()
Run Code Online (Sandbox Code Playgroud) 使用电子邮件登录新用户或创建新用户时有 2 种不同的方法签名。创建新用户时,如果电子邮件已存在,将返回错误;如果电子邮件不存在,则登录用户将返回错误:
// create account
Auth.auth().createUser(withEmail: emailTextField.text!, password: passwordTextField.text!, completion: { (authDataResult, error)
if let error = error {
// if this email address already exists an error will be returned
return
}
})
// login
Auth.auth().signIn(withEmail: emailTextField.text!, password: self.passwordTextField.text!, completion: { (authDataResult, error) in
if let error = error {
// if this email address isn't inside the system then an error will be returned
return
}
})
Run Code Online (Sandbox Code Playgroud)
但是,当使用用户的电话号码登录或创建新帐户时,我必须在这两种情况下使用相同的方法签名。
func loginExistingUserOrCreateNewOne(phoneNumber: String, verificationCode: String) {
PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate: nil) …Run Code Online (Sandbox Code Playgroud) ios firebase swift firebase-authentication firebase-realtime-database
我有一个标签,当按下按钮时它会被隐藏.经过一段时间,如60秒,我希望标签重新出现.我假设我在viewDidAppear中这样做,我该怎么做?
@IBOutlet weak var myLabel: UILabel!
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
//after 60 secs myLabel should reappear
//self.myLabel.isHidden = false
}
@IBAction func buttonTapped(_ sender: UIButton){
self.myLabel.isHidden = true
}
Run Code Online (Sandbox Code Playgroud) ios ×10
swift ×9
firebase ×2
alamofire ×1
avfoundation ×1
avplayer ×1
avplayeritem ×1
credentials ×1
hiddenfield ×1
loops ×1
networking ×1
padding ×1
photolibrary ×1
reachability ×1
timer ×1
uilabel ×1
xcode ×1