小编And*_*huk的帖子

如何从UIActivityViewController中排除Notes和Reminders应用程序?

我创建UIActivityViewController并通过StringURL它.这显然是配置UIActivityViewController使用我想要排除的一些项目(我的目标是分享有关我的应用程序的信息).

我设法通过设置适当的方法排除了许多系统提供的活动(如"添加到阅读列表")excludedActivityTypes.

但是,我无法排除提醒和Notes应用程序.有人可以建议一种方法吗?这些应用程序在列表中显示第3和第4,因此除非用户滚动,否则Twitter和Facebook不可见.

cocoa-touch ios uiactivity uiactivityviewcontroller

53
推荐指数
5
解决办法
2万
查看次数

对于华为的系统文件,"源代码与字节码不匹配"

我们正在调试一个仅影响华为设备的应用程序的问题.为了调试它,我们购买了P20 Lite ANE-LX1.我们在代码中放置了一些断点,并正在研究完整的堆栈跟踪.该设备已安装Android 8.0,我们在Android Studio中下载了相同的SDK.

当我们将设备连接到调试器并尝试调查堆栈跟踪时,我们在系统源文件中收到以下错误:

在此输入图像描述

在使用堆栈跟踪后,我们可以确认我们的源文件确实与设备上安装的文件不对应.有时,调试器指向一个functionA被调用的行,在堆栈跟踪中,我们看到functionB调用它.我们可以确认的文件受此问题的影响是:

  1. VideoView,
  2. MediaPlayer,
  3. ContentProvider.

我们已经尝试了所有可能的解决方案,包括清理项目,从Android Studio删除任何其他SDK,修改项目设置 - 没有任何问题有助于解决此问题.

这让我们相信华为在他们的设备上安装了修改版的Android 8.0,这就是为什么我们无法调试系统文件的堆栈跟踪.我们确实与华为联系,试图澄清这一点.

与此同时,如果您能向我们提出任何相关的想法,我们将不胜感激.也许您知道在哪里可以获取华为在其设备上安装的源文件?或许您知道如何以其他方式解决源代码和字节码之间的这种不匹配问题?

更新1

按照Robert的建议,我卸载了Android 26的源代码并在我的华为上再次运行应用程序.我一进入VideoView文件,就看到以下图片:

在此输入图像描述

我点击"下载",它开始下载源文件:

在此输入图像描述

在此之后,我能够介入VideoView,似乎工作正常.然而,在这一行之后,很明显这些源文件也是错误的:

在此输入图像描述

当我尝试进入该requestLayout功能时,我得到了这个:

在此输入图像描述

这显然是一个错误的结果.事实上,如果我点击"Step to the next line",我会再次看到有关源代码与字节码不匹配的消息.

java android android-studio huawei android-8.0-oreo

17
推荐指数
1
解决办法
1962
查看次数

当城市名称等于某个国家/地区的名称时,CLGeocoder会返回错误的结果(而不仅仅是)

在我的一个应用程序中,我需要添加一个按名称查找城市的功能.我正在使用它CLGeocoder来实现这一点,我希望它具有与iOS天气应用程序相同的行为.

以下是我的代码:

CLGeocoder().geocodeAddressString(searchBar.text!, completionHandler:{ (placemarks, error) -> Void in
    guard let nonNilMarks = placemarks else {return}
    for placemark in nonNilMarks {
        print("locality: \(placemark.locality)")
        print("name: \(placemark.name)")
        print("country: \(placemark.country)")
        print("formatted address: \(placemark.addressDictionary)")
    }
})
Run Code Online (Sandbox Code Playgroud)

它在大多数情况下都能很好地工作.但是,我最近注意到一些失败的情况.以下是一些示例的输出:

寻找'米兰' - 工作

locality: Optional("Milan")
name: Optional("Milan")
country: Optional("Italy")
formatted address: Optional([SubAdministrativeArea: Milan, State: Lombardy, CountryCode: IT, Country: Italy, Name: Milan, FormattedAddressLines: (
    Milan,
    Italy
), City: Milan])
Run Code Online (Sandbox Code Playgroud)

这是正确的输出

寻找'意大利,德克萨斯州' - 工作

