2014-11-19 5 views
17

TLDR : iOS 앱과 확장 프로그램간에 실시간 메시지 또는 알림을 보낼 수 있습니까?확장 기능과 내선을 포함하는 iOS 앱 (호스트 앱 아님) 간의 통신 방법

같은 CoreData (SQLite 데이터베이스)를 공유하는 동일한 App Group의 일부인 확장 프로그램이있는 iOS 앱을 작성하고 있습니다. 앱에서 CoreData를 사용하여 데이터베이스에 읽고 쓸 수 있으며 확장 프로그램에서 동일한 콘텐츠를 공유합니다.

내 질문 : 필요한 경우 업데이트하도록 상대방에게 알리기 위해 앱과 확장 프로그램간에 메시지 또는 알림을 보낼 수 있습니까?

NSNotificationCenter을 통해 알림을 보냈지 만 해당 번호가 NSUserDefaults 인 공유자에게 편지를 보내고 NSUserDefaultsDidChangeNotification을 (를) 수신하면 App/Extension에서 동일한 문제가 발생하지 않습니다. 이것은 응용 프로그램 내부에서 작동하지만 확장 기능은 아무 것도받지 못합니다. (내가 실행 중이며 동일한 것을 공유하고있을 때 NSUserDefaults). 상황을 동기화하는 방법에 대해 알고 싶습니다.

답변

23

TLDR : 아니,하지만 해킹

또는 확장없이 iOS 앱에 대한 진정한 간 통신이 없다가있다. NSDistributedNotification은 여전히 ​​OS X에서 iOS 로의 여행을하지 않았으며 아마도 그렇지 않을 것입니다.

일부 확장 유형에서는 NSExtensionContext을 통해 URL을 열고 URL을 처리하는 앱에 데이터를 전달할 수 있습니다. 이것은 당신이 원하는 것처럼 들리지 않는 포 그라운드로 응용 프로그램을 가져옵니다.

필요한 것을 얻을 수있는 해킹이 있습니다.

  • 사용자 기본값을 쓰는 대신 앱 그룹 디렉토리의 파일에 기록하십시오.
  • 파일을 직접 작성하지 마십시오. NSFileCoordinator을 사용하여 을 조정하여을 파일에 기록합니다.
  • 는 파일의 변경에 대해 알고 싶어 객체에 NSFilePresenter를 구현하고, [NSFileCoordinator addFilePresenter:someObject]
  • 이 파일의 발표자 옵션 presentedItemDidChange 메소드를 구현 호출해야합니다.

이 모든 작업을 수행하면 앱이나 확장 프로그램에서이 파일에 쓸 수 있으며 다른 쪽에서는 presentedItemDidChange이 자동으로 호출됩니다. 보너스로 그 파일의 내용을 읽을 수 있으므로 임의의 데이터를 앞뒤로 전달할 수 있습니다.

+0

open() + 일부 플래그를 사용하여 파일 시스템 변경 사항을 보려고했는데 성공하지 못했습니다. 나는 NSFilePresenter에 대해 몰랐다. 덕분에 완벽하게 작동했습니다. –

+0

루 도빅 랜드 리 (Ludovic Landry), 성공에 대한 의사 소통을 어떻게 구현했는지 모범을 보여 주시겠습니까? 고마워요 –

+0

내 포함하는 응용 프로그램이 실행 (종료)되지 않은 경우'presentsItemDidChange'가 포함 된 응용 프로그램을 시작하거나 깨 웁니까? – marcelosalloum

3

애플은 확장자에 대한 파일 조정을 사용에 대해 조언 : 저도 같은 문제로 어려움을 겪고있다 그리고 중 깨끗한 해결책을 발견하지 않은 https://developer.apple.com/library/ios/technotes/tn2408/_index.html

+2

링크 된 기술 노트가 업데이트되었으며 iOS 8.2 이상을 타겟팅하는 경우 파일 조정을 사용하는 것이 좋습니다. –

+0

당신 말이 옳다는 것을 지적 해 주셔서 감사합니다. – JanApotheker

2

. 이 문제를 해결하는 또 다른 해킹 방법은 단순히 확장 프로그램에서 타이머를 실행하고 공유 컨테이너 환경 설정/데이터베이스의 값을 주기적으로 확인한 다음 필요에 따라 업데이트하는 것입니다. 우아하지 않지만 작동하는 것 같습니다.

호스트 응용 프로그램 및 앱 확장 사이의 범용 양방향 통신을 수행하는 대체 수단에 대한
5

, MMWormhole 시도 :

http://www.mutualmobile.com/posts/mmwormhole https://github.com/mutualmobile/MMWormhole

그것은 CFNotificationCenter 주위에 상당히 가벼운 래퍼,의와 "다윈를 사용 "프로세스 간 통신을위한 알림 (IPC).

앱의 공유 컨테이너를 사용하여 페이로드를 다시 & 번으로 전달하고 파일 자체를 만들지 않아도 캡슐화합니다.

클래스 (및 저장소의 샘플 앱)는 잘 작동하는 것처럼 보이며 반응이 좋습니다.

이 또한 도움이되기를 바랍니다.

1

iOS 또는 app과 확장 프로그램의 두 앱간에 통신하는 데 사용할 수있는 해킹이 있습니다. 유일한 이유는 Apple이 NetworkExtension에서 I/O를 차단하고 있기 때문에 NetworkExtension과 호환되지 않습니다.

당신은 DarwinNotificationCenter이 방법 알림을 게시 할 수 있습니다 : 앱에서

let notificationName = CFNotificationName("com.notification.name" as CFString) 
    let notificationCenter = CFNotificationCenterGetDarwinNotifyCenter() 

    CFNotificationCenterPostNotification(notificationCenter, notificationName, nil, nil, false) 

추가를 관찰자 :

let notificationName = "com.notification.name" as CFString 
    let notificationCenter = CFNotificationCenterGetDarwinNotifyCenter() 

    CFNotificationCenterAddObserver(notificationCenter, 
            nil, 
            { (
             center: CFNotificationCenter?, 
             observer: UnsafeMutableRawPointer?, 
             name: CFNotificationName?, 
             object: UnsafeRawPointer?, 
             userInfo: CFDictionary? 
             ) in 

             print("Notification name: \(name)") 
            }, 
            notificationName, 
            nil, 
            CFNotificationSuspensionBehavior.deliverImmediately) 

일부 링크 : https://github.com/choefele/CCHDarwinNotificationCenter

https://developer.apple.com/documentation/corefoundation/1542572-cfnotificationcentergetdarwinnot

https://developer.apple.com/library/content/documentation/Darwin/Conceptual/MacOSXNotifcationOv/DarwinNotificationConcepts/DarwinNotificationConcepts.html