小编Hél*_*tin的帖子

在Swift中使用HTML中的图像生成PDF而不显示打印界面

我在我的Swift应用程序中从一些HTML 生成PDF .我使用a UIMarkupTextPrintFormatter并且具有与此要点类似的代码.我得到PDF NSData并将其附加到电子邮件中.在附加之前,应用程序不会向用户显示PDF.

我现在想要包含一些图像.NSURL使用我当前的PDF生成策略添加HTML不起作用.如何NSData添加与我的HTML相对应的PDF并添加图像?以下是我尝试过的一些事情:

  1. 这个答案建议在HTML中嵌入base64图像并使用UIPrintInteractionController.这确实为我提供了正确嵌入图像的打印预览,但是如何从那里到NSData相应的PDF输出?

  2. 我已经看到了一些类似的建议,UIWebView但是那些导致了同样的问题 - 我不想向用户展示预览.

pdf ios swift

30
推荐指数
4
解决办法
9254
查看次数

MPNowPlayingInfoCenter nowPlayingInfo在轨道末尾不更新

我有一个方法可以改变我的应用程序播放的音轨,AVPlayer并设置MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo新的音轨:

func setTrackNumber(trackNum: Int) {
    self.trackNum = trackNum
    player.replaceCurrentItemWithPlayerItem(tracks[trackNum])

    var nowPlayingInfo: [String: AnyObject] = [ : ]        
    nowPlayingInfo[MPMediaItemPropertyAlbumTitle] = tracks[trackNum].albumTitle
    nowPlayingInfo[MPMediaItemPropertyTitle] = "Track \(trackNum)"
    ...
    MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo = nowPlayingInfo 

    print("Now playing local: \(nowPlayingInfo)")
    print("Now playing lock screen: \(MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo)")   
}
Run Code Online (Sandbox Code Playgroud)

当用户明确选择专辑或曲目并且曲目结束并且下一曲目自动开始时,我会调用此方法.锁定屏幕在用户设置专辑或曲目时正确显示曲目元数据,但在曲目结束且自动设置下一曲目时不正确.

我添加了print语句以确保我正确填充nowPlayingInfo字典.正如所料,当调用此方法进行用户启动的专辑或曲目更改时,两个打印语句会打印相同的字典内容.但是,在自动跟踪更改后调用方法的情况下,局部nowPlayingInfo变量显示新的,trackNumMPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo显示前一个trackNum:

Now playing local: ["title": Track 9, "albumTitle": Test Album, ...]
Now playing set: Optional(["title": Track 8, "albumTitle": Test Album, ...]
Run Code Online (Sandbox Code Playgroud)

我发现,当我设置就行了断点,设置MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfonowPlayingInfo,然后曲目编号正确更新锁屏上.sleep(1) …

ios mpnowplayinginfocenter swift

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

将一个单元格固定在右侧的水平UICollectionView中

我正在实现一个控件,其行为类似于NSTokenField(例如,Mail中的地址选择器),以便在iOS中使用.我使用横向UICollectionView,我最右边的单元格是UITextField.此控件将以包含右对齐文本的其他文本字段的形式显示.为了让我的新控件在这个上下文中看起来正确,我希望UITextField始终位于它的右边缘,UICollectionView并且选定的标签显示在它的左侧.

目前,当我第一次点击此行时,文本字段向左滚动,然后在添加更多标签时将其推到右侧.一旦它与右边缘齐平UICollectionView(当下图中添加'开胃菜')时,我开始得到我想要的行为.

标签选择

我一直在考虑类似于最小宽度的东西,UITextField因此它占用的宽度与最初可用的宽度相同,并且随着标签的添加越来越少.或者,通过某种方式将固定字段固定到右侧.但是,我还没有找到实现这些想法的方法!

我怎样才能使文本字段始终位于右侧UICollectionView

ios uicollectionview swift

11
推荐指数
2
解决办法
430
查看次数

大文件下载到Documents并备份到iCloud

我在应用程序商店中有一个iOS应用程序,可以下载需要留在设备上以供离线使用的相对较大的文件.这些文件当前存储在应用程序的Documents文件夹中,但我现在正在阅读该Documents文件夹已备份,并且实际上只应用于用户生成的内容.此Apple技术问答表明NSURLIsExcludedFromBackupKey应该设置为防止备份.表明应用程序/Library/Caches是放置这些类型文件的正确位置,尽管进一步阅读表明当设备存储空间不足时可以清除该文件夹,这对于此应用程序是不可接受的.我认为那/Library/Application Support/是他们最好的位置 - 听起来不错吗?

不幸的是,这个错误通过了应用审核流程.现在人们正在使用应用程序并且已经有一些文件持久保存到Documents文件夹和备份中,有哪些最佳实践可以解决这个问题?我似乎需要移动所有现有文件并设置他们NSURLIsExcludedFromBackupKey的应用程序更新.我如何保证这一次完成并且不会中断?是将文件移出Documents文件夹重要还是我可以将它们留在那里?更改文件的备份状态是否会将其从现有备份中删除?

我使用的是Swift 2.1.1,目标是iOS 8.0+.

ios

7
推荐指数
1
解决办法
247
查看次数

Realm Swift:总是将nil值排在最后

我正在使用面向iOS 8并使用Realm的Swift 2.2编写应用程序.我允许用户使用各种可选属性对对象进行排序Results.sorted(_:ascending:).这对于降序排序非常有效,但对于升序排序,nil首先放置的值看起来不正确.许多数据库系统都有一个NULLS FIRST/LAST选项和CoreData,它看起来可能是子类NSSortDescriptor.nil在Realm中排序时,有没有办法始终将值放在最后?即使只有一个hacky策略,也会受到赞赏.

realm swift

7
推荐指数
1
解决办法
975
查看次数

SQLite数据库迁移似乎仅部分应用于Espresso测试

我们有一个SQLite数据库和一个对应的SQLiteOpenHelper子类。这个助手有一个onDowngrade我想为其编写Espresso测试的实现。

完整的onDowngrade实现在这里可用。这是它的简化版本:

@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("CREATE TABLE IF NOT EXISTS foo_tmp (_id integer primary key, bar text not null, baz text not null);");
    db.execSQL("INSERT INTO foo_tmp(_id,bar,baz) SELECT _id,bar,baz FROM foo;");
    db.execSQL("DROP TABLE IF EXISTS foo;");
    db.execSQL("RENAME TABLE foo_tmp TO foo;");
}
Run Code Online (Sandbox Code Playgroud)