德克萨斯州有一个叫意大利的小镇.如果我键入'Italy,TX',则输出为:

locality: Optional("Italy")
name: Optional("Italy")
country: Optional("United States")
formatted address: Optional([SubAdministrativeArea: Ellis, State: …
Run Code Online (Sandbox Code Playgroud)

objective-c ios clgeocoder swift swift2

16
推荐指数
1
解决办法
3423
查看次数

Swift元组到可选赋值

我正在Swift中编写一些代码来学习语言.这是我的基类:

import Foundation
class BaseCommand:NSOperation
{
    var status:Int? = nil
    var message:String? = nil

    func buildRequest() -> NSData?
    {
        return nil
    }

    func parseResponse(data:NSData?) -> (Status:Int, Error:String)
    {
        return (200, "Success")
    }

    override func main() {
        let requestBody = self.buildRequest()

        println("Sending body \(requestBody)")
        // do network op
        var networkResultBody = "test"

        var resultBody:NSData = networkResultBody.dataUsingEncoding(NSUTF8StringEncoding)!
        (self.status, self.message) = self.parseResponse(resultBody)
    }
}
Run Code Online (Sandbox Code Playgroud)

问题出在最后一行:

(self.status, self.message) = self.parseResponse(resultBody)
Run Code Online (Sandbox Code Playgroud)

编译器说"无法将元组转换(状态:Int,错误:字符串)表示为(Int?,String?)"

我知道问题是self.status和self.message是可选项,而parseResponse不返回Optionals(我不想要它).如何告诉它进行必要的分配和转换以将数据导入实例变量?

tuples optional ios swift

13
推荐指数
1
解决办法
1728
查看次数

在Swift中扩展通用整数类型

所以我试图用一些方便的函数来扩展Swift的整数类型,但是我还不清楚我应该扩展哪些协议.

作为一个例子,假设我想实现一个用于钳位值的函数(如果它小于最小值,则将其设置为该值,否则如果它大于最大值则将其设置为该值).我的第一个想法是做这样的事情:

extension Int {
    func clamp(minimum:Int, maximum:Int) {
        if self < minimum { return minimum }
        if self > maximum { return maximum }
        return self
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个简单的例子,但它说明了问题; 如果我现在想要调用它,UInt那么我自然也不能,所以我必须添加一个等价物UInt,但这对于UInt16等等不适用.

我认为我可以在链上向上扩展一些东西,然后使用泛型,但是IntegerType似乎无法扩展协议.

那么,是否有更合适的地方可以放置我的扩展程序?

protocols swift swift2 protocol-extension

9
推荐指数
2
解决办法
1894
查看次数

如何在目标c中使用泛型类的swift类

我有以下带有NumericType T的swift类.

@objc class MathStatistics<T: NumericType> : NSObject {
        var numbers = [T]()

        func sum() -> T? {
            if numbers.count == 0 {
                return nil
            }

            var sum = T(0)

            for value in numbers {
                sum = sum + value
            }
            return sum
        }
    }
Run Code Online (Sandbox Code Playgroud)

在swift中,初始化类对象如下:

let statistics = MathStatistics<Double>()
Run Code Online (Sandbox Code Playgroud)

如何在Objective C中初始化相同的对象?以下行未设置数字类型T.

MathStatistics *stats = [[MathStatistics alloc] init];
Run Code Online (Sandbox Code Playgroud)

generics objective-c swift

8
推荐指数
1
解决办法
3518
查看次数

核心数据实体新属性 - 是否需要新模型版本

我有一个非常简单的问题,涉及轻量级迁移和核心数据版本控制的使用。

众所周知,在修改 Core Data 模型时,需要确保可以从旧模型转换到新模型。

对于简单的更改(例如添加新属性),只需轻量级迁移即可。网上有很多信息表明,为了确保一切顺利,需要:

  1. 创建新模型版本
  2. 进行必要的修改
  3. 将修改后的版本指定为新的当前版本
  4. 通过以下选项支持轻量级迁移:

    让选项 = [NSMigratePersistentStoresAutomaticallyOption:true,NSInferMappingModelAutomaticallyOption:true]

这种方法肯定效果很好。然而,我还发现,对于简单的更改,不需要新的模型版本。在我的一个应用程序中,我已经发布了几项更新,其中包括对核心数据模型的更改(所有这些更新都包含新属性的添加),并且在没有任何新模型版本的情况下成功应用了轻量级迁移。

根据我的经验,当修改核心数据版本时,它似乎会被分配某种新的标识符。然后,当该版本在具有该型号旧版本的手机上启动时,进行轻量级迁移不会出现任何简单更改的问题。

然而,鉴于每个教程都建议创建一个新的模型版本,有人可以告诉我是否错过了我的方法会导致崩溃的某些场景?

core-data objective-c ios swift

8
推荐指数
1
解决办法
1480
查看次数

Firestore 集合侦听器读取大量内容

我正在我的一个应用程序中实现 Firestore 数据存储。

我有一个监听器,它跟踪“日志”集合中的更新,如下所示:

db.collection("logs").addSnapshotListener({ (snapshot, error) in
    guard let s = snapshot else {return}
    if s.metadata.isFromCache {
        print("LOG_C \(s.documentChanges.count)")
            return
    }
    print("LOG \(s.documentChanges.count)")
    // other code
})
Run Code Online (Sandbox Code Playgroud)

在测试期间,我一直在将文档上传到此集合,然后通过 Firebase 控制台删除了所有文档。所以,现在,我的测试用户不存在该集合。当我第一次启动应用程序时,我确实看到这个集合是空的——监听器报告了正确的结果。

但是,这样做会消耗大约 1000 次读取。几乎感觉就像是在为我的测试用户下载此集合的所有历史记录(例如,插入了 500 个文档,删除了 500 个文档)。但是,即使是这样,它也不会向我报告——我在控制台中只收到一条“LOG 0”消息。

这是集合侦听器的工作方式吗?我确实知道侦听器下载初始状态,但我认为它将是当前快照,在这种情况下,它将消耗 1 次读取以确定最初没有任何返回。

欢迎任何解释/想法/建议。

我非常想通过查看详细的 Firestore 读取日志来调试它。但是,我在控制台中找不到这样的选项:(

firebase swift google-cloud-firestore

6
推荐指数
1
解决办法
1552
查看次数

从 Google Play 获取付费应用的购买令牌

我们需要将有关应用购买的信息与我们服务器上的用户相关联。对于应用内产品,这很容易做到,因为我们可以收到购买令牌。

如何为直接从 Google Play 下载的付费应用实现相同的功能?我们无法找到一种方法来接收订单 ID 或购买令牌以记录在我们的服务器上。

android in-app-purchase google-play android-app-licensing

6
推荐指数
1
解决办法
957
查看次数

暂停/恢复时实时AVAssetWriter同步音频和视频

我正在尝试使用 iPhone 的前置摄像头录制有声视频。由于我还需要支持暂停/恢复功能,因此我需要使用AVAssetWriter. 我在网上找到了一个用 Objective-C 编写的示例,它几乎实现了所需的功能(http://www.gdcl.co.uk/2013/02/20/iPhone-Pause.html

不幸的是,在将此示例转换为 Swift 后,我​​注意到如果我暂停/恢复,在每个“部分”的末尾都会有一个小但明显的时间段,在此期间视频只是一个静止帧并且正在播放音频。所以,似乎当isPaused触发时,录制的音轨比录制的视频轨长。

抱歉,如果这看起来像是一个菜鸟问题,但我不是这方面的专家,AVFoundation如果能提供一些帮助,我们将不胜感激!

下面我发布我的实现didOutput sampleBuffer

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    var isVideo = true
    if videoConntection != connection {
        isVideo = false
    }
    if (!isCapturing || isPaused) {
        return
    }

    if (encoder == nil) {
        if isVideo {
            return
        }
        if let fmt = CMSampleBufferGetFormatDescription(sampleBuffer) {
            let desc = CMAudioFormatDescriptionGetStreamBasicDescription(fmt as CMAudioFormatDescription)
            if let chan = desc?.pointee.mChannelsPerFrame, …
Run Code Online (Sandbox Code Playgroud)

avfoundation ios avassetwriter cmsamplebuffer swift

6
推荐指数
1
解决办法
1906
查看次数