使用 UIActivityViewController 发布以更正 Instagram 帐户

Posting to correct Instagram Account with UIActivityViewController

我正在使用 UIActivityViewController 到 post 图像从我的应用程序到 Instagram 应用程序。

请注意我的应用不使用 Instagram API 或登录用户的 Instagram 帐户。

let sharingImage = button.backgroundImage(for: [])
let avc = UIActivityViewController(activityItems: [sharingImage as AnyObject], applicationActivities: nil)

avc.excludedActivityTypes = [.addToReadingList,.airDrop,.assignToContact,.copyToPasteboard,.openInIBooks,.postToFacebook,.postToFlickr,.postToTencentWeibo,.postToTwitter,.postToVimeo,.postToWeibo,.saveToCameraRoll,.message,.mail,.print]
if let wPPC = avc.popoverPresentationController {
    wPPC.sourceView = followUsButton
}
self.present(avc, animated: true, completion: nil)

我使用多个帐户登录我的 Instagram 应用程序。从我的应用程序分享后,Instagram 会尝试 post 到当前登录的帐户 'A'(在 Instagram 应用程序内)。这是有道理的。

但是,如果我现在切换到 Instagram 应用程序并切换到其中的帐户 'B',返回到我的应用程序然后再次尝试分享,它会继续尝试 post帐户 'A'.

修复它的唯一方法是终止我的应用程序并重新启动它,然后它加载正确的当前登录帐户 'B'。

有没有办法在共享时以编程方式重新加载正确的 Insta 帐户?

简答,我怀疑。

UIActivityViewController 不能让您控制用户的登录状态(这就是使用起来很有趣的原因)。 IMO,这是苹果方面的一个错误。因此,除非有一种秘密方法可以清除 iOS 运行时存储在您的应用程序内存中的授权令牌,否则我看不出您怎么可能实现您想要的。

此外,如果照片应用程序具有相同的行为,那不是一个好兆头...

以防万一,你说切换账号时出现问题,你的意思是

  1. 在我的应用程序中,您立即尝试从同一个 ViewController?
  2. post
  3. 您移动到父视图(因此破坏了旧视图)返回,然后移动到与 1/?
  4. 相同的视图

两种情况的结果一样吗?我问是因为在新视图中实例化新的 UIActivityViewController 时,运行时可能会获取新的用户登录配置文件,而如果您从用于从旧帐户 post 的相同视图中实例化它,它可能不会这样做(因此它将使用旧登录名)

这是一个 iOS 问题,并非您的应用所特有。

这只是一种解决方法,但可能是您目前唯一的选择,因为您会发现即使是原生照片也有同样的问题,因此需要由 Apple 来解决。

在您的应用程序 Info.plist 中,添加值为 YES 的布尔键 UIApplicationExitsOnSuspend。有关详细信息,请参阅 Information Property List Key Reference

通过这种方式,应用程序在进入后台状态时会被终止,一旦您返回它,它就会重新加载。用户可能不会注意到差异。

也许在终止应用程序之前,您可以在以下位置添加一些界面状态保存功能:

 optional func applicationWillTerminate(_ application: UIApplication)

我不知道你的应用程序是如何布局的,但你可以创建一个单例 class,它可以实现 Codable 并继续跟踪所有具有保存和加载功能的应用程序状态变量。应用程序启动时终止和加载时将触发保存。

希望对您有所帮助。

EDIT1:应该在 iOS 13 中工作 下面这段代码应该可以工作并终止您的应用程序,但不推荐这样做,并且您在上传到 AppStore 时可能会遇到问题。我想您可以通过解释他们在 SDK 中存在错误并指出问题所在来向 Apple 审核团队提出质疑。

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
    UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
     DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
      exit(0)
     }
}