该测试将加载具有很高版本号以及已添加或已删除列的数据库转储。然后,它将获得一个可读的数据库,并确保该版本已降级为当前的预期版本,并且列名是预期的列名。完整的资源在这里。看起来是这样的:

@Test
public void testMigration() throws IOException {
    writeDatabaseFile("database" + File.separator + dbFilename);
    InstancesDatabaseHelper databaseHelper = new InstancesDatabaseHelper();

    SQLiteDatabase db = databaseHelper.getReadableDatabase(); …
Run Code Online (Sandbox Code Playgroud)

android sqliteopenhelper android-sqlite android-espresso

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

升级 Play 商店和自行发布的通用 APK 的签名密钥有哪些选项?

我是 Android 应用程序的维护者之一,该应用程序自 2008 年以来一直在开发。我们目前管理自己的发布密钥,并且希望开始使用新的、更安全的密钥。我们的用户通常从 Play 商店安装,但有些需要通用 APK,我们希望继续发布。我们希望这些与 Play 商店安装/更新兼容,并且我们希望每个版本发布一个(即不是使用新旧密钥签名的两个)。我们的应用程序当前使用v1 和 v2 方案进行签名。

\n

据我了解,我们有以下选择:

\n
    \n
  1. 继续管理我们自己的密钥。生成新的现代密钥。在两个键之间创建旋转沿袭。发布时,使用旧密钥、新密钥以及使用v3 方案的沿袭文件进行签名。将其上传到 Play 商店并作为自行发布的通用 APK。

    \n
  2. \n
  3. 选择应用程序签名并上传旧密钥。请求新安装的密钥升级(可能会也可能不会被授予)。在本地生成新的现代密钥。上传该密钥作为更新后的密钥。在 Play 商店中,新密钥将用于新安装,旧密钥将用于现有安装。对于自行发布的通用 APK,我们可以在两个密钥之间创建一个旋转谱系并用它进行签名。

    \n
  4. \n
  5. 选择应用程序签名并上传旧密钥。升级 Android 13+ 的签名密钥。在本地生成新的现代密钥。上传该密钥作为更新后的密钥。在 Play 商店中,Android 13+ 设备将获得使用新密钥签名的安装和更新,所有其他设备将获得使用旧密钥签名的安装和更新。从自行发布的通用 APK 中,我们可以在两个密钥之间创建一个旋转谱系并用它进行签名。

    \n
  6. \n
\n

在理想的情况下,我们可以注册应用程序签名,让 Google 管理签名并下载单个通用 APK 进行共享。这两种路径都适用于升级所有 Android 版本(我们支持低至 Android 5.1)上的现有安装(旧密钥)。我的理解是,这是不可能的,因为应用程序签名不使用 v3 签名方案或任何其他标准来建立新旧密钥之间的关系。我可以在2020 年 5 月关于应用签名的开发相关文章中找到这方面的最新信息:

\n
\n

当前的密钥升级过程未利用 Android 9 (Pie) 及更高版本中引入的密钥轮换功能。我们目前正在研究对这些操作系统版本上的设备使用应用程序签名 v3 进行密钥轮换的支持,一旦准备就绪,我们将在单独的公告中通知开发人员社区。

\n
\n

我找不到相关的公告或文档。

\n …

android apk google-play-console

5
推荐指数
1
解决办法
762
查看次数

gradle和robolectric升级后的资源$ NotFoundException google_play_services_version

我正在尝试将项目更新为Gradle 3.0.1/gradle wrapper 4.1.过去运行的Robolectric测试现在在运行时失败./gradlew testDebugUnitTest:

android.content.res.Resources$NotFoundException: org.odk.collect.android:integer/google_play_services_version
    at org.robolectric.android.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:72)
    at org.robolectric.RobolectricTestRunner.beforeTest(RobolectricTestRunner.java:319)
    at org.robolectric.internal.SandboxTestRunner$2.evaluate(SandboxTestRunner.java:220)
    at org.robolectric.internal.SandboxTestRunner.runChild(SandboxTestRunner.java:108)
    at org.robolectric.internal.SandboxTestRunner.runChild(SandboxTestRunner.java:35)
Run Code Online (Sandbox Code Playgroud)
  • com.android.tools.build:gradle:3.0.1
  • org.robolectric.robolectric:3.5.1
  • 构建工具26.0.2
  • gradle wrapper 4.1

这是一个开源项目 - 此处提供了更新的配置.

它似乎没有关联,但为了以防万一 - 我们也开始看到pmdlint我们之前没有的错误.那些配置或版本没有改变.

我发现了以下可能相关的问题:

到目前为止,关于这些职位的任何建议都没有帮助.我已经阅读了gradle和robolectric的发行说明,但没有看到任何提示.知道哪个工具可能导致问题?还有什么别的我可以试试吗?

android gradle robolectric

3
推荐指数
1
解决办法
775
查看次